calcurse-edge/src/queue.c
Lars Henriksen d1075e525f Mutex for the system message queue
The main thread only reads and removes events from the queue. All other threads
only insert events in the queue. Hence, only insertion and removal need protection.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
2018-10-21 20:02:57 +02:00

97 lines
1.6 KiB
C

#include "calcurse.h"
/*
* A queue for calcurse system messages.
*/
llist_t sysqueue;
static pthread_mutex_t que_mutex = PTHREAD_MUTEX_INITIALIZER;
void que_init(void)
{
LLIST_INIT(&sysqueue);
}
/*
* Test for queued system events.
*/
int que_ued(void)
{
return sysqueue.head ? 1 : 0;
}
/*
* Insert a system event at the tail of the queue.
*/
struct event *que_ins(char *mesg, time_t time, int id)
{
struct event *ev;
ev = mem_malloc(sizeof(struct event));
ev->mesg = mem_strdup(mesg);
ev->day = time;
ev->id = id;
ev->note = NULL;
pthread_mutex_lock(&que_mutex);
LLIST_ADD(&sysqueue, ev);
pthread_mutex_unlock(&que_mutex);
return ev;
}
/*
* Get the system event at the head of the queue.
*/
struct event *que_get(void)
{
return sysqueue.head ? sysqueue.head->data : NULL;
}
/*
* Remove the system event at the head of the queue.
*/
void que_rem(void)
{
struct event *ev;
if (!sysqueue.head)
return;
ev = sysqueue.head->data;
pthread_mutex_lock(&que_mutex);
LLIST_REMOVE(&sysqueue, sysqueue.head);
pthread_mutex_unlock(&que_mutex);
mem_free(ev->mesg);
mem_free(ev);
}
/*
* Display the system event at the head of the queue in a popup window.
*/
void que_show(void)
{
struct event *ev;
char *date;
if (!que_ued())
return;
ev = que_get();
date = date_sec2date_str(ev->day, "%F %T");
item_in_popup(date, "", ev->mesg, _("System event"));
mem_free(date);
}
/*
* Save the system event at the head of the queue as an appointment.
*/
void que_save(void)
{
struct event *ev;
if (!que_ued())
return;
ev = que_get();
apoint_new(ev->mesg, NULL, ev->day, 0, APOINT_NULL);
io_set_modified();
}