Changeset 111850c


Ignore:
Timestamp:
Mar 25, 2011, 3:55:41 AM (10 years ago)
Author:
David Benjamin <davidben@mit.edu>
Children:
25f7c57
Parents:
6eaafb0
git-author:
David Benjamin <davidben@mit.edu> (03/02/11 13:47:21)
git-committer:
David Benjamin <davidben@mit.edu> (03/25/11 03:55:41)
Message:
Add owl_select_post_task helper function

Honestly, the only thing you'd ever want to do to a message loop from
another thread is post a one-off task to it. Why Glib makes this so
difficult is beyond me.
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • owl.c

    r6eaafb0 r111850c  
    365365}
    366366
    367 static gboolean sig_handler_main_thread(gpointer data) {
     367static void sig_handler_main_thread(void *data) {
    368368  int sig = GPOINTER_TO_INT(data);
    369369
     
    378378    owl_process_input_char(in);
    379379  }
    380   return FALSE;
    381380}
    382381
    383382static void sig_handler(int sig, void *data) {
    384   GMainContext *context = data;
    385   GSource *source;
    386 
    387383  /* If it was an interrupt, set a flag so we can handle it earlier if
    388384   * needbe. sig_handler_main_thread will check the flag to make sure
     
    392388  }
    393389  /* Send a message to the main thread. */
    394   source = g_idle_source_new();
    395   g_source_set_priority(source, G_PRIORITY_DEFAULT);
    396   g_source_set_callback(source, sig_handler_main_thread,
    397                         GINT_TO_POINTER(sig), NULL);
    398   g_source_attach(source, context);
    399   g_source_unref(source);
     390  owl_select_post_task(sig_handler_main_thread, GINT_TO_POINTER(sig), NULL);
    400391}
    401392
     
    436427  CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGHUP));
    437428  CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGINT));
    438   owl_signal_init(&sigset, sig_handler, g_main_context_default());
     429  owl_signal_init(&sigset, sig_handler, NULL);
    439430}
    440431
  • select.c

    r567de81 r111850c  
    22
    33static GMainLoop *loop = NULL;
     4static GMainContext *context;
    45static int dispatch_active = 0;
    56
     
    310311void owl_select_run_loop(void)
    311312{
    312   loop = g_main_loop_new(NULL, FALSE);
     313  context = g_main_context_default();
     314  loop = g_main_loop_new(context, FALSE);
    313315  g_main_loop_run(loop);
    314316}
     
    321323  }
    322324}
     325
     326typedef struct _owl_task { /*noproto*/
     327  void (*cb)(void *);
     328  void *cbdata;
     329  void (*destroy_cbdata)(void *);
     330} owl_task;
     331
     332static gboolean _run_task(gpointer data)
     333{
     334  owl_task *t = data;
     335  if (t->cb)
     336    t->cb(t->cbdata);
     337  return FALSE;
     338}
     339
     340static void _destroy_task(void *data)
     341{
     342  owl_task *t = data;
     343  if (t->destroy_cbdata)
     344    t->destroy_cbdata(t->cbdata);
     345  g_free(t);
     346}
     347
     348void owl_select_post_task(void (*cb)(void*), void *cbdata, void (*destroy_cbdata)(void*))
     349{
     350  GSource *source = g_idle_source_new();
     351  owl_task *t = g_new0(owl_task, 1);
     352  t->cb = cb;
     353  t->cbdata = cbdata;
     354  t->destroy_cbdata = destroy_cbdata;
     355  g_source_set_priority(source, G_PRIORITY_DEFAULT);
     356  g_source_set_callback(source, _run_task, t, _destroy_task);
     357  g_source_attach(source, context);
     358  g_source_unref(source);
     359}
Note: See TracChangeset for help on using the changeset viewer.