1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #ifndef RTSCHEDULER_HH
- #define RTSCHEDULER_HH
- #include "SchedulerQueue.hh"
- #include "Timer.hh"
- #include "likely.hh"
- #include <cstdint>
- namespace openmsx {
- class RTSchedulable;
- struct RTSyncPoint
- {
- uint64_t time;
- RTSchedulable* schedulable;
- };
- class RTScheduler
- {
- public:
- /** Execute all expired RTSchedulables. */
- inline void execute()
- {
- auto limit = Timer::getTime();
- if (!queue.empty() && unlikely(limit >= queue.front().time)) {
- scheduleHelper(limit); // slow path not inlined
- }
- }
- private:
- // These are called by RTSchedulable
- friend class RTSchedulable;
- void add(uint64_t delta, RTSchedulable& schedulable);
- bool remove(RTSchedulable& schedulable);
- bool isPending(const RTSchedulable& schedulable) const;
- private:
- void scheduleHelper(uint64_t limit);
- SchedulerQueue<RTSyncPoint> queue;
- };
- } // namespace openmsx
- #endif
|