Changeset f21bc36 for select.c


Ignore:
Timestamp:
Jun 21, 2011, 11:19:09 PM (10 years ago)
Author:
David Benjamin <davidben@mit.edu>
Children:
4da7659
Parents:
7df7be2
git-author:
David Benjamin <davidben@mit.edu> (05/24/11 01:10:12)
git-committer:
David Benjamin <davidben@mit.edu> (06/21/11 23:19:09)
Message:
Reimplement BarnOwl::add_io_dispatch with AnyEvent

We can emulate the interesting semantics with perl. The one difference
is that perl code can now register an IO dispatch on file descriptors C
code was interested in. This isn't a big deal was Glib can handle
multiple watches on the same FD. Granted, more than one reader on an FD
would cause trouble, but there was nothing stopping perl code from
reading from an FD we cared about anyway.

AnyEvent also does not support select's exceptfd, so this is a slight
behavior change, but probably an uninteresting one.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • select.c

    r7df7be2 rf21bc36  
    175175};
    176176
    177 int owl_select_add_perl_io_dispatch(int fd, int mode, SV *cb)
    178 {
    179   const owl_io_dispatch *d = owl_select_find_valid_io_dispatch_by_fd(fd);
    180   if (d != NULL && d->callback != owl_perlconfig_io_dispatch) {
    181     /* Don't mess with non-perl dispatch functions from here. */
    182     return 1;
    183   }
    184   /* Also remove any invalidated perl dispatch functions that may have
    185    * stuck around. */
    186   owl_select_remove_perl_io_dispatch(fd);
    187   owl_select_add_io_dispatch(fd, mode, owl_perlconfig_io_dispatch, owl_perlconfig_io_dispatch_destroy, cb);
    188   return 0;
    189 }
    190 
    191 static owl_io_dispatch *owl_select_find_perl_io_dispatch(int fd)
    192 {
    193   int i, len;
    194   const owl_list *dl;
    195   owl_io_dispatch *d;
    196   dl = owl_global_get_io_dispatch_list(&g);
    197   len = owl_list_get_size(dl);
    198   for(i = 0; i < len; i++) {
    199     d = owl_list_get_element(dl, i);
    200     if (d->fd == fd && d->callback == owl_perlconfig_io_dispatch)
    201       return d;
    202   }
    203   return NULL;
    204 }
    205 
    206 int owl_select_remove_perl_io_dispatch(int fd)
    207 {
    208   owl_io_dispatch *d = owl_select_find_perl_io_dispatch(fd);
    209   if (d != NULL) {
    210     /* Only remove perl io dispatchers from here. */
    211     owl_select_remove_io_dispatch(d);
    212     return 0;
    213   }
    214   return 1;
    215 }
    216 
    217177void owl_select_init(void)
    218178{
Note: See TracChangeset for help on using the changeset viewer.