mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.5 KiB
170 lines
3.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: U P T H R E A D . C P P
|
|
//
|
|
// Contents: Threading support code
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: mbend 29 Sep 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "upthread.h"
|
|
#include "ncbase.h"
|
|
|
|
CWorkItem::CWorkItem() : m_bDeleteOnComplete(FALSE)
|
|
{
|
|
}
|
|
|
|
CWorkItem::~CWorkItem()
|
|
{
|
|
}
|
|
|
|
HRESULT CWorkItem::HrStart(BOOL bDeleteOnComplete)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
m_bDeleteOnComplete = bDeleteOnComplete;
|
|
if(!QueueUserWorkItem(&CWorkItem::DwThreadProc, this, GetFlags()))
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CWorkItem::HrStart(%x)", this);
|
|
return hr;
|
|
}
|
|
|
|
ULONG CWorkItem::GetFlags()
|
|
{
|
|
return WT_EXECUTEDEFAULT;
|
|
}
|
|
|
|
DWORD WINAPI CWorkItem::DwThreadProc(void * pvParam)
|
|
{
|
|
CWorkItem * pWorkItem = reinterpret_cast<CWorkItem*>(pvParam);
|
|
DWORD dwRet = pWorkItem->DwRun();
|
|
if(pWorkItem->m_bDeleteOnComplete)
|
|
{
|
|
delete pWorkItem;
|
|
}
|
|
return dwRet;
|
|
}
|
|
|
|
CThreadBase::CThreadBase() : m_bDeleteOnComplete(FALSE), m_hThread(NULL), m_dwThreadId(0)
|
|
{
|
|
}
|
|
|
|
CThreadBase::~CThreadBase()
|
|
{
|
|
if(m_hThread)
|
|
{
|
|
CloseHandle(m_hThread);
|
|
m_hThread = NULL;
|
|
}
|
|
}
|
|
|
|
HRESULT CThreadBase::HrStart(BOOL bDeleteOnComplete, BOOL bCreateSuspended)
|
|
{
|
|
Assert(!m_hThread);
|
|
HRESULT hr = S_OK;
|
|
|
|
m_bDeleteOnComplete = bDeleteOnComplete;
|
|
|
|
m_hThread = CreateThread(NULL, 0, &CThreadBase::DwThreadProc, this, bCreateSuspended ? CREATE_SUSPENDED : 0, &m_dwThreadId);
|
|
|
|
if(!m_hThread)
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CThreadBase::HrStart(%x)", this);
|
|
return hr;
|
|
}
|
|
|
|
DWORD WINAPI CThreadBase::DwThreadProc(void * pvParam)
|
|
{
|
|
CThreadBase * pThread = reinterpret_cast<CThreadBase*>(pvParam);
|
|
TraceTag(ttidUPnPBase, "CThreadBase(this=%x, id=%x) - thread started", pThread, pThread->m_dwThreadId);
|
|
DWORD dwRet = pThread->DwRun();
|
|
if(pThread->m_bDeleteOnComplete)
|
|
{
|
|
delete pThread;
|
|
}
|
|
return dwRet;
|
|
}
|
|
|
|
HRESULT CThreadBase::HrGetExitCodeThread(DWORD * pdwExitCode)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(!GetExitCodeThread(m_hThread, pdwExitCode))
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CThreadBase::HrGetExitCodeThread");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CThreadBase::HrResumeThread()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(-1 == ResumeThread(m_hThread))
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CThreadBase::HrResumeThread");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CThreadBase::HrSuspendThread()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(-1 == SuspendThread(m_hThread))
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CThreadBase::HrSuspendThread");
|
|
return hr;
|
|
}
|
|
|
|
HANDLE CThreadBase::GetThreadHandle()
|
|
{
|
|
return m_hThread;
|
|
}
|
|
|
|
DWORD CThreadBase::GetThreadId()
|
|
{
|
|
return m_dwThreadId;
|
|
}
|
|
|
|
HRESULT CThreadBase::HrWait(DWORD dwTimeoutInMillis, BOOL * pbTimedOut)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DWORD dwRet = WaitForSingleObject(m_hThread, dwTimeoutInMillis);
|
|
|
|
if(WAIT_TIMEOUT == dwRet)
|
|
{
|
|
hr = S_FALSE;
|
|
TraceTag(ttidUPnPBase, "CThreadBase::HrWait(this=%x, id=%x) - timed out", this, m_dwThreadId);
|
|
}
|
|
else if(WAIT_FAILED == dwRet)
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CThreadBase::HrWait");
|
|
return hr;
|
|
}
|
|
|