diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-08-23 18:36:29 +0200 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-08-23 18:36:29 +0200 |
commit | d295f0a4cbc5f96b0aa65a3d005f98bc31511068 (patch) | |
tree | 8057c0b98d5186bc17e8887002d3f65808cc5d59 /communication_source.c | |
parent | 0baaa8c068f57e44efffa7c1f6806faefdd655e4 (diff) |
Implemented a communication event source for the main loop.
This source will deal with communication between servers.
More to be added and cleaned up soon.
Diffstat (limited to 'communication_source.c')
-rw-r--r-- | communication_source.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/communication_source.c b/communication_source.c new file mode 100644 index 0000000..b0a03cb --- /dev/null +++ b/communication_source.c @@ -0,0 +1,46 @@ +#include "communication_source.h" +#include "servers.h" + +static GQueue *jobqueue = NULL; + +void communication_job_add(struct server *server) { + g_queue_push_head(jobqueue, server); +} + +gboolean comsrc_prepare(GSource *source, gint *timeout) { + g_debug("comsrc_prepare()"); + *timeout = 2000; + return g_queue_get_length(jobqueue) > 0 ? TRUE : FALSE; +} + +gboolean comsrc_check(GSource *source) { + g_debug("comsrc_check()"); + return g_queue_get_length(jobqueue) > 0 ? TRUE : FALSE; +} + +gboolean comsrc_dispatch(GSource *source, GSourceFuncs callback, gpointer user_data) { + g_debug("comsrc_dispatch(), callback is %x, user_data is %x", callback, user_data); + struct server *server = g_queue_pop_tail(jobqueue); + server_sync(server); + return TRUE; +} + +void comsrc_finalize(GSource *source) { +} + +static const GSourceFuncs com_src_funcs = { + .prepare = comsrc_prepare, + .check = comsrc_check, + .dispatch = comsrc_dispatch, + .finalize = comsrc_finalize, +}; + +void communication_source_init(GMainLoop *mainloop) { + jobqueue = g_queue_new(); + + GMainContext *context = g_main_loop_get_context(mainloop); + GSource *source = g_source_new(&com_src_funcs, sizeof(GSource)); + g_source_attach(source, context); + + communication_job_add(servers->data); +} |