Event::MakeMaker.3pm

Langue: en

Version: 2007-05-22 (ubuntu - 24/10/10)

Section: 3 (Bibliothèques de fonctions)

NAME

Event::MakeMaker - MakeMaker glue for the C-level Event API

SYNOPSIS

This is an advanced feature of Event.

DESCRIPTION

For optimal performance, hook into Event at the C-level. You'll need to make changes to your "Makefile.PL" and add code to your "xs" / "c" file(s).

WARNING

When you hook in at the C-level you get a huge performance gain, but you also reduce the chances that your code will work unmodified with newer versions of "perl" or "Event". This may or may not be a problem. Just be aware, and set your expectations accordingly.

HOW TO

Makefile.PL

   use Event::MakeMaker qw(event_args);
 
   # ... set up %args ...
 
   WriteMakefile(event_args(%args));
 
 

XS

   #include "EventAPI.h"
 
   BOOT:
     I_EVENT_API("YourModule");
 
 

API (v21)

  struct EventAPI {
     I32 Ver;
 
     /* EVENTS */
     void (*queue   )(pe_event *ev);
     void (*start   )(pe_watcher *ev, int repeat);
     void (*now     )(pe_watcher *ev);
     void (*stop    )(pe_watcher *ev, int cancel_events);
     void (*cancel  )(pe_watcher *ev);
     void (*suspend )(pe_watcher *ev);
     void (*resume  )(pe_watcher *ev);
 
     /* All constructors optionally take a stash and template.  Either
       or both can be NULL.  The template should not be a reference. */
     pe_idle     *(*new_idle  )(HV*, SV*);
     pe_timer    *(*new_timer )(HV*, SV*);
     pe_io       *(*new_io    )(HV*, SV*);
     pe_var      *(*new_var   )(HV*, SV*);
     pe_signal   *(*new_signal)(HV*, SV*);
 
     /* TIMEABLE */
     void (*tstart)(pe_timeable *);
     void (*tstop)(pe_timeable *);
 
     /* HOOKS */
     pe_qcallback *(*add_hook)(char *which, void *cb, void *ext_data);
     void (*cancel_hook)(pe_qcallback *qcb);
 
     /* STATS */
     void (*install_stats)(pe_event_stats_vtbl *esvtbl);
     void (*collect_stats)(int yes);
     pe_ring *AllWatchers;
 
     /* TYPEMAP */
     SV   *(*watcher_2sv)(pe_watcher *wa);
     void *(*sv_2watcher)(SV *sv);
     SV   *(*event_2sv)(pe_event *ev);
     void *(*sv_2event)(SV *sv);
  };
 
 

EXAMPLE

   static pe_io *X11_ev=0;
 
   static void x_server_dispatch(void *ext_data)
   { ... }
 
   if (!X11_ev) {
     X11_ev = GEventAPI->new_io(0,0);
     X11_ev->poll = PE_R;
     sv_setpv(X11_ev->base.desc, "X::Server");
     X11_ev->base.callback = (void*) x_server_dispatch;
     X11_ev->base.ext_data = <whatever>;
     X11_ev->base.prio = PE_PRIO_NORMAL;
   }
   X11_ev->fd = x_fd;
   GEventAPI->resume((pe_event*) X11_ev);
   GEventAPI->start((pe_event*) X11_ev, 0);
 
 

BUT I NEED A NEW TYPE OF WATCHER FOR MY INTERGALACTIC INFEROMETER

I'd prefer not to export the entire Event.h apparatus in favor of minimizing interdependencies. If you really, really need to create a new type of watcher send your problem analysis to the mailing list!