Changeset bcde7926 for perl


Ignore:
Timestamp:
Jun 22, 2011, 12:37:21 AM (10 years ago)
Author:
David Benjamin <davidben@mit.edu>
Branches:
master, release-1.8, release-1.9
Children:
bbb7876
Parents:
074bdaa
git-author:
David Benjamin <davidben@mit.edu> (05/24/11 01:10:12)
git-committer:
David Benjamin <davidben@mit.edu> (06/22/11 00:37:21)
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
  • perl/lib/BarnOwl.pm

    r9179fd7 rbcde7926  
    166166read from C<FD>.
    167167
    168 C<add_dispatch> has been deprecated in favor of C<add_io_dispatch>,
    169 and is now a wrapper for it called with C<mode> set to C<'r'>.
     168C<add_dispatch> has been deprecated in favor of C<AnyEvent>, and is
     169now a wrapper for C<add_io_dispatch> called with C<mode> set to
     170C<'r'>.
    170171
    171172=cut
     
    181182Remove a file descriptor previously registered via C<add_dispatch>
    182183
    183 C<remove_dispatch> has been deprecated in favor of
    184 C<remove_io_dispatch>.
     184C<remove_dispatch> has been deprecated in favor of C<AnyEvent>.
    185185
    186186=cut
     
    197197registered, the old one is removed.
    198198
    199 =cut
     199C<add_io_dispatch> has been deprecated in favor of C<AnyEvent>.
     200
     201=cut
     202
     203our %_io_dispatches;
    200204
    201205sub add_io_dispatch {
     
    203207    my $modeStr = shift;
    204208    my $cb = shift;
    205     my $mode = 0;
    206 
    207     $mode |= 0x1 if ($modeStr =~ /r/i); # Read
    208     $mode |= 0x2 if ($modeStr =~ /w/i); # Write
    209     if ($mode) {
    210         $mode |= 0x4;                  # Exceptional
    211         BarnOwl::Internal::add_io_dispatch($fd, $mode, $cb);
     209    my @modes;
     210
     211    push @modes, 'r' if $modeStr =~ /r/i; # Read
     212    push @modes, 'w' if $modeStr =~ /w/i; # Write
     213    if (@modes) {
     214        BarnOwl::remove_io_dispatch($fd);
     215        for my $mode (@modes) {
     216            push @{$_io_dispatches{$fd}}, AnyEvent->io(fh => $fd,
     217                                                       poll => $mode,
     218                                                       cb => $cb);
     219        }
    212220    } else {
    213221        die("Invalid I/O Dispatch mode: $modeStr");
     
    218226
    219227Remove a file descriptor previously registered via C<add_io_dispatch>
     228
     229C<remove_io_dispatch> has been deprecated in favor of C<AnyEvent>.
     230
     231=cut
     232
     233sub remove_io_dispatch {
     234    my $fd = shift;
     235    undef $_ foreach @{$_io_dispatches{$fd}};
     236    delete $_io_dispatches{$fd};
     237}
    220238
    221239=head2 create_style NAME OBJECT
Note: See TracChangeset for help on using the changeset viewer.