32 static struct timespec
zero = {};
39 if (interval->tv_sec == 0 && interval->tv_nsec == 0) {
51 if (pthread_mutex_lock(&q->
mutex) != 0) {
52 log_error(
"Error locking msg queue mutex");
69 if (pthread_mutex_unlock(&q->
mutex) != 0) {
70 log_error(
"Error unlocking msg queue mutex");
83 static double timediff_s(
struct timespec *t1,
struct timespec *t2) {
84 return (
double)(t2->tv_sec - t1->tv_sec) + (
double)(t2->tv_nsec - t1->tv_nsec) * 1e-9;
89 pthread_mutex_lock(&q->
mutex);
95 pthread_mutex_unlock(&q->
mutex);
107 struct timespec cur_time;
108 clock_gettime(CLOCK_MONOTONIC_RAW, &cur_time);
119 if (q->
head == msg) {
121 pthread_mutex_unlock(&q->
mutex);
128 }
while (num_checked < q->num_msgs);
133 pthread_mutex_unlock(&q->
mutex);
140 if (q->
head == NULL) {
147 pthread_mutex_unlock(&q->
mutex);
157 pthread_mutex_init(&q->
mutex, NULL);
static double timediff_s(struct timespec *t1, struct timespec *t2)
Returns the difference in time in seconds, t2 - t1.
struct dedos_msg * dequeue_msg(struct msg_queue *q)
Dequeues the first available message from q.
Container for linked list message queue.
Logging of status messages to the terminal.
static struct timespec zero
Interval 0 seconds from now.
A linked-list entry containing a message.
int schedule_msg(struct msg_queue *q, struct dedos_msg *msg, struct timespec *interval)
Schedules a message to be delivered once interval time has passed.
#define log_error(fmt,...)
sem_t * sem
Post to this semaphore on each new enqueue.
struct dedos_msg * tail
Last entry in the queue.
Structures and functions for enqueueing and dequeuing general-purpose messages from a queue...
int enqueue_msg(struct msg_queue *q, struct dedos_msg *msg)
Enqueues a message to be delivered as soon as possible.
struct dedos_msg * head
First entry in the queue.
struct timespec delivery_time
Message is ignored until this time (in CLOCK_MONOTONIC_COARSE) has passed.
uint32_t num_msgs
Number of messages currently in the queue.
struct dedos_msg * next
The next message in the list, or NULL if N/A.
bool shared
Whether the queue needs to be locked (always true at the moment)
pthread_mutex_t mutex
Mutex if the queue is shared.
int init_msg_queue(struct msg_queue *q, sem_t *sem)
Initilializes a mesasge queue to have no messages in it, and sets up the mutex and semaphore...