Added SDL_AddTimerNS()

This commit is contained in:
Sam Lantinga
2024-05-27 06:30:37 -07:00
parent b6360516e4
commit 99599d9236
6 changed files with 152 additions and 24 deletions

View File

@@ -30,7 +30,8 @@
typedef struct SDL_Timer
{
SDL_TimerID timerID;
SDL_TimerCallback callback;
SDL_TimerCallback callback_ms;
SDL_NSTimerCallback callback_ns;
void *userdata;
Uint64 interval;
Uint64 scheduled;
@@ -160,8 +161,11 @@ static int SDLCALL SDL_TimerThread(void *_data)
if (SDL_AtomicGet(&current->canceled)) {
interval = 0;
} else {
/* FIXME: We could potentially support sub-millisecond timers now */
interval = SDL_MS_TO_NS(current->callback(current->userdata, current->timerID, (Uint32)SDL_NS_TO_MS(current->interval)));
if (current->callback_ms) {
interval = SDL_MS_TO_NS(current->callback_ms(current->userdata, current->timerID, (Uint32)SDL_NS_TO_MS(current->interval)));
} else {
interval = current->callback_ns(current->userdata, current->timerID, current->interval);
}
}
if (interval > 0) {
@@ -269,7 +273,7 @@ void SDL_QuitTimers(void)
}
}
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
static SDL_TimerID SDL_CreateTimer(Uint64 interval, SDL_TimerCallback callback_ms, SDL_NSTimerCallback callback_ns, void *userdata)
{
SDL_TimerData *data = &SDL_timer_data;
SDL_Timer *timer;
@@ -298,9 +302,10 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
}
}
timer->timerID = SDL_GetNextObjectID();
timer->callback = callback;
timer->callback_ms = callback_ms;
timer->callback_ns = callback_ns;
timer->userdata = userdata;
timer->interval = SDL_MS_TO_NS(interval);
timer->interval = interval;
timer->scheduled = SDL_GetTicksNS() + timer->interval;
SDL_AtomicSet(&timer->canceled, 0);
@@ -329,6 +334,16 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
return entry->timerID;
}
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
{
return SDL_CreateTimer(SDL_MS_TO_NS(interval), callback, NULL, userdata);
}
SDL_TimerID SDL_AddTimerNS(Uint64 interval, SDL_NSTimerCallback callback, void *userdata)
{
return SDL_CreateTimer(interval, NULL, callback, userdata);
}
int SDL_RemoveTimer(SDL_TimerID id)
{
SDL_TimerData *data = &SDL_timer_data;
@@ -373,8 +388,9 @@ typedef struct SDL_TimerMap
{
SDL_TimerID timerID;
int timeoutID;
Uint32 interval;
SDL_TimerCallback callback;
Uint64 interval;
SDL_TimerCallback callback_ms;
SDL_NSTimerCallback callback_ns;
void *userdata;
struct SDL_TimerMap *next;
} SDL_TimerMap;
@@ -389,10 +405,14 @@ static SDL_TimerData SDL_timer_data;
static void SDL_Emscripten_TimerHelper(void *userdata)
{
SDL_TimerMap *entry = (SDL_TimerMap *)userdata;
entry->interval = entry->callback(entry->userdata, entry->timerID, entry->interval);
if (entry->callback_ms) {
entry->interval = SDL_MS_TO_NS(entry->callback_ms(entry->userdata, entry->timerID, (Uint32)SDL_NS_TO_MS(entry->interval)));
} else {
entry->interval = entry->callback_ns(entry->userdata, entry->timerID, entry->interval);
}
if (entry->interval > 0) {
entry->timeoutID = emscripten_set_timeout(&SDL_Emscripten_TimerHelper,
entry->interval,
SDL_NS_TO_MS(entry->interval),
entry);
}
}
@@ -414,7 +434,7 @@ void SDL_QuitTimers(void)
}
}
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
static SDL_TimerID SDL_CreateTimer(Uint64 interval, SDL_TimerCallback callback_ms, SDL_NSTimerCallback callback_ns, void *userdata)
{
SDL_TimerData *data = &SDL_timer_data;
SDL_TimerMap *entry;
@@ -424,12 +444,13 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
return 0;
}
entry->timerID = SDL_GetNextObjectID();
entry->callback = callback;
entry->callback_ms = callback_ms;
entry->callback_ns = callback_ns;
entry->userdata = userdata;
entry->interval = interval;
entry->timeoutID = emscripten_set_timeout(&SDL_Emscripten_TimerHelper,
entry->interval,
SDL_NS_TO_MS(entry->interval),
entry);
entry->next = data->timermap;
@@ -438,6 +459,16 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
return entry->timerID;
}
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
{
return SDL_CreateTimer(SDL_MS_TO_NS(interval), callback, NULL, userdata);
}
SDL_TimerID SDL_AddTimerNS(Uint64 interval, SDL_NSTimerCallback callback, void *userdata)
{
return SDL_CreateTimer(interval, NULL, callback, userdata);
}
int SDL_RemoveTimer(SDL_TimerID id)
{
SDL_TimerData *data = &SDL_timer_data;