diff options
Diffstat (limited to 'src/common/backend.c')
| -rw-r--r-- | src/common/backend.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/common/backend.c b/src/common/backend.c index ad4d908..4c755bd 100644 --- a/src/common/backend.c +++ b/src/common/backend.c @@ -1,4 +1,5 @@ #include "backend.h" +#include "loop.h" #include <errno.h> #include <stdlib.h> @@ -369,6 +370,15 @@ yasl_timer_id yasl_surface_add_timer(struct yasl_surface *s, uint64_t interval_n yasl_timer_id id = yasl_loop_add_timer(s->display->loop, interval_ns, cb, ud); if (!id) return 0; + /* A one-shot timer retires itself in the loop. Drop retired ids before + * the list grows, so the list holds only armed timers. */ + if (s->timer_count >= s->timer_capacity) { + int kept = 0; + for (int i = 0; i < s->timer_count; i++) + if (yasl_loop_timer_armed(s->display->loop, s->timers[i])) + s->timers[kept++] = s->timers[i]; + s->timer_count = kept; + } if (s->timer_count >= s->timer_capacity) { int new_cap = s->timer_capacity ? s->timer_capacity * 2 : 4; yasl_timer_id *nt = realloc(s->timers, (size_t)new_cap * sizeof(*nt)); @@ -388,10 +398,8 @@ bool yasl_surface_del_timer(struct yasl_surface *s, yasl_timer_id id) if (!s || id == 0) return false; for (int i = 0; i < s->timer_count; i++) { if (s->timers[i] == id) { - s->timers[i] = 0; - if (s->display && s->display->loop) - yasl_loop_del_timer(s->display->loop, id); - return true; + s->timers[i] = s->timers[--s->timer_count]; + return s->display && yasl_loop_del_timer(s->display->loop, id); } } return false; |
