windows-nt/Source/XPSP1/NT/admin/services/sched/inc/runobj.hxx
2020-09-26 16:20:57 +08:00

268 lines
9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: runobj.hxx
//
// Contents: CRun class definition.
//
// Classes: CRun
//
// Functions: None.
//
// History: 08-Sep-95 EricB Created.
// 01-Dec-95 MarkBl Split from util.hxx.
//
//----------------------------------------------------------------------------
#ifndef __RUNOBJ_HXX__
#define __RUNOBJ_HXX__
//#include "time.hxx"
#undef SetFlag
#undef ClearFlag
#undef IsFlagSet
//
// Run processing flags: values 0x00010000 through 0x80000000 for run state:
//
#define RUN_STATUS_RUNNING 0x00010000
#define RUN_STATUS_FINISHED 0x00020000
#define RUN_STATUS_ABORTED 0x00040000
#define RUN_STATUS_TIMED_OUT 0x00080000
#define RUN_STATUS_CLOSE_PENDING 0x00100000
#define RUN_STATUS_CLOSED 0x00200000 // (This is set, but not used yet)
#define RUN_STATUS_RESTART_ON_IDLE_RESUME 0x00400000
//+----------------------------------------------------------------------------
//
// Class: CRun
//
// Synopsis: Lightweight job object. A moniker of sorts to the real thing.
// Represents one run instance of a job.
//
// CODEWORK: (AnirudhS 11/7/96) The inheritance relationship should be:
// class CRun : protected CDLink (instead of public CDLink)
// class CRunList : private CRun (instead of having a private CRun member)
// This would assure us that only CRunList could call CRun's CDLink methods.
//
//-----------------------------------------------------------------------------
class CRun : public CDLink
{
public:
CRun(LPFILETIME pft, LPFILETIME pftDeadline, FILETIME ftKill,
DWORD MaxRunTime, DWORD rgFlags, WORD wIdleWait,
BOOL fKeepAfterRunning);
CRun(DWORD MaxRunTime, DWORD rgFlags, FILETIME ftDeadline,
BOOL fKeepAfterRunning);
CRun(DWORD MaxRunTime, DWORD rgFlags, WORD wIdleWait,
FILETIME ftDeadline, BOOL fKeepAfterRunning);
CRun(CRun * pRun);
CRun(void);
~CRun();
HRESULT Initialize(LPCTSTR ptszName) {
return(this->SetName(ptszName));
}
void GetSysTime(LPSYSTEMTIME pst) {FileTimeToSystemTime(&m_ft, pst);}
void GetTime(LPFILETIME pft) {*pft = m_ft;}
LPFILETIME GetTime(void) {return &m_ft;}
LPFILETIME GetDeadline(void) {return &m_ftDeadline;}
void RelaxDeadline(FILETIME ftDeadline)
{ if (CompareFileTime(&ftDeadline, &m_ftDeadline) > 0)
m_ftDeadline = ftDeadline; }
WORD GetWait(void) {return m_wIdleWait;}
void ReduceWaitTo(WORD wIdleWait) { m_wIdleWait = min(m_wIdleWait, wIdleWait);}
FILETIME GetKillTime() { return m_ftKill; }
void AdvanceKillTime(FILETIME ftKill)
{ if (CompareFileTime(&ftKill, &m_ftKill) < 0)
m_ftKill = ftKill; }
void AdjustKillTimeByMaxRunTime(FILETIME ftNow);
void SetMaxRunTime(DWORD dwMaxRunTime) {m_dwMaxRunTime = dwMaxRunTime;}
DWORD GetMaxRunTime(void) {return(m_dwMaxRunTime);}
CRun * Next(void) { return (CRun *)CDLink::Next(); }
CRun * Prev(void) { return (CRun *)CDLink::Prev(); }
BOOL IsNull(void) {return(m_ft.dwLowDateTime == 0 &&
m_ft.dwHighDateTime == 0);};
HRESULT SetName(LPCTSTR ptszName);
LPTSTR GetName(void) { return m_ptszJobName; }
void SetHandle(HANDLE hJob) {
m_hJob = hJob;
this->SetFlag(RUN_STATUS_RUNNING);
}
HANDLE GetHandle(void) const { return(m_hJob); }
#if !defined(_CHICAGO_)
void SetProfileHandles(HANDLE hUser, HANDLE hProfile) {
m_hUserToken = hUser;
m_hProfile = hProfile;
}
HRESULT SetDesktop( LPCTSTR ptszDesktop );
LPTSTR GetDesktop( void ) {
return m_ptszDesktop;
}
HRESULT SetStation( LPCTSTR ptszStation );
LPTSTR GetStation( void ) {
return m_ptszStation;
}
#endif // !defined(_CHICAGO_)
void SetFlag(DWORD rgFlag) { m_rgFlags |= rgFlag; }
void ClearFlag(DWORD rgFlag) { m_rgFlags &= ~rgFlag; }
DWORD GetFlags(void) { return(m_rgFlags); }
BOOL IsFlagSet(DWORD rgFlag) {return (m_rgFlags & rgFlag);}
BOOL IsIdleTriggered() { return m_fKeepInList; }
void SetProcessId(DWORD dwProcessId) { m_dwProcessId = dwProcessId; }
DWORD GetProcessId(void) { return(m_dwProcessId); }
private:
FILETIME m_ft; // When this instance is to run
FILETIME m_ftDeadline; // Latest time when this instance may be started
FILETIME m_ftKill; // Time by which this instance must terminate
// (see the detailed comment on this field in
// procssr.cxx)
LPTSTR m_ptszJobName; // Job name.
HANDLE m_hJob; // The process handle when run
DWORD m_dwProcessId; // The process ID when run
#if !defined(_CHICAGO_)
HANDLE m_hUserToken; // User token
HANDLE m_hProfile; // User profile
LPTSTR m_ptszDesktop; //Windows Desktop
LPTSTR m_ptszStation; //WindowsStation
#endif // !defined(_CHICAGO_)
DWORD m_rgFlags; // Job Flags
DWORD m_dwMaxRunTime; // The remaining time to wait for the job to
// terminate (see the detailed comment on this
// field in procssr.cxx)
WORD m_wIdleWait; // The idle wait to determine when to run
// idle tasks.
BOOL m_fKeepInList; // Whether to keep this run in the idle list
// after starting it (set for jobs with idle
// triggers)
public:
BOOL m_fStarted; // Whether the run was started since the last
// idle period began
};
//+----------------------------------------------------------------------------
//
// Run object list class
//
//-----------------------------------------------------------------------------
class CRunList
{
public:
CRunList();
~CRunList();
void FreeList(void);
CRun * GetFirstJob(void) {return m_RunHead.Next();}
BOOL IsEmpty() {return m_RunHead.Next() == &m_RunHead;}
//
// The following members allow the list to be used as a simple, unsorted,
// (doubly) linked list.
//
void Add(CRun * pRun);
HRESULT AddCopy(CRun * pRun);
protected:
CRun m_RunHead;
};
class CTimeRunList : private CRunList
{
public:
void FreeList(void) {CRunList::FreeList();}
CRun * GetFirstJob(void) {return CRunList::GetFirstJob();}
BOOL IsEmpty() {return CRunList::IsEmpty();}
//
// The following members allow the list to be used as a sorted queue:
//
HRESULT AddSorted(FILETIME ftRun, FILETIME ftDeadline,
FILETIME ftKillTime,
LPTSTR ptszJobName, DWORD dwJobFlags,
DWORD dwMaxRunTime, WORD wIdleWait,
WORD * pCount, WORD cLimit);
CRun * Pop(void);
HRESULT PeekHeadTime(LPFILETIME pft);
HRESULT MakeSysTimeArray(LPSYSTEMTIME *, WORD *);
};
class CIdleRunList : private CRunList
{
public:
void FreeList(void);
CRun * GetFirstJob(void) {return CRunList::GetFirstJob();}
//
// The following members allow the list to be used as a sorted queue,
// sorted on idle wait times. The member at the head of the queue has
// the least idle wait time.
//
void AddSortedByIdleWait(CRun * pRun);
WORD GetFirstWait(void);
void MarkNoneStarted(void);
void FreeExpiredOrRegenerated();
};
//+----------------------------------------------------------------------------
//
// Method: CRunList::CRunList
//
// Synopsis: Constructor
//
//-----------------------------------------------------------------------------
inline CRunList::CRunList(void)
{
//
// Set the head node to point to itself. Note that the head node uses
// the default ctor which sets the FILETIME member to {0, 0}. This null
// FILETIME will be used as a marker for the head of the doubly linked
// list.
//
m_RunHead.SetNext(&m_RunHead);
m_RunHead.SetPrev(&m_RunHead);
}
//+----------------------------------------------------------------------------
//
// Method: CRunList::CRunList
//
// Synopsis: Destructor
//
//-----------------------------------------------------------------------------
inline CRunList::~CRunList(void)
{
FreeList();
}
//+----------------------------------------------------------------------------
//
// Member: CRunList::Add
//
// Synopsis: Add an element to the unsorted list.
//
//-----------------------------------------------------------------------------
inline void
CRunList::Add(CRun * pAdd)
{
pAdd->LinkAfter(&m_RunHead);
}
#endif // __RUNOBJ_HXX__