18 #ifndef STDSCHEDULER_H
19 #define STDSCHEDULER_H
25 #define STDSCHEDULER_USE_EVENTS
26 #define HAVE_WINTHREAD
27 #define STDSCHEDULER_EVENT_MESSAGE INVALID_HANDLE_VALUE
29 #ifndef STDSCHEDULER_USE_EVENTS
37 #include <sys/select.h>
63 virtual bool Execute(
int iTimeout = -1, pollfd * readyfds =
nullptr) = 0;
69 #ifdef STDSCHEDULER_USE_EVENTS
70 virtual HANDLE GetEvent() {
return nullptr; }
72 virtual void GetFDs(std::vector<struct pollfd> &) { }
110 if (tTime < tLastTimer + iDelay)
return false;
112 int32_t iDrift = tTime - (tLastTimer + iDelay);
113 tLastTimer = tTime - std::min(iDrift, (int32_t) iDelay / 2);
120 return tLastTimer + iDelay;
149 #ifdef STDSCHEDULER_USE_EVENTS
153 HANDLE GetEvent()
override {
return Event.GetEvent(); }
162 void GetFDs(std::vector<struct pollfd> & checkfds)
override;
170 #ifdef STDSCHEDULER_USE_EVENTS
178 static int iTimePeriod;
179 uint32_t uCriticalTimerDelay;
181 UINT idCriticalTimer,uCriticalTimerResolution;
183 bool Check() {
return Event.
WaitFor(0); }
187 void SetDelay(uint32_t iDelay);
188 void Set() { Event.
Set(); }
192 HANDLE GetEvent()
override {
return Event.GetEvent(); }
196 #elif defined(HAVE_SYS_TIMERFD_H)
209 void SetDelay(uint32_t inDelay);
212 void GetFDs(std::vector<struct pollfd> & checkfds)
override;
216 #define CStdMultimediaTimerProc CStdTimerProc
228 std::vector<StdSchedulerProc*> procs;
229 bool isInManualLoop{
false};
234 public:
bool Execute(
int, pollfd *)
override { CheckAndReset();
return true; }
236 NoopNotifyProc Unblocker;
239 #ifdef STDSCHEDULER_USE_EVENTS
240 std::vector<HANDLE> eventHandles;
241 std::vector<StdSchedulerProc*> eventProcs;
285 #ifdef HAVE_WINTHREAD
287 #elif defined(HAVE_PTHREAD)
303 #ifdef HAVE_WINTHREAD
304 static void __cdecl _ThreadFunc(
void *);
305 #elif defined(HAVE_PTHREAD)
306 static void *_ThreadFunc(
void *);
308 unsigned int ThreadFunc();
315 bool fStarted{
false};
316 bool fStopSignaled{
false};
318 #ifdef HAVE_WINTHREAD
320 #elif defined(HAVE_PTHREAD)
342 #ifdef HAVE_WINTHREAD
343 static void __cdecl _ThreadFunc(
void *);
344 #elif defined(HAVE_PTHREAD)
345 static void *_ThreadFunc(
void *);
347 unsigned int ThreadFunc();
struct _GMainLoop GMainLoop
#define CStdMultimediaTimerProc
bool Execute(int, pollfd *) override
virtual void OnSec1Timer()=0
static C4TimeMilliseconds Now()
~CStdNotifyProc() override
void GetFDs(std::vector< struct pollfd > &checkfds) override
void SetDelay(uint32_t inDelay)
~CStdTimerProc() override
uint32_t TimerInterval() override
C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow) override
CStdTimerProc(uint32_t iDelay)
virtual void OnError(StdSchedulerProc *)
void Set(StdSchedulerProc **ppProcs, int iProcCnt)
bool ScheduleProcs(int iTimeout=1000/36)
virtual bool DoScheduleProcs(int iTimeout)
void Added(StdSchedulerProc *pProc)
void StartOnCurrentThread()
void Removing(StdSchedulerProc *pProc)
void Remove(StdSchedulerProc *pProc)
void Changed(StdSchedulerProc *pProc)
bool hasProc(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow)
virtual ~StdSchedulerProc()=default
StdSchedulerProc()=default
virtual bool IsLowPriority()
virtual C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow)
bool ExecuteUntil(int iTimeout=-1)
virtual uint32_t TimerInterval()
virtual void GetFDs(std::vector< struct pollfd > &)
virtual bool Execute(int iTimeout=-1, pollfd *readyfds=nullptr)=0
void Set(StdSchedulerProc **ppProcs, int iProcCnt)
void Remove(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
~StdSchedulerThread() override
virtual bool IsSelfDestruct()