/****************************************************************************** * * Copyright (C) 2001-2002 Microsoft Corporation. All Rights Reserved. * * File: threadpoolapi.h * * Content: DirectPlay Thread Pool API implementation header file. * * History: * Date By Reason * ======== ======== ========= * 11/02/01 VanceO Created. * ******************************************************************************/ #ifndef __THREADPOOLAPI_H__ #define __THREADPOOLAPI_H__ //============================================================================= // Macros //============================================================================= #ifdef DPNBUILD_ONLYONEPROCESSOR #define NUM_CPUS(pDPTPObject) 1 #define WORKQUEUE_FOR_CPU(pDPTPObject, dwCPUNum) (&(pDPTPObject)->WorkQueue) #else // ! DPNBUILD_ONLYONEPROCESSOR #define NUM_CPUS(pDPTPObject) (pDPTPObject)->dwNumCPUs #define WORKQUEUE_FOR_CPU(pDPTPObject, dwCPUNum) (pDPTPObject)->papCPUWorkQueues[dwCPUNum] #endif // ! DPNBUILD_ONLYONEPROCESSOR //============================================================================= // Thread pool interface object flags //============================================================================= #define DPTPOBJECTFLAG_USER_INITIALIZED 0x00000001 // the user interface has been initialized #define DPTPOBJECTFLAG_USER_DOINGWORK 0x00000002 // the user interface is currently calling the DoWork method #ifndef DPNBUILD_NOPARAMVAL #define DPTPOBJECTFLAG_USER_PARAMVALIDATION 0x00008000 // the user interface should perform parameter validation #endif // ! DPNBUILD_NOPARAMVAL #ifndef DPNBUILD_ONLYONETHREAD #define DPTPOBJECTFLAG_THREADCOUNTCHANGING 0x00010000 // threads are currently being added or removed #endif // ! DPNBUILD_ONLYONETHREAD //============================================================================= // Thread pool interface object //============================================================================= typedef struct _DPTHREADPOOLOBJECT { #ifdef DPNBUILD_LIBINTERFACE // // For lib interface builds, the interface Vtbl and refcount are embedded // in the object itself. // LPVOID lpVtbl; // must be first entry in structure #if ((! defined(DPNBUILD_ONLYONETHREAD)) || (defined(DPNBUILD_MULTIPLETHREADPOOLS))) LONG lRefCount; // reference count for object #endif // ! DPNBUILD_ONLYONETHREAD or DPNBUILD_MULTIPLETHREADPOOLS #endif // DPNBUILD_LIBINTERFACE BYTE Sig[4]; // debugging signature ('DPTP') DWORD dwFlags; // flags describing this thread pool object #ifdef DPNBUILD_ONLYONEPROCESSOR DPTPWORKQUEUE WorkQueue; // work queue structure for only CPU #else // ! DPNBUILD_ONLYONEPROCESSOR DWORD dwNumCPUs; // number of CPUs in this machine DPTPWORKQUEUE ** papCPUWorkQueues; // pointer to array of work queue structure pointers for each CPU DWORD dwCurrentCPUSelection; // current CPU selection for items that can be run on any processor #endif // ! DPNBUILD_ONLYONEPROCESSOR #ifdef DPNBUILD_ONLYONETHREAD DWORD dwWorkRecursionCount; // how many times DoWork, WaitWhileWorking, or SleepWhileWorking have been recursively called #else // ! DPNBUILD_ONLYONETHREAD DWORD dwTotalUserThreadCount; // the sum of what the user requested for thread counts for all processors, or -1 if unknown DWORD dwTotalDesiredWorkThreadCount; // the maximum number of threads requested via the work interface, or -1 if unknown DWORD dwWorkRecursionCountTlsIndex; // Thread Local Storage index for storing the Work recursion count for non-worker threads LONG lNumThreadCountChangeWaiters; // number of threads waiting for an existing thread to complete its thread count change DNHANDLE hThreadCountChangeComplete; // semaphore to be signalled when the existing thread completes the thread count change #endif // ! DPNBUILD_ONLYONETHREAD #if ((! defined(DPNBUILD_ONLYONETHREAD)) || (! defined(DPNBUILD_NOPARAMVAL))) DWORD dwCurrentDoWorkThreadID; // ID of the current thread inside DoWork #endif // ! DPNBUILD_ONLYONETHREAD or ! DPNBUILD_NOPARAMVAL #ifndef DPNBUILD_ONLYONETHREAD DNCRITICAL_SECTION csLock; // lock protecting this object #ifdef DPNBUILD_MANDATORYTHREADS DWORD dwMandatoryThreadCount; // number of mandatory threads currently active #ifdef DBG CBilink blMandatoryThreads; // list of mandatory threads that are currently active #endif // DBG #endif // DPNBUILD_MANDATORYTHREADS #endif // !DPNBUILD_ONLYONETHREAD } DPTHREADPOOLOBJECT, * PDPTHREADPOOLOBJECT; //============================================================================= // Interface functions //============================================================================= #if ((! defined(DPNBUILD_ONLYONETHREAD)) || (! defined(DPNBUILD_LIBINTERFACE))) // // IDirectPlay8ThreadPool // STDMETHODIMP DPTP_Initialize(IDirectPlay8ThreadPool * pInterface, PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags); STDMETHODIMP DPTP_Close(IDirectPlay8ThreadPool * pInterface, const DWORD dwFlags); STDMETHODIMP DPTP_GetThreadCount(IDirectPlay8ThreadPool * pInterface, const DWORD dwProcessorNum, DWORD * const pdwNumThreads, const DWORD dwFlags); STDMETHODIMP DPTP_SetThreadCount(IDirectPlay8ThreadPool * pInterface, const DWORD dwProcessorNum, const DWORD dwNumThreads, const DWORD dwFlags); #endif // ! DPNBUILD_ONLYONETHREAD or ! DPNBUILD_LIBINTERFACE #ifdef DPNBUILD_LIBINTERFACE STDMETHODIMP DPTP_DoWork(const DWORD dwAllowedTimeSlice, const DWORD dwFlags); #else // ! DPNBUILD_LIBINTERFACE STDMETHODIMP DPTP_DoWork(IDirectPlay8ThreadPool * pInterface, const DWORD dwAllowedTimeSlice, const DWORD dwFlags); #endif // ! DPNBUILD_LIBINTERFACE // // IDirectPlay8ThreadPoolWork // STDMETHODIMP DPTPW_QueueWorkItem(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, const PFNDPTNWORKCALLBACK pfnWorkCallback, PVOID const pvCallbackContext, const DWORD dwFlags); STDMETHODIMP DPTPW_ScheduleTimer(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, const DWORD dwDelay, const PFNDPTNWORKCALLBACK pfnWorkCallback, PVOID const pvCallbackContext, void ** const ppvTimerData, UINT * const puiTimerUnique, const DWORD dwFlags); STDMETHODIMP DPTPW_StartTrackingFileIo(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, const HANDLE hFile, const DWORD dwFlags); STDMETHODIMP DPTPW_StopTrackingFileIo(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, const HANDLE hFile, const DWORD dwFlags); STDMETHODIMP DPTPW_CreateOverlapped(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, const PFNDPTNWORKCALLBACK pfnWorkCallback, PVOID const pvCallbackContext, OVERLAPPED ** const ppOverlapped, const DWORD dwFlags); STDMETHODIMP DPTPW_SubmitIoOperation(IDirectPlay8ThreadPoolWork * pInterface, OVERLAPPED * const pOverlapped, const DWORD dwFlags); STDMETHODIMP DPTPW_ReleaseOverlapped(IDirectPlay8ThreadPoolWork * pInterface, OVERLAPPED * const pOverlapped, const DWORD dwFlags); STDMETHODIMP DPTPW_CancelTimer(IDirectPlay8ThreadPoolWork * pInterface, void * const pvTimerData, const UINT uiTimerUnique, const DWORD dwFlags); STDMETHODIMP DPTPW_ResetCompletingTimer(IDirectPlay8ThreadPoolWork * pInterface, void * const pvTimerData, const DWORD dwNewDelay, const PFNDPTNWORKCALLBACK pfnNewWorkCallback, PVOID const pvNewCallbackContext, UINT * const puiNewTimerUnique, const DWORD dwFlags); STDMETHODIMP DPTPW_WaitWhileWorking(IDirectPlay8ThreadPoolWork * pInterface, const HANDLE hWaitObject, const DWORD dwFlags); STDMETHODIMP DPTPW_SleepWhileWorking(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwTimeout, const DWORD dwFlags); STDMETHODIMP DPTPW_RequestTotalThreadCount(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwNumThreads, const DWORD dwFlags); STDMETHODIMP DPTPW_GetThreadCount(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwCPU, DWORD * const pdwNumThreads, const DWORD dwFlags); STDMETHODIMP DPTPW_GetWorkRecursionDepth(IDirectPlay8ThreadPoolWork * pInterface, DWORD * const pdwDepth, const DWORD dwFlags); STDMETHODIMP DPTPW_Preallocate(IDirectPlay8ThreadPoolWork * pInterface, const DWORD dwNumWorkItems, const DWORD dwNumTimers, const DWORD dwNumIoOperations, const DWORD dwFlags); #ifdef DPNBUILD_MANDATORYTHREADS STDMETHODIMP DPTPW_CreateMandatoryThread(IDirectPlay8ThreadPoolWork * pInterface, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, LPDWORD lpThreadId, HANDLE *const phThread, const DWORD dwFlags); #endif // DPNBUILD_MANDATORYTHREADS #endif // __THREADPOOLAPI_H__