From a55523d7f3758d1fa46b8f8d063c57229db27bf3 Mon Sep 17 00:00:00 2001 From: waker Date: Sun, 5 Jul 2009 21:36:02 +0200 Subject: [wip] multithreading --- messagepump.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 messagepump.c (limited to 'messagepump.c') diff --git a/messagepump.c b/messagepump.c new file mode 100644 index 00000000..9967a8dc --- /dev/null +++ b/messagepump.c @@ -0,0 +1,99 @@ +#include +#include +#include "messagepump.h" +#include "threading.h" + +typedef struct message_s { + uint32_t id; + uintptr_t ctx; + uint32_t p1; + uint32_t p2; + struct message_s *next; +} message_t; + +enum { MAX_MESSAGES = 100 }; +static message_t pool[MAX_MESSAGES]; +static message_t *mfree; +static message_t *mqueue; +static message_t *mqtail; +static uintptr_t mutex; + +static void +messagepump_reset (void); + +int +messagepump_init (void) { + messagepump_reset (); + mutex = mutex_create (); +} + +void +messagepump_free () { + mutex_lock (mutex); + messagepump_reset (); + mutex_free (mutex); +} + +static void +messagepump_reset (void) { + mqueue = NULL; + mfree = NULL; + mqtail = NULL; + memset (pool, 0, sizeof (pool)); + for (int i = 0; i < MAX_MESSAGES; i++) { + pool[i].next = mfree; + mfree = &pool[i]; + } +} + +int +messagepump_push (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) { + if (!mfree) { + printf ("WARNING: message queue is full! message ignored (%d %p %d %d)\n", id, ctx, p1, p2); + return -1; + } + mutex_lock (mutex); + message_t *msg = mfree; + mfree = mfree->next; + if (mqtail) { + mqtail->next = msg; + } + mqtail = msg; + if (!mqueue) { + mqueue = msg; + } + + msg->next = NULL; + msg->id = id; + msg->ctx = ctx; + msg->p1 = p1; + msg->p2 = p2; + mutex_unlock (mutex); + return 0; +} + +int +messagepump_pop (uint32_t *id, uintptr_t *ctx, uint32_t *p1, uint32_t *p2) { + if (!mqueue) { + return -1; + } + mutex_lock (mutex); + *id = mqueue->id; + *ctx = mqueue->ctx; + *p1 = mqueue->p1; + *p2 = mqueue->p2; + message_t *next = mqueue->next; + mqueue->next = mfree; + mfree = mqueue; + mqueue = next; + if (!mqueue) { + mqtail = NULL; + } + mutex_unlock (mutex); + return 0; +} + +int +messagepump_hasmessages (void) { + return mqueue ? 1 : 0; +} -- cgit v1.2.3