windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/upssvc/apcsmart/thrdable.h

94 lines
2.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
*
* NOTES:
*
* REVISIONS:
* ane12Jan93: made Threadable an updateable object
* pcy04Mar93: spilt off from thread. thrdable is not OS specific.
* rct17May93: added IsA() method
* cad19May93: defined IsA() to default (tired of fixing children)
* cad09Jul93: using new semaphores
* cad07Oct93: Made methods virtual
* rct16Nov93: Added single thread implementation
* cad11Jan94: Changes for new process manager
* ajr02May95: Need to stop carrying time in milliseconds
*/
#ifndef _THRDABLE_H
#define _THRDABLE_H
#include "_defs.h"
_CLASSDEF(Threadable)
#include "apc.h"
#include "update.h"
#include "semaphor.h"
/* const LONG DEFAULT_SERVICE_PERIOD = 10000L; // Ten Seconds */
/* const ULONG THREAD_EXIT_TIMEOUT = 1000L; */
const LONG DEFAULT_SERVICE_PERIOD = 10; // Ten Seconds
const ULONG THREAD_EXIT_TIMEOUT = 1; // one second;
const INT MAX_THREAD_NAME = 32;
class Threadable : public UpdateObj {
protected:
PSemaphore theResumeFlag;
PSemaphore theExitSem;
PSemaphore theExitDoneSem;
CHAR theThreadName[MAX_THREAD_NAME+1];
#ifdef SINGLETHREADED
ULONG theServicePeriod;
ULONG theLastPeriod;
ULONG theNextPeriod;
#endif
INT ExitNow();
INT DoneExiting();
public:
Threadable ();
virtual ~Threadable ();
virtual VOID ThreadMain () = 0;
virtual VOID SetThreadName(PCHAR aName);
virtual PCHAR GetThreadName(VOID);
#ifdef SINGLETHREADED
virtual ULONG GetServicePeriod() const;
virtual VOID SetServicePeriod(ULONG period = DEFAULT_SERVICE_PERIOD);
virtual ULONG GetLastPeriod(void);
virtual VOID SetLastPeriod(ULONG period = 0L);
virtual ULONG GetNextPeriod(void);
virtual VOID SetNextPeriod(ULONG period = 0L);
#endif
virtual INT Wait () {return theResumeFlag->Wait();};
virtual INT Release () {return theResumeFlag->Pulse();};
virtual INT Exit();
virtual INT ExitWait();
#if (C_OS & C_NLM)
virtual SLONG TimedWait(SLONG msDelay) { return theResumeFlag->TimedWait(msDelay); };
#else
virtual INT TimedWait(INT msDelay) { return theResumeFlag->TimedWait(msDelay); };
#endif
virtual INT Equal(RObj anObj) const { return ((PObj) this == &anObj); };
virtual INT Reset();
};
#endif