/*========================================================================== * * Copyright (C) 2000-2000 Microsoft Corporation. All Rights Reserved. * * File: JobQueue.h * Content: Job queue for thread pool * * History: * Date By Reason * ==== == ====== * 01/24/2000 jtk Created ***************************************************************************/ #ifndef __JOB_QUEUE_H__ #define __JOB_QUEUE_H__ #undef DPF_SUBCOMP #define DPF_SUBCOMP DN_SUBCOMP_MODEM //********************************************************************** // Constant definitions //********************************************************************** //********************************************************************** // Macro definitions //********************************************************************** //********************************************************************** // Structure definitions //********************************************************************** // // forward structure references // class CSocketPort; typedef enum _JOB_TYPE JOB_TYPE; typedef struct _THREAD_POOL_JOB THREAD_POOL_JOB; typedef void JOB_FUNCTION( THREAD_POOL_JOB *const pJobInfo ); // // structure for job to start monitoring a socket in Win9x // typedef struct { CSocketPort *pSocketPort; // pointer to associated socket port } DATA_ADD_SOCKET; // // structure for job to stop monitoring a socket in Win9x // typedef struct { CSocketPort *pSocketPort; // pointer to associated socket port } DATA_REMOVE_SOCKET; // // structure for job to connect // typedef struct { JOB_FUNCTION *pCommandFunction; // pointer to function for the command void *pContext; // user context (i.e. CModemEndpoint pointer) UINT_PTR uData; // user data } DATA_DELAYED_COMMAND; // // structure for job to refresh enums // typedef struct { UINT_PTR uDummy; // dummy variable to prevent compiler from whining } DATA_REFRESH_TIMED_JOBS; // // structure encompassing information for a job for the workhorse thread // typedef struct _THREAD_POOL_JOB { THREAD_POOL_JOB *pNext; // pointer to next job JOB_TYPE JobType; // type of job JOB_FUNCTION *pCancelFunction; // function for cancelling job // DWORD dwCommandID; // unique ID used to identify this command // FUNCTION *pProcessFunction; // function for performing job union { DATA_DELAYED_COMMAND JobDelayedCommand; DATA_REMOVE_SOCKET JobRemoveSocket; DATA_ADD_SOCKET JobAddSocket; DATA_REFRESH_TIMED_JOBS JobRefreshTimedJobs; } JobData; } THREAD_POOL_JOB; //********************************************************************** // Variable definitions //********************************************************************** //********************************************************************** // Function prototypes //********************************************************************** //********************************************************************** // Class prototypes //********************************************************************** // // class to encapsultate a job queue // class CJobQueue { public: BOOL Initialize( void ); void Deinitialize( void ); void Lock( void ) { DNEnterCriticalSection( &m_Lock ); } void Unlock( void ) { DNLeaveCriticalSection( &m_Lock ); } #undef DPF_MODNAME #define DPF_MODNAME "CJobQueue::GetPendingJobHandle" DNHANDLE GetPendingJobHandle( void ) const { DNASSERT( m_hPendingJob != NULL ); return m_hPendingJob; } BOOL SignalPendingJob( void ); BOOL IsEmpty( void ) const { return ( m_pQueueHead == NULL ); } void EnqueueJob( THREAD_POOL_JOB *const pJob ); THREAD_POOL_JOB *DequeueJob( void ); protected: private: #ifndef DPNBUILD_ONLYONETHREAD DNCRITICAL_SECTION m_Lock; // lock #endif // !DPNBUILD_ONLYONETHREAD THREAD_POOL_JOB *m_pQueueHead; // head of job queue THREAD_POOL_JOB *m_pQueueTail; // tail of job queue DNHANDLE m_hPendingJob; // event indicating a pending job // // prevent unwarranted copies // CJobQueue( const CJobQueue & ); CJobQueue& operator=( const CJobQueue & ); }; #undef DPF_MODNAME #endif // __JOB_QUEUE_H__