Changeset ffc4df61a846d99a75783f7d348fb98dd19910aa

Show
Ignore:
Timestamp:
10/27/09 00:41:17 (4 weeks ago)
Author:
Alejandro R. Sedeño <asedeno@mit.edu>
git-author:
Alejandro R. Sedeño <asedeno@mit.edu> / 2009-10-24T14:56:01Z-0400
Parents:
df0138f05e0bae986f09d167195c6ce676bac37d
Children:
18fdd5f9be6de827a19aceb95d4769058b145869
git-committer:
Alejandro R. Sedeño <asedeno@mit.edu> / 2009-10-27T00:41:17Z-0400
Message:
Switch perl API to new I/O Dispatch API.

Signed-off-by: Alejandro R. Sedeño <asedeno@mit.edu>
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • perl/lib/BarnOwl.pm

    r3c428d4 rffc4df6  
    1313                    error debug 
    1414                    create_style getnumcolors wordwrap 
    15                     add_dispath remove_dispatch 
     15                    add_dispatch remove_dispatch 
     16                    add_io_dispatch remove_io_dispatch 
    1617                    new_command 
    1718                    new_variable_int new_variable_bool new_variable_string 
     
    6263Returns the current message as a C<BarnOwl::Message> subclass, or 
    6364undef if there is no message selected 
    64  
    6565=head2 getnumcols 
    6666 
     
    160160read from C<FD>. 
    161161 
     162C<add_dispatch> has been deprecated in favor of C<add_io_dispatch>, 
     163and is now a wrapper for it called with C<mode> set to C<'r'>. 
     164 
     165=cut 
     166 
     167sub add_dispatch { 
     168    my $fd = shift; 
     169    my $cb = shift; 
     170    add_io_dispatch($fd, 'r', $cb); 
     171} 
     172 
    162173=head2 remove_dispatch FD 
    163174 
    164175Remove a file descriptor previously registered via C<add_dispatch> 
     176 
     177C<remove_dispatch> has been deprecated in favor of 
     178C<remove_io_dispatch>. 
     179 
     180=cut 
     181 
     182*remove_dispatch = \&remove_io_dispatch; 
     183 
     184=head2 add_io_dispatch FD MODE CB 
     185 
     186Adds a file descriptor to C<BarnOwl>'s internal C<select()> 
     187loop. <MODE> can be 'r', 'w', or 'rw'. C<CALLBACK> will be invoked 
     188whenever C<FD> becomes ready, as specified by <MODE>. 
     189 
     190Only one callback can be registered per FD. If a new callback is 
     191registered, the old one is removed. 
     192 
     193=cut 
     194 
     195sub add_io_dispatch { 
     196    my $fd = shift; 
     197    my $modeStr = shift; 
     198    my $cb = shift; 
     199    my $mode = 0; 
     200 
     201    $mode |= 0x1 if ($modeStr =~ /r/i); # Read 
     202    $mode |= 0x2 if ($modeStr =~ /w/i); # Write 
     203    if ($mode) { 
     204        $mode |= 0x4;                  # Exceptional 
     205        BarnOwl::Internal::add_io_dispatch($fd, $mode, $cb); 
     206    } else { 
     207        die("Invalid I/O Dispatch mode: $modeStr"); 
     208    } 
     209} 
     210 
     211=head2 remove_io_dispatch FD 
     212 
     213Remove a file descriptor previously registered via C<add_io_dispatch> 
    165214 
    166215=head2 create_style NAME OBJECT 
  • perlconfig.c

    rdf0138f rffc4df6  
    504504} 
    505505 
    506 void owl_perlconfig_dispatch_free(owl_dispatch *d) 
    507 { 
    508   SvREFCNT_dec(d->data); 
    509   owl_free(d); 
    510 } 
    511  
    512506void owl_perlconfig_io_dispatch_destroy(const owl_io_dispatch *d) 
    513507{ 
     
    560554} 
    561555 
    562 void owl_perlconfig_dispatch(owl_dispatch *d) 
    563 { 
    564   SV *cb = d->data; 
    565   dSP; 
    566   if(cb == NULL) { 
    567     owl_function_error("Perl callback is NULL!"); 
    568     return; 
    569   } 
    570  
    571   ENTER; 
    572   SAVETMPS; 
    573  
    574   PUSHMARK(SP); 
    575   PUTBACK; 
    576    
    577   call_sv(cb, G_DISCARD|G_KEEPERR|G_EVAL); 
    578  
    579   if(SvTRUE(ERRSV)) { 
    580     owl_function_error("%s", SvPV_nolen(ERRSV)); 
    581   } 
    582  
    583   FREETMPS; 
    584   LEAVE; 
    585 } 
    586  
    587556void owl_perlconfig_io_dispatch(const owl_io_dispatch *d, void *data) 
    588557{ 
  • perlglue.xs

    rbdbec0a rffc4df6  
    318318 
    319319void 
    320 add_dispatch(fd, cb) 
     320remove_io_dispatch(fd) 
    321321        int fd 
    322         SV * cb 
    323         CODE: 
    324         owl_select_add_perl_dispatch(fd, SvREFCNT_inc(cb)); 
    325  
    326 void 
    327 remove_dispatch(fd) 
    328         int fd 
    329         CODE: 
    330         owl_select_remove_perl_dispatch(fd); 
    331  
     322        CODE: 
     323        owl_select_remove_perl_io_dispatch(fd); 
    332324 
    333325AV* 
     
    509501                                      ival); 
    510502 
     503void 
     504add_io_dispatch(fd, mode, cb) 
     505        int fd 
     506        int mode 
     507        SV * cb 
     508        CODE: 
     509        owl_select_add_perl_io_dispatch(fd, mode, SvREFCNT_inc(cb)); 
     510 
    511511IV 
    512512add_timer(after, interval, cb) 
  • select.c

    rdf0138f rffc4df6  
    156156{ 
    157157  return owl_list_get_size(owl_global_get_dispatchlist(&g)); 
    158 } 
    159  
    160 int owl_select_add_perl_dispatch(int fd, SV *cb) 
    161 { 
    162   int elt; 
    163   owl_dispatch *d; 
    164   elt = owl_select_find_dispatch(fd); 
    165   if (elt != -1) { 
    166     d = owl_list_get_element(owl_global_get_dispatchlist(&g), elt); 
    167     if (d->cfunc != owl_perlconfig_dispatch) { 
    168       /* don't mess with non-perl dispatch functions from here. */ 
    169       return 1; 
    170     } 
    171   } 
    172  
    173   d = owl_malloc(sizeof(owl_dispatch)); 
    174   d->fd = fd; 
    175   d->cfunc = owl_perlconfig_dispatch; 
    176   d->destroy = owl_perlconfig_dispatch_free; 
    177   d->data = cb; 
    178   owl_select_add_dispatch(d); 
    179   return 0; 
    180 } 
    181  
    182 int owl_select_remove_perl_dispatch(int fd) 
    183 { 
    184   int elt; 
    185   owl_dispatch *d; 
    186    
    187   elt = owl_select_find_dispatch(fd); 
    188   if (elt != -1) { 
    189     d = owl_list_get_element(owl_global_get_dispatchlist(&g), elt); 
    190     if (d->cfunc == owl_perlconfig_dispatch) { 
    191       owl_select_remove_dispatch_at(elt); 
    192       return 0; 
    193     } 
    194   } 
    195   return 1; 
    196158} 
    197159