Changeset cd28517


Ignore:
Timestamp:
Mar 25, 2011, 3:46:46 AM (13 years ago)
Author:
David Benjamin <davidben@mit.edu>
Children:
fafb842
Parents:
5eb392f
git-author:
David Benjamin <davidben@mit.edu> (02/25/11 22:29:41)
git-committer:
David Benjamin <davidben@mit.edu> (03/25/11 03:46:46)
Message:
Add a zephyr GSource

This may actually have some use as a GSource instead of g_idle_add since
we queue messages up and only process so many at a time. The use of
ZQLength isn't strictly necessary, but we may as well be fancy and wait
for the poll() to tell us if there's any point in reading before doing
so.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • zephyr.c

    rfe3b017 rcd28517  
    77#include "owl.h"
    88
     9static GSource *owl_zephyr_event_source_new(int fd);
     10
     11static gboolean owl_zephyr_event_prepare(GSource *source, int *timeout);
     12static gboolean owl_zephyr_event_check(GSource *source);
     13static gboolean owl_zephyr_event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data);
     14
    915#ifdef HAVE_LIBZEPHYR
    1016static GList *deferred_subs = NULL;
     
    1622
    1723Code_t ZResetAuthentication(void);
     24
     25static GSourceFuncs zephyr_event_funcs = {
     26  owl_zephyr_event_prepare,
     27  owl_zephyr_event_check,
     28  owl_zephyr_event_dispatch,
     29  NULL
     30};
    1831#endif
    1932
     
    8497  Code_t code;
    8598  char *perl;
     99  GSource *event_source;
    86100
    87101  owl_select_remove_io_dispatch(d);
     
    99113  }
    100114
    101   owl_select_add_io_dispatch(ZGetFD(), OWL_IO_READ|OWL_IO_EXCEPT, &owl_zephyr_process_events, NULL, NULL);
     115  event_source = owl_zephyr_event_source_new(ZGetFD());
     116  g_source_attach(event_source, NULL);
     117  g_source_unref(event_source);
    102118
    103119  owl_global_set_havezephyr(&g);
     
    127143  perl = owl_perlconfig_execute("BarnOwl::Zephyr::_zephyr_startup()");
    128144  g_free(perl);
    129 
    130   owl_select_add_pre_select_action(owl_zephyr_pre_select_action, NULL, NULL);
    131145}
    132146
     
    180194    if((code = ZPending()) < 0) {
    181195      owl_function_debugmsg("Error (%s) in ZPending()\n",
     196                            error_message(code));
     197      return 0;
     198    }
     199    return code;
     200  }
     201#endif
     202  return 0;
     203}
     204
     205int owl_zephyr_zqlength(void)
     206{
     207#ifdef HAVE_LIBZEPHYR
     208  Code_t code;
     209  if(owl_global_is_havezephyr(&g)) {
     210    if((code = ZQLength()) < 0) {
     211      owl_function_debugmsg("Error (%s) in ZQLength()\n",
    182212                            error_message(code));
    183213      return 0;
     
    14191449}
    14201450
    1421 void owl_zephyr_process_events(const owl_io_dispatch *d, void *data)
    1422 {
     1451typedef struct { /*noproto*/
     1452  GSource source;
     1453  GPollFD poll_fd;
     1454} owl_zephyr_event_source;
     1455
     1456static GSource *owl_zephyr_event_source_new(int fd) {
     1457  GSource *source;
     1458  owl_zephyr_event_source *event_source;
     1459
     1460  source = g_source_new(&zephyr_event_funcs, sizeof(owl_zephyr_event_source));
     1461  event_source = (owl_zephyr_event_source*) source;
     1462  event_source->poll_fd.fd = fd;
     1463  event_source->poll_fd.events = G_IO_IN | G_IO_HUP | G_IO_PRI | G_IO_ERR;
     1464  g_source_add_poll(source, &event_source->poll_fd);
     1465
     1466  return source;
     1467}
     1468
     1469static gboolean owl_zephyr_event_prepare(GSource *source, int *timeout) {
     1470  *timeout = -1;
     1471  return owl_zephyr_zqlength() > 0;
     1472}
     1473
     1474static gboolean owl_zephyr_event_check(GSource *source) {
     1475  owl_zephyr_event_source *event_source = (owl_zephyr_event_source*)source;
     1476  if (event_source->poll_fd.revents & event_source->poll_fd.events)
     1477    return owl_zephyr_zpending() > 0;
     1478  return FALSE;
     1479}
     1480
     1481static gboolean owl_zephyr_event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) {
    14231482  _owl_zephyr_process_events();
    1424 }
    1425 
    1426 int owl_zephyr_pre_select_action(owl_ps_action *a, void *p)
    1427 {
    1428   return _owl_zephyr_process_events();
    1429 }
     1483  return TRUE;
     1484}
Note: See TracChangeset for help on using the changeset viewer.