/* If first, send the actual event to the local thread */
if (local_deferred.last == &local_deferred.first)
- ev_send_this_thread(&local_deferred.e);
+ ev_send_defer(&local_deferred.e);
/* Add to list */
a->next = NULL;
/* Currently running birdloop */
extern _Thread_local struct birdloop *this_birdloop;
+/* Lowest entered birdloop */
+extern _Thread_local struct birdloop *birdloop_current;
+
/* Check that the task has enough time to do a bit more */
bool task_still_in_limit(void);
bool task_before_halftime(void);
void birdloop_stop_self(struct birdloop *loop, void (*stopped)(void *data), void *data);
void birdloop_free(struct birdloop *loop);
-/* Run this event in this thread's priority event list */
-void ev_send_this_thread(event *e);
+/* Run this event in the running loop's priority event list to run asap */
+void ev_send_defer(event *e);
/* Get birdloop's time heap */
struct timeloop *birdloop_time_loop(struct birdloop *loop);
/* Process socket RX */
sockets_fire(loop, 1, 0);
+ /* Flush deferred events */
+ while (ev_run_list(&loop->defer_list))
+ repeat++;
+
/* Check end time */
} while (repeat && task_still_in_limit());
}
void
-ev_send_this_thread(event *e)
+ev_send_defer(event *e)
{
if (this_thread == &main_thread)
ev_send_loop(&main_birdloop, e);
else
- ev_send(&this_thread->priority_events, e);
+ ev_send(&this_birdloop->defer_list, e);
}