//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: wkstore.h // // Contents: // // History: // //--------------------------------------------------------------------------- #ifndef __WORKSTORAGE_H__ #define __WORKSTORAGE_H__ #include "tlsjob.h" //-------------------------------------------------------------- // // Work Object initialization function, each work object // must supply its own initialization routine to work // manager. // typedef CWorkObject* (WINAPI *PWorkObjectInitFunc)( CWorkManager* pWkMgr, PBYTE pbInitData, DWORD cbInitData ); typedef void (WINAPI *PWorkObjectDeleteFunc)(CWorkObject* ptr); //------------------------------------------------------ // // Work object initialization routine // typedef struct _WorkObjectInitFunc { DWORD m_WorkType; PWorkObjectInitFunc m_WorkInitFunc; } WORKOBJECTINITFUNC; typedef enum { WORKITEM_ADD=1, WORKITEM_BEGINPROCESSING, WORKITEM_RESCHEDULE, WORKITEM_DELETE } WORKITEM_OPERATION; class CPersistentWorkStorage : public CWorkStorage { private: DWORD m_dwStartupTime; CSafeCounter m_dwNumJobs; CSafeCounter m_dwJobsInProcesssing; // // m_hNextJobLock guard ... // CCriticalSection m_hTableLock; CSafeCounter m_dwNextJobTime; CWorkObject* m_pNextWorkObject; //PBYTE m_pbCurrentBookmark; //DWORD m_cbCurrentBookmark; // // Table must be updatable, // WorkItemTable* m_pWkItemTable; void UpdateNextJobTime(DWORD dwTime) { m_dwNextJobTime=dwTime; } DWORD StartupUpdateExistingJobTime(); // // // BOOL ReturnJobToQueue( IN DWORD dwTime, IN CWorkObject* ptr ); // // // BOOL DeleteErrorJob( IN CWorkObject* ptr ); BOOL UpdateJobEntry( IN WorkItemTable* pTable, IN PBYTE pbBookmark, IN DWORD cbBoolmark, IN WORKITEMRECORD& wkItem ); BOOL AddJobEntry( IN WorkItemTable* pTable, IN WORKITEMRECORD& wkItem ); BOOL DeleteJobEntry( IN WorkItemTable* pTable, IN PBYTE pbBookmark, IN DWORD cbBookmark, IN WORKITEMRECORD& wkItem ); BOOL UpdateWorkItemEntry( IN WorkItemTable* pTable, IN WORKITEM_OPERATION opCode, IN PBYTE pbBookmark, IN DWORD cbBookmark, IN DWORD dwRestartTime, IN DWORD dwTime, IN DWORD dwJobType, IN PBYTE pbJobData, IN DWORD cbJobData ); BOOL IsValidWorkObject( CWorkObject* ptr ); DWORD GetCurrentBookmarkEx( IN WorkItemTable* pTable, IN OUT PBYTE* ppbData, IN OUT PDWORD pcbData ); DWORD GetCurrentBookmark( IN WorkItemTable* pTable, IN PBYTE ppbData, IN OUT PDWORD pcbData ); DWORD SetCurrentBookmark( IN WorkItemTable* pTable, IN PBYTE pbData, IN DWORD cbData ); BOOL RescheduleJob( CWorkObject* ptr ); CWorkObject* GetCurrentJob( PDWORD pdwTime ); DWORD FindNextJob(); CWorkObject* InitializeWorkObject( DWORD dwWorkType, PBYTE pbData, DWORD cbData ); BOOL DeleteWorkObject( CWorkObject* ptr ); public: CPersistentWorkStorage( WorkItemTable* pUpdateWkItemTable = NULL ); ~CPersistentWorkStorage(); //-------------------------------------------------------- BOOL AttachTable( IN WorkItemTable* pWkTable ) /*++ --*/ { if(pWkTable != NULL) { m_pWkItemTable = pWkTable; } else { SetLastError(ERROR_INVALID_PARAMETER); } return pWkTable != NULL; } //-------------------------------------------------------- BOOL IsGood(); //-------------------------------------------------------- virtual BOOL Startup( IN CWorkManager* pWkMgr ); //-------------------------------------------------------- virtual BOOL Shutdown(); //-------------------------------------------------------- virtual BOOL AddJob( DWORD dwJobTime, CWorkObject* ptr ); //-------------------------------------------------------- virtual DWORD GetNextJobTime(); //-------------------------------------------------------- virtual CWorkObject* GetNextJob( PDWORD pdwTime ); //-------------------------------------------------------- virtual BOOL EndProcessingJob( IN ENDPROCESSINGJOB_CODE opCode, IN DWORD dwOriginalTime, IN CWorkObject* ptr ); //-------------------------------------------------------- virtual DWORD GetNumJobs() { return m_dwNumJobs; } //------------------------------------------------------- virtual BOOL BeginProcessingJob( CWorkObject* pJob ); }; #endif