Changeset 1631825


Ignore:
Timestamp:
Dec 17, 2008, 3:24:26 PM (12 years ago)
Author:
Nelson Elhage <nelhage@mit.edu>
Branches:
master, debian, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
Children:
f36cd97
Parents:
c675b39
Message:
Implement a perl timer class and minimal interface.

I will document this and add a better API (perhaps through an AnyEvent
impl) in later commits.
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • perlconfig.c

    re0096b7 r1631825  
    517517  LEAVE;
    518518}
     519
     520void owl_perlconfig_perl_timer(owl_timer *t, void *data)
     521{
     522  SV *obj = data;
     523
     524  if(!SvROK(obj)) {
     525    return;
     526  }
     527
     528  dSP;
     529  ENTER;
     530  SAVETMPS;
     531
     532  PUSHMARK(SP);
     533  XPUSHs(obj);
     534  PUTBACK;
     535
     536  call_method("do_callback", G_DISCARD|G_KEEPERR|G_EVAL);
     537
     538  SPAGAIN;
     539
     540  if (SvTRUE(ERRSV)) {
     541    owl_function_error("Error in calback: '%s'", SvPV_nolen(ERRSV));
     542    sv_setsv (ERRSV, &PL_sv_undef);
     543  }
     544
     545  PUTBACK;
     546  FREETMPS;
     547  LEAVE;
     548}
     549
     550void owl_perlconfig_perl_timer_destroy(owl_timer *t)
     551{
     552  if(SvOK((SV*)t->data)) {
     553    SvREFCNT_dec((SV*)t->data);
     554  }
     555}
  • perlglue.xs

    r25cccdc r1631825  
    399399                                      desc,
    400400                                      ival);
     401
     402IV
     403add_timer(after, interval, cb)
     404        int after
     405        int interval
     406        SV *cb
     407        PREINIT:
     408                SV *ref;
     409                owl_timer *t;
     410        CODE:
     411                ref = sv_rvweaken(newSVsv(cb));
     412                t = owl_select_add_timer(after,
     413                                         interval,
     414                                         owl_perlconfig_perl_timer,
     415                                         owl_perlconfig_perl_timer_destroy,
     416                                         ref);
     417        owl_function_debugmsg("Created timer %p", t);
     418        RETVAL = (IV)t;
     419        OUTPUT:
     420                RETVAL
     421
     422void
     423remove_timer(timer)
     424        IV timer
     425        PREINIT:
     426                owl_timer *t;
     427        CODE:
     428                t = (owl_timer*)timer;
     429                owl_function_debugmsg("Freeing timer %p", t);
     430                                owl_select_remove_timer(t);
  • perlwrap.pm

    r25cccdc r1631825  
    12281228}
    12291229
     1230package BarnOwl::Timer;
     1231
     1232sub new {
     1233    my $class = shift;
     1234    my $args = shift;
     1235
     1236    my $cb = $args->{cb};
     1237    die("Invalid callback pased to BarnOwl::Timer\n") unless ref($cb) eq 'CODE';
     1238
     1239    my $self = {cb => $cb};
     1240
     1241    bless($self, $class);
     1242
     1243    $self->{timer} = BarnOwl::Internal::add_timer($args->{after} || 0,
     1244                                                  $args->{interval} || 0,
     1245                                                  $self);
     1246    return $self;
     1247}
     1248
     1249sub do_callback {
     1250    my $self = shift;
     1251    $self->{cb}->($self);
     1252}
     1253
     1254sub DESTROY {
     1255    my $self = shift;
     1256    if(defined($self->{timer})) {
     1257        BarnOwl::Internal::remove_timer($self->{timer});
     1258    }
     1259}
     1260
    12301261
    12311262# switch to package main when we're done
Note: See TracChangeset for help on using the changeset viewer.