69 lines
2.3 KiB
C
69 lines
2.3 KiB
C
#pragma once
|
|
|
|
#include <rt/atomic.h>
|
|
#include <rt/sem.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct rt_notify
|
|
{
|
|
rt_atomic_uint32_t value;
|
|
struct rt_sem sem;
|
|
};
|
|
|
|
void rt_notify_init(struct rt_notify *note, uint32_t value);
|
|
|
|
#define RT_NOTIFY_INIT(name, value_) \
|
|
{ \
|
|
.value = (value_), .sem = RT_SEM_INIT_BINARY(name.sem), \
|
|
}
|
|
|
|
#define RT_NOTIFY(name, value_) \
|
|
struct rt_notify name = RT_NOTIFY_INIT(name, value_)
|
|
|
|
// Notify without changing the notification value.
|
|
void rt_notify_post(struct rt_notify *note);
|
|
|
|
// Notify and |= the notification value.
|
|
void rt_notify_or(struct rt_notify *note, uint32_t value);
|
|
|
|
// Notify and += the notification value.
|
|
void rt_notify_add(struct rt_notify *note, uint32_t value);
|
|
|
|
// Notify set the notification value unconditionally.
|
|
void rt_notify_set(struct rt_notify *note, uint32_t value);
|
|
|
|
/* Block until notified, and return the notification value. Only one task may
|
|
* call rt_notify_*wait* for each struct rt_notify. */
|
|
uint32_t rt_notify_wait(struct rt_notify *note);
|
|
|
|
/* Block the current task until notified, and &= ~clear the notification value.
|
|
* The returned value is before clearing. */
|
|
uint32_t rt_notify_wait_clear(struct rt_notify *note, uint32_t clear);
|
|
|
|
/* Get the notification value if one is pending. Returns false if there is no
|
|
* notification pending. */
|
|
bool rt_notify_trywait(struct rt_notify *note, uint32_t *value);
|
|
|
|
// rt_notify_trywait and &= ~clear the notification value after fetching it.
|
|
bool rt_notify_trywait_clear(struct rt_notify *note, uint32_t *value,
|
|
uint32_t clear);
|
|
|
|
/* Wait for a pending notification until a timeout expires and get the value if
|
|
* a notification occurs. Returns false if there is no notification before the
|
|
* timeout expires. */
|
|
bool rt_notify_timedwait(struct rt_notify *note, uint32_t *value,
|
|
unsigned long ticks);
|
|
|
|
// rt_notify_timedwait and &= ~clear the notification value after fetching it.
|
|
bool rt_notify_timedwait_clear(struct rt_notify *note, uint32_t *value,
|
|
uint32_t clear, unsigned long ticks);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|