Leaked source code of windows server 2003
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.
 
 
 
 
 
 

151 lines
4.3 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
thread_manager.hxx
Abstract:
Provides thread creation and cleanup management
Author:
Jeffrey Wall (jeffwall) 11-28-2000
Revision History:
--*/
#ifndef _THREADMANAGER_H_
#define _THREADMANAGER_H_
#include <thread_pool.h>
typedef void (WINAPI *PTHREAD_STOP_ROUTINE)(PVOID);
typedef PTHREAD_STOP_ROUTINE LPTHREAD_STOP_ROUTINE;
typedef BOOL (WINAPI *PTHREAD_DECISION_ROUTINE )(PVOID);
typedef PTHREAD_DECISION_ROUTINE LPTHREAD_DECISION_ROUTINE;
#define SIGNATURE_THREAD_MANAGER ((DWORD) 'NAMT')
#define SIGNATURE_THREAD_MANAGER_FREE ((DWORD) 'xAMT')
#define SIGNATURE_THREAD_PARAM ((DWORD) 'RAPT')
#define SIGNATURE_THREAD_PARAM_FREE ((DWORD) 'xAPT')
class THREAD_MANAGER
{
private:
DWORD m_dwSignature;
public:
static HRESULT CreateThreadManager(THREAD_MANAGER ** ppThreadManager,
THREAD_POOL * pPool,
THREAD_POOL_DATA * pPoolData);
VOID TerminateThreadManager(LPTHREAD_STOP_ROUTINE lpStopAddress,
LPVOID lpParameter);
BOOL CreateThread(LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter);
VOID RequestThread(LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpStartParameter);
private:
// use create and terminate
THREAD_MANAGER(THREAD_POOL * pPool,
THREAD_POOL_DATA * pPoolData);
~THREAD_MANAGER();
// not implemented
THREAD_MANAGER(const THREAD_MANAGER&);
THREAD_MANAGER& operator=(const THREAD_MANAGER&);
HRESULT Initialize();
VOID DrainThreads(LPTHREAD_STOP_ROUTINE lpStopAddress,
LPVOID lpParameter);
/*++
Struct Description:
Storage for parameters passed to ThreadManagerThread
Members:
pThreadFunc - thread function to call
pvThreadArg - arguments to pass to thread function
pThreadManager - pointer to ThreadManager associated with current thread
hThreadSelf - handle returned from call to CreateThread
dwRequestTime - time that thread request was made
--*/
struct THREAD_PARAM
{
THREAD_PARAM() :
dwSignature(SIGNATURE_THREAD_PARAM),
pThreadFunc(NULL),
pvThreadArg(NULL),
pThreadManager(NULL),
dwRequestTime(NULL),
fCallbackOnCreation(FALSE)
{
}
~THREAD_PARAM()
{
DBG_ASSERT(SIGNATURE_THREAD_PARAM == dwSignature);
dwSignature = SIGNATURE_THREAD_PARAM_FREE;
}
DWORD dwSignature;
LPTHREAD_START_ROUTINE pThreadFunc;
LPVOID pvThreadArg;
THREAD_MANAGER *pThreadManager;
DWORD dwRequestTime;
BOOL fCallbackOnCreation;
};
static DWORD ThreadManagerThread(LPVOID);
static VOID ControlTimerCallback(PVOID lpParameter,
BOOLEAN TimerOrWaitFired);
VOID DetermineThreadAction();
BOOL DoThreadCreation(THREAD_PARAM * pParam);
VOID CreatedSuccessfully(THREAD_PARAM * pParam);
VOID RemoveThread(THREAD_PARAM * pParam);
VOID DoThreadParking();
BOOL DoThreadUnParking();
static VOID ParkThread(DWORD dwErrorCode,
DWORD dwNumberOfBytesTransferred,
LPOVERLAPPED lpo);
CRITICAL_SECTION m_CriticalSection;
BOOL m_fShuttingDown;
BOOL m_fWaitingForCreationCallback;
HANDLE m_hTimer;
THREAD_PARAM *m_pParam;
ULONG m_ulContextSwitchCount;
LONG m_lTotalThreads;
LONG m_lParkedThreads;
HANDLE m_hParkEvent;
HANDLE m_hShutdownEvent;
THREAD_POOL *m_pPool;
THREAD_POOL_DATA *m_pPoolData;
LARGE_INTEGER m_liOriginalTotal;
LARGE_INTEGER m_liOriginalBusy;
};
#endif // _THREADMANAGER_H_