mirror of https://github.com/bsnes-emu/bsnes.git
62 lines
1.3 KiB
C++
62 lines
1.3 KiB
C++
#pragma once
|
|
|
|
namespace Emulator {
|
|
|
|
struct Thread {
|
|
enum : uintmax { Second = (uintmax)-1 >> 1 };
|
|
|
|
virtual ~Thread() {
|
|
if(_handle) co_delete(_handle);
|
|
}
|
|
|
|
inline auto active() const { return co_active() == _handle; }
|
|
inline auto handle() const { return _handle; }
|
|
inline auto frequency() const { return _frequency; }
|
|
inline auto scalar() const { return _scalar; }
|
|
inline auto clock() const { return _clock; }
|
|
|
|
auto setHandle(cothread_t handle) -> void {
|
|
_handle = handle;
|
|
}
|
|
|
|
auto setFrequency(double frequency) -> void {
|
|
_frequency = frequency + 0.5;
|
|
_scalar = Second / _frequency;
|
|
}
|
|
|
|
auto setScalar(uintmax scalar) -> void {
|
|
_scalar = scalar;
|
|
}
|
|
|
|
auto setClock(uintmax clock) -> void {
|
|
_clock = clock;
|
|
}
|
|
|
|
auto create(auto (*entrypoint)() -> void, double frequency) -> void {
|
|
if(_handle) co_delete(_handle);
|
|
_handle = co_create(64 * 1024 * sizeof(void*), entrypoint);
|
|
setFrequency(frequency);
|
|
setClock(0);
|
|
}
|
|
|
|
inline auto step(uint clocks) -> void {
|
|
_clock += _scalar * clocks;
|
|
}
|
|
|
|
auto serialize(serializer& s) -> void {
|
|
s.integer(_frequency);
|
|
s.integer(_scalar);
|
|
s.integer(_clock);
|
|
}
|
|
|
|
protected:
|
|
cothread_t _handle = nullptr;
|
|
uintmax _frequency = 0;
|
|
uintmax _scalar = 0;
|
|
uintmax _clock = 0;
|
|
|
|
friend class Scheduler;
|
|
};
|
|
|
|
}
|