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.
 
 
 
 
 
 

227 lines
6.3 KiB

/***************************************************************************
*
* 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
};