Skip to content
This repository was archived by the owner on Aug 19, 2021. It is now read-only.

Commit 057e2a1

Browse files
committed
Defined behaviour of negative delays to discard event
Events triggered with negative delays are discarded immediately with no side-effects or memory leaks and an unused id is returned. No undefined behaviour.
1 parent 5c893ef commit 057e2a1

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

events.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ static inline int equeue_tickdiff(unsigned a, unsigned b) {
157157
return (int)(a - b);
158158
}
159159

160-
static int equeue_enqueue(equeue_t *q, struct event *e, int ms) {
161-
e->target = events_tick() + (unsigned)ms;
160+
static void equeue_enqueue(equeue_t *q, struct event *e, unsigned ms) {
161+
e->target = events_tick() + ms;
162162

163163
struct event **p = &q->queue;
164164
while (*p && equeue_tickdiff((*p)->target, e->target) <= 0) {
@@ -167,8 +167,6 @@ static int equeue_enqueue(equeue_t *q, struct event *e, int ms) {
167167

168168
e->next = *p;
169169
*p = e;
170-
171-
return e->id;
172170
}
173171

174172
static struct event *equeue_dequeue(equeue_t *q, int id) {
@@ -184,9 +182,16 @@ static struct event *equeue_dequeue(equeue_t *q, int id) {
184182
}
185183

186184
static int equeue_post(equeue_t *q, struct event *e, int ms) {
185+
int id = e->id;
186+
if (ms < 0) {
187+
event_dealloc(q, e+1);
188+
return id;
189+
}
190+
187191
events_mutex_lock(&q->queuelock);
188-
int id = equeue_enqueue(q, e, ms);
192+
equeue_enqueue(q, e, ms);
189193
events_mutex_unlock(&q->queuelock);
194+
190195
events_sema_release(&q->eventsema);
191196
return id;
192197
}

0 commit comments

Comments
 (0)