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.
|
|
/***************************************************************************
* * Copyright (C) 2001 Microsoft Corporation. All Rights Reserved. * * File: dp8simjob.h * * Content: Header for job object class. * * History: * Date By Reason * ======== ======== ========= * 06/09/01 VanceO Created. * ***************************************************************************/
//=============================================================================
// Macros
//=============================================================================
#define DP8SIMJOB_FROM_BILINK(b) (CONTAINING_OBJECT(b, CDP8SimJob, m_blList))
//=============================================================================
// Private job flags
//=============================================================================
#define DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE 0x80000000 // this job is in its blocking phase
//=============================================================================
// Structures
//=============================================================================
typedef struct _DP8SIMJOB_FPMCONTEXT { DWORD dwTime; // time for the job to fire
DWORD dwNextDelay; // possible extra delay for the job after this first timer elapses
DWORD dwFlags; // flags describing this job
DP8SIMJOBTYPE JobType; // type of job
PVOID pvContext; // context for job
CDP8SimSP * pDP8SimSP; // owning SP object, if any
} DP8SIMJOB_FPMCONTEXT, * PDP8SIMJOB_FPMCONTEXT;
//=============================================================================
// Job object class
//=============================================================================
class CDP8SimJob { public:
inline BOOL IsValidObject(void) { if ((this == NULL) || (IsBadWritePtr(this, sizeof(CDP8SimJob)))) { return FALSE; }
if (*((DWORD*) (&this->m_Sig)) != 0x4a4d4953) // 0x4a 0x4d 0x49 0x53 = 'JMIS' = 'SIMJ' in Intel order
{ return FALSE; }
return TRUE; };
static BOOL FPMAlloc(void* pvItem, void* pvContext) { CDP8SimJob * pDP8SimJob = (CDP8SimJob*) pvItem;
pDP8SimJob->m_Sig[0] = 'S'; pDP8SimJob->m_Sig[1] = 'I'; pDP8SimJob->m_Sig[2] = 'M'; pDP8SimJob->m_Sig[3] = 'j'; // start with lower case so we can tell when it's in the pool or not
pDP8SimJob->m_blList.Initialize();
pDP8SimJob->m_dwTime = 0; pDP8SimJob->m_dwNextDelay = 0; pDP8SimJob->m_dwFlags = 0; pDP8SimJob->m_JobType = DP8SIMJOBTYPE_UNKNOWN; pDP8SimJob->m_pvContext = NULL; pDP8SimJob->m_pDP8SimSP = NULL;
return TRUE; }
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimJob::FPMInitialize"
static void FPMInitialize(void* pvItem, void* pvContext) { CDP8SimJob * pDP8SimJob = (CDP8SimJob*) pvItem; DP8SIMJOB_FPMCONTEXT * pContext = (DP8SIMJOB_FPMCONTEXT*) pvContext;
pDP8SimJob->m_dwTime = pContext->dwTime; pDP8SimJob->m_dwNextDelay = pContext->dwNextDelay; pDP8SimJob->m_dwFlags = pContext->dwFlags; pDP8SimJob->m_JobType = pContext->JobType; pDP8SimJob->m_pvContext = pContext->pvContext;
if (pContext->pDP8SimSP != NULL) { pContext->pDP8SimSP->AddRef(); pDP8SimJob->m_pDP8SimSP = pContext->pDP8SimSP; } else { DNASSERT(pDP8SimJob->m_pDP8SimSP == NULL); }
//
// Change the signature before handing it out.
//
pDP8SimJob->m_Sig[3] = 'J'; }
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimJob::FPMRelease"
static void FPMRelease(void* pvItem) { CDP8SimJob * pDP8SimJob = (CDP8SimJob*) pvItem;
DNASSERT(pDP8SimJob->m_blList.IsEmpty());
if (pDP8SimJob->m_pDP8SimSP != NULL) { pDP8SimJob->m_pDP8SimSP->Release(); pDP8SimJob->m_pDP8SimSP = NULL; }
//
// Change the signature before putting the object back in the pool.
//
pDP8SimJob->m_Sig[3] = 'j'; }
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimJob::FPMDealloc"
static void FPMDealloc(void* pvItem) { const CDP8SimJob * pDP8SimJob = (CDP8SimJob*) pvItem;
DNASSERT(pDP8SimJob->m_blList.IsEmpty()); DNASSERT(pDP8SimJob->m_pDP8SimSP == NULL); }
inline DWORD GetTime(void) const { return this->m_dwTime; }; inline DWORD GetNextDelay(void) const { return this->m_dwNextDelay; };
inline BOOL HasAnotherPhase(void) const { if (this->m_dwFlags & DP8SIMJOBFLAG_PERFORMBLOCKINGPHASEFIRST) { if (this->m_dwFlags & DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE) { return TRUE; } } else if (this->m_dwFlags & DP8SIMJOBFLAG_PERFORMBLOCKINGPHASELAST) { if (! (this->m_dwFlags & DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE)) { return TRUE; } }
return FALSE; };
//inline BOOL IsBlockedByAllJobs(void) { return ((this->m_dwFlags & DP8SIMJOBFLAG_BLOCKEDBYALLJOBS) ? TRUE : FALSE); };
inline BOOL IsInBlockingPhase(void) const { return ((this->m_dwFlags & DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE) ? TRUE : FALSE); }; inline DP8SIMJOBTYPE GetJobType(void) const { return this->m_JobType; }; inline PVOID GetContext(void) { return this->m_pvContext; }; inline CDP8SimSP * GetDP8SimSP(void) { return this->m_pDP8SimSP; };
inline void SetNewTime(const DWORD dwTime) { this->m_dwTime = dwTime; };
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimJob::ToggleBlockingPhase"
inline void ToggleBlockingPhase(void) { DNASSERT(this->m_dwFlags & (DP8SIMJOBFLAG_PERFORMBLOCKINGPHASEFIRST | DP8SIMJOBFLAG_PERFORMBLOCKINGPHASELAST)); if (this->m_dwFlags & DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE) { this->m_dwFlags &= ~DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE; } else { this->m_dwFlags |= DP8SIMJOBFLAG_PRIVATE_INBLOCKINGPHASE; } };
CBilink m_blList; // list of all the active jobs
private: BYTE m_Sig[4]; // debugging signature ('SIMJ')
DWORD m_dwTime; // time the job must be performed
DWORD m_dwNextDelay; // extra delay for the job after first time set
DWORD m_dwFlags; // flags describing this job
DP8SIMJOBTYPE m_JobType; /// ID of job to be performed
PVOID m_pvContext; // context for job
CDP8SimSP * m_pDP8SimSP; // pointer to DP8SimSP object submitting send, or NULL if none
};
|