All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
event.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2017 Inria
3 * 2017 Kaspar Schleiser <kaspar@schleiser.de>
4 * 2018-2019 Freie Universität Berlin
5 *
6 * This file is subject to the terms and conditions of the GNU Lesser
7 * General Public License v2.1. See the file LICENSE in the top level
8 * directory for more details.
9 */
10
96#ifndef EVENT_H
97#define EVENT_H
98
99#include <stdio.h>
100#include <stdint.h>
101#include <stdbool.h>
102#include <string.h>
103
104#include "assert.h"
105#include "clist.h"
106#include "irq.h"
107#include "thread.h"
108#include "thread_flags.h"
109#include "ptrtag.h"
110#include "ztimer.h"
111
112#ifdef __cplusplus
113extern "C" {
114#endif
115
116#ifndef THREAD_FLAG_EVENT
120#define THREAD_FLAG_EVENT (0x1)
121#endif
122
126#define EVENT_QUEUE_INIT { .waiter = thread_get_active() }
127
131#define EVENT_QUEUE_INIT_DETACHED { .waiter = NULL }
132
136typedef struct event event_t;
137
141typedef void (*event_handler_t)(event_t *);
142
150
158
167static inline void event_queues_init(event_queue_t *queues,
168 size_t n_queues)
169{
170 assert(queues && n_queues);
172 for (size_t i = 0; i < n_queues; i++) {
173 memset(&queues[i], '\0', sizeof(queues[0]));
174 queues[i].waiter = me;
175 }
176}
177
185static inline void event_queue_init(event_queue_t *queue)
186{
187 event_queues_init(queue, 1);
188}
189
196static inline void event_queues_init_detached(event_queue_t *queues,
197 size_t n_queues)
198{
199 assert(queues);
200 for (size_t i = 0; i < n_queues; i++) {
201 memset(&queues[i], '\0', sizeof(queues[0]));
202 }
203}
204
210static inline void event_queue_init_detached(event_queue_t *queue)
211{
213}
214
226static inline void event_queues_claim(event_queue_t *queues, size_t n_queues)
227{
228 assert(queues);
230 for (size_t i = 0; i < n_queues; i++) {
231 assert(queues[i].waiter == NULL);
232 queues[i].waiter = me;
233 }
234}
235
246static inline void event_queue_claim(event_queue_t *queue)
247{
248 event_queues_claim(queue, 1);
249}
250
265
277
287bool event_is_queued(const event_queue_t *queue, const event_t *event);
288
301
333event_t *event_wait_multi(event_queue_t *queues, size_t n_queues);
334
352static inline event_t *event_wait(event_queue_t *queue)
353{
354 return event_wait_multi(queue, 1);
355}
356
357#if IS_USED(MODULE_XTIMER) || defined(DOXYGEN)
370event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout);
371
384event_t *event_wait_timeout64(event_queue_t *queue, uint64_t timeout);
385#endif
386
387#if IS_USED(MODULE_ZTIMER) || defined(DOXYGEN)
406 ztimer_clock_t *clock, uint32_t timeout);
407#endif
408
436static inline void event_loop_multi(event_queue_t *queues, size_t n_queues)
437{
438 event_t *event;
439
440 while ((event = event_wait_multi(queues, n_queues))) {
441 if (IS_USED(MODULE_EVENT_LOOP_DEBUG)) {
442 uint32_t now;
444 printf("event: executing %p->%p\n",
445 (void *)event, (void *)(uintptr_t)event->handler);
446 now = ztimer_now(ZTIMER_USEC);
447
448 event->handler(event);
449
450 printf("event: %p took %" PRIu32 " µs\n",
451 (void *)event, ztimer_now(ZTIMER_USEC) - now);
453 }
454 else {
455 event->handler(event);
456 }
457 }
458}
459
482static inline void event_loop(event_queue_t *queue)
483{
484 event_loop_multi(queue, 1);
485}
486
507
508#ifdef __cplusplus
509}
510#endif
511#endif /* EVENT_H */
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition assert.h:136
Circular linked list.
static thread_t * thread_get_active(void)
Returns a pointer to the Thread Control Block of the currently running thread.
Definition thread.h:407
#define printf(...)
A wrapper for the printf() function that passes arguments through unmodified, but fails to compile if...
Definition stdio.h:60
static void event_loop_multi(event_queue_t *queues, size_t n_queues)
Simple event loop with multiple queues.
Definition event.h:436
void event_post(event_queue_t *queue, event_t *event)
Queue an event.
static event_t * event_wait(event_queue_t *queue)
Get next event from event queue, blocking.
Definition event.h:352
static void event_loop(event_queue_t *queue)
Simple event loop.
Definition event.h:482
event_t * event_wait_timeout_ztimer(event_queue_t *queue, ztimer_clock_t *clock, uint32_t timeout)
Get next event from event queue, blocking until timeout expires.
static void event_queue_init(event_queue_t *queue)
Initialize an event queue.
Definition event.h:185
void(* event_handler_t)(event_t *)
event handler type definition
Definition event.h:141
void event_cancel(event_queue_t *queue, event_t *event)
Cancel a queued event.
struct PTRTAG event_queue_t
event queue structure
static void event_queue_init_detached(event_queue_t *queue)
Initialize an event queue not binding it to a thread.
Definition event.h:210
static void event_queue_claim(event_queue_t *queue)
Bind an event queue to the calling thread.
Definition event.h:246
static void event_queues_claim(event_queue_t *queues, size_t n_queues)
Bind an array of event queues to the calling thread.
Definition event.h:226
void event_sync(event_queue_t *queue)
Synchronize with the last event on the queue.
static void event_queues_init_detached(event_queue_t *queues, size_t n_queues)
Initialize an array of event queues not binding it to a thread.
Definition event.h:196
event_t * event_wait_multi(event_queue_t *queues, size_t n_queues)
Get next event from the given event queues, blocking.
event_t * event_wait_timeout(event_queue_t *queue, uint32_t timeout)
Get next event from event queue, blocking until timeout expires.
static void event_queues_init(event_queue_t *queues, size_t n_queues)
Initialize an array of event queues.
Definition event.h:167
event_t * event_get(event_queue_t *queue)
Get next event from event queue, non-blocking.
bool event_is_queued(const event_queue_t *queue, const event_t *event)
Check if an event is already queued.
event_t * event_wait_timeout64(event_queue_t *queue, uint64_t timeout)
Get next event from event queue, blocking until timeout expires.
bool ztimer_release(ztimer_clock_t *clock)
Release a clock.
ztimer_clock_t *const ZTIMER_USEC
Default ztimer microsecond clock.
bool ztimer_acquire(ztimer_clock_t *clock)
Acquire a clock.
static ztimer_now_t ztimer_now(ztimer_clock_t *clock)
Get the current time from a clock.
Definition ztimer.h:683
IRQ driver interface.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:71
Pointer Tagging Helpers.
event queue structure
Definition event.h:154
thread_t * waiter
thread owning event queue
Definition event.h:156
clist_node_t event_list
list of queued events
Definition event.h:155
thread_t holds thread's context data.
Definition thread.h:168
event structure
Definition event.h:146
event_handler_t handler
pointer to event handler function
Definition event.h:148
clist_node_t list_node
event queue list entry
Definition event.h:147
List node structure.
Definition list.h:40
ztimer device structure
Definition ztimer.h:370
Thread Flags API.
ztimer API