47 static unsigned timerCallback(
unsigned interval,
void* param);
48 unsigned timerCallback2();
50 std::vector<Alarm*> alarms;
54 static volatile bool enabled;
59 volatile bool AlarmManager::enabled =
false;
61 AlarmManager::AlarmManager()
64 if (SDL_Init(SDL_INIT_TIMER) < 0) {
66 "Couldn't initialize SDL timer subsystem" <<
72 AlarmManager::~AlarmManager()
74 assert(alarms.empty());
90 assert(find(alarms.begin(), alarms.end(), &alarm) == alarms.end());
91 alarms.push_back(&alarm);
97 auto it = find(alarms.begin(), alarms.end(), &alarm);
98 assert(it != alarms.end());
102 static int convert(
int period)
104 return std::max(1, period / 1000);
110 alarm.period = period;
116 int64_t diff = time - alarm.time;
123 id = SDL_AddTimer(convert(period), timerCallback,
this);
128 id = SDL_AddTimer(convert(period), timerCallback,
this);
135 alarm.active =
false;
146 unsigned AlarmManager::timerCallback(
unsigned ,
void* param)
149 if (!enabled)
return 0;
151 return manager->timerCallback2();
154 unsigned AlarmManager::timerCallback2()
157 ScopedLock lock(sem);
160 int64_t earliest = std::numeric_limits<int64_t>::max();
161 for (
auto& a : alarms) {
166 int64_t left = a->time - now;
171 a->time += a->period;
172 left = a->time - now;
176 earliest = std::min(earliest, left);
182 earliest = std::min(earliest, left);
186 if (earliest != std::numeric_limits<int64_t>::max()) {
187 time = earliest + now;
191 for (
auto& a : alarms) {
192 assert(a->active ==
false); (void)a;
217 assert(!destructing);
224 manager.
start(*
this, newPeriod);