# This is a patch for Event-0.79 to update it to Event-0.80 # Except that this patch does not include Tutorial.pdf. YMMV # # To apply this patch: # STEP 1: Chdir to the source directory. # STEP 2: Run the 'applypatch' program with this patch file as input. # # If you do not have 'applypatch', it is part of the 'makepatch' package # that you can fetch from the Comprehensive Perl Archive Network: # http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz # In the above URL, 'x' should be 2 or higher. # # To apply this patch without the use of 'applypatch': # STEP 1: Chdir to the source directory. # If you have a decent Bourne-type shell: # STEP 2: Run the shell with this file as input. # If you don't have such a shell, you may need to manually create/delete # the files as shown below. # STEP 3: Run the 'patch' program with this file as input. # # These are the commands needed to create/delete files/directories: # rm -f 'typemap' touch 'lib/Event/typemap' chmod 0444 'lib/Event/typemap' # # This command terminates the shell and need not be executed manually. exit # #### End of Preamble #### #### Patch data follows #### gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/ChangeLog' '/usr/tmp/mp4886.d/new/Event-0.80/ChangeLog' Index: ./ChangeLog --- ./ChangeLog Fri Nov 17 17:11:35 2000 +++ ./ChangeLog Thu Dec 7 15:16:53 2000 @@ -1,3 +1,30 @@ +2000-12-07 Joshua Pritikin <[EMAIL PROTECTED]> + + * Release 0.80. + + * Update Tutorial.pdf to Jochen's latest. + +2000-12-06 Joshua Pritikin <[EMAIL PROTECTED]> + + * Remove silly warning on $io->poll(T). + + * Fix $DIED doc. ([EMAIL PROTECTED]) + +2000-12-05 Joshua Pritikin <[EMAIL PROTECTED]> + + * Change C callback prototype to (void(*)(pe_event*)) + at request of Jochen. + +2000-12-01 Joshua Pritikin <[EMAIL PROTECTED]> + + * Warn if loop without active watchers. + + * Slightly more reliable default_exception_handler. + +2000-11-28 Joshua Pritikin <[EMAIL PROTECTED]> + + * Inline 0.30 integration ([EMAIL PROTECTED]) + 2000-11-17 Joshua Pritikin <[EMAIL PROTECTED]> * Release 0.79. gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/Event.xs' '/usr/tmp/mp4886.d/new/Event-0.80/Event.xs' Index: ./Event.xs --- ./Event.xs Mon Aug 28 09:52:19 2000 +++ ./Event.xs Tue Dec 5 16:30:26 2000 @@ -331,6 +331,9 @@ BOOT: api.unloop = pe_unloop; api.unloop_all = pe_unloop_all; api.sv_2interval = sv_2interval; + api.events_mask_2sv = events_mask_2sv; + api.sv_2events_mask = sv_2events_mask; + apisv = perl_get_sv("Event::API", 1); sv_setiv(apisv, (IV)&api); SvREADONLY_on(apisv); @@ -500,6 +503,8 @@ _loop() CODE: pe_check_recovery(); pe_reentry(); + if (!ActiveWatchers) + warn("Event: loop without active watchers"); while (ExitLevel >= LoopLevel && ActiveWatchers) { ENTER; SAVETMPS; gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/MANIFEST' '/usr/tmp/mp4886.d/new/Event-0.80/MANIFEST' Index: ./MANIFEST --- ./MANIFEST Mon Nov 13 13:25:15 2000 +++ ./MANIFEST Tue Nov 28 13:44:41 2000 @@ -34,6 +34,7 @@ demo/repeat.t demo/semaphore.pm lib/Event.pm lib/Event.pod +lib/Event/typemap lib/Event/EventAPI.h lib/Event/MakeMaker.pm lib/Event/Watcher.pm @@ -68,6 +69,5 @@ t/timeout_cb.t t/timer.t t/unconfigured.t t/var.t -typemap util/bench.pl util/filehandle.txt gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/Makefile.PL' '/usr/tmp/mp4886.d/new/Event-0.80/Makefile.PL' Index: ./Makefile.PL --- ./Makefile.PL Tue Jun 13 11:24:23 2000 +++ ./Makefile.PL Tue Nov 28 13:44:41 2000 @@ -11,6 +11,7 @@ push @Safe, CC => 'insure', LD => 'insur my @opt=(PREREQ_PM => { Test => 1 }, VERSION_FROM => "./lib/Event.pm", NAME => "Event", + TYPEMAPS => ['./lib/Event/typemap'], INC => '-Ic -Ilib/Event', H => [glob("c/*"), glob("*.h"), "lib/Event/EventAPI.h"], @Safe, gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/c/ev.c' '/usr/tmp/mp4886.d/new/Event-0.80/c/ev.c' Index: ./c/ev.c --- ./c/ev.c Tue Jun 13 11:24:23 2000 +++ ./c/ev.c Tue Dec 5 09:13:06 2000 @@ -287,7 +287,7 @@ static void pe_event_invoke(pe_event *ev } } else { assert(ev->callback); - (* (void(*)(void*,pe_event*)) ev->callback)(ev->ext_data, ev); + (* (void(*)(pe_event*)) ev->callback)(ev); } LEAVE; gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/c/io.c' '/usr/tmp/mp4886.d/new/Event-0.80/c/io.c' Index: ./c/io.c --- ./c/io.c Tue Aug 29 12:50:12 2000 +++ ./c/io.c Wed Dec 6 17:04:31 2000 @@ -126,7 +126,7 @@ static void pe_io_reset_handle(pe_watche WKEYMETH(_io_poll) { pe_io *io = (pe_io*)ev; if (nval) { - int nev = sv_2events_mask(nval, PE_R|PE_W|PE_E); + int nev = sv_2events_mask(nval, PE_R|PE_W|PE_E|PE_T); if (io->timeout) nev |= PE_T; else nev &= ~PE_T; if (io->poll != nev) { gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/c/typemap.c' '/usr/tmp/mp4886.d/new/Event-0.80/c/typemap.c' Index: ./c/typemap.c --- ./c/typemap.c Tue Jun 13 11:24:24 2000 +++ ./c/typemap.c Tue Dec 5 16:26:33 2000 @@ -34,7 +34,7 @@ static SV *wrap_watcher(void *ptr, HV *s return ref; } -static SV *watcher_2sv(pe_watcher *wa) { /**SLOW IS OKAY**/ +SV *watcher_2sv(pe_watcher *wa) { /**SLOW IS OKAY**/ assert(!WaDESTROYED(wa)); if (!wa->mysv) { wa->mysv = wrap_watcher(wa, wa->vtbl->stash, 0); @@ -47,7 +47,7 @@ static SV *watcher_2sv(pe_watcher *wa) { return SvREFCNT_inc(sv_2mortal(wa->mysv)); } -static void* sv_2watcher(SV *sv) { +void* sv_2watcher(SV *sv) { MAGIC *mg; SV *origsv = sv; if (!sv || !SvROK(sv)) @@ -74,7 +74,7 @@ static void* sv_2watcher(SV *sv) { is deallocated (or, more likely, recycled). */ -static SV *event_2sv(pe_event *ev) { /**MAKE FAST**/ +SV *event_2sv(pe_event *ev) { /**MAKE FAST**/ if (!ev->mysv) { SV *rv = newSV(0); SV *sv = newSVrv(rv,0); @@ -91,7 +91,7 @@ static SV *event_2sv(pe_event *ev) { /** return SvREFCNT_inc(sv_2mortal(ev->mysv)); } -static void *sv_2event(SV *sv) { +void *sv_2event(SV *sv) { void *ptr; assert(sv); assert(SvROK(sv)); @@ -106,7 +106,7 @@ static void *sv_2event(SV *sv) { #define VERIFYINTERVAL(name, f) \ STMT_START { double ign; sv_2interval(name, f, &ign); } STMT_END -static int sv_2interval(char *label, SV *in, double *out) { +int sv_2interval(char *label, SV *in, double *out) { SV *sv = in; if (!sv) return 0; if (SvGMAGICAL(sv)) @@ -137,7 +137,7 @@ static int sv_2interval(char *label, SV return 1; } -static SV* events_mask_2sv(int mask) { +SV* events_mask_2sv(int mask) { STRLEN len; SV *ret = newSV(0); SvUPGRADE(ret, SVt_PVIV); @@ -151,7 +151,7 @@ static SV* events_mask_2sv(int mask) { return ret; } -static int sv_2events_mask(SV *sv, int bits) { +int sv_2events_mask(SV *sv, int bits) { if (SvPOK(sv)) { UV got=0; int xx; gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/lib/Event.pm' '/usr/tmp/mp4886.d/new/Event-0.80/lib/Event.pm' Index: ./lib/Event.pm --- ./lib/Event.pm Fri Nov 17 17:11:16 2000 +++ ./lib/Event.pm Tue Dec 5 09:19:58 2000 @@ -13,7 +13,7 @@ use Carp; eval { require Carp::Heavy; }; # work around perl_call_pv bug XXX use vars qw($VERSION @EXPORT_OK $API $DebugLevel $Eval $DIED $Now); -$VERSION = '0.79'; +$VERSION = '0.80'; # If we inherit DynaLoader then we inherit AutoLoader; Bletch! require DynaLoader; @@ -64,8 +64,12 @@ sub AUTOLOAD { sub default_exception_handler { my ($run,$err) = @_; - my $desc = $run? $run->w->desc : '?'; - my $m = "Event: trapped error in '$desc': $err"; + my $desc = '?'; + my $w; + if ($run and ($w = $run->w)) { + $desc = "`".$w->desc."'"; + } + my $m = "Event: trapped error in $desc: $err"; $m .= "\n" if $m !~ m/\n$/; warn $m; #Carp::cluck "Event: fatal error trapped in '$desc'"; @@ -178,5 +182,29 @@ use vars qw(@ISA); package Event; require Event::Watcher; _load_watcher($_) for qw(idle io signal timer var); + +# Provide hints to Inline.pm for usage: +# use Inline with => 'Event'; + +sub Inline { + my $language = shift; + if ($language ne 'C') { + warn "Warning: Event.pm does not provide Inline hints for the $language +language\n"; + return + } + + require Event::MakeMaker; + my $path = $Event::MakeMaker::installsitearch; + require Config; + my $so = $Config::Config{so}; + + return { + INC => "-I $path/Event", + TYPEMAPS => "$path/Event/typemap", + MYEXTLIB => "$path/auto/Event/Event.$so", + AUTO_INCLUDE => '#include "EventAPI.h"', + BOOT => 'I_EVENT_API("Inline");', + }; +} 1; gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/lib/Event.pod' '/usr/tmp/mp4886.d/new/Event-0.80/lib/Event.pod' Index: ./lib/Event.pod --- ./lib/Event.pod Wed Sep 6 11:24:32 2000 +++ ./lib/Event.pod Thu Dec 7 15:27:45 2000 @@ -131,7 +131,7 @@ customized by passing extra attributes t created, watcher objects are "started" and are waiting for events (see C<$event-E<gt>start> below). -L<NetServer::Portal> can display watchers in real-time, formatted +NetServer::Portal can display watchers in real-time, formatted similarly to the popular C<top> program. You may find this a useful aide for debugging. @@ -253,7 +253,7 @@ watchers should poll for writes unless y Extra attributes: at => $time, interval => $sec, hard => $bool The C<$time> and C<$sec> are in seconds. Fractional seconds may be -used if L<Time::HiRes> is available. The constructor also accepts an +used if Time::HiRes is available. The constructor also accepts an C<after> attribute for easier initialization. It might be useful to know the time at the start of today. You can find it with: @@ -420,7 +420,7 @@ Similar to a C<timeout>. The maximum number of seconds to spend in a callback. If a callback uses more time then it is aborted. Defaults to 1 sec. This feature -is normally disabled. See L<Event::Stats>. +is normally disabled. See Event::Stats. =item min => $seconds @@ -569,7 +569,10 @@ Or you can write your own. The handler If you do not want to continue looping after an error, you can do something like this: - $Event::DIED = sub { die &Event::verbose_exception_handler(@_) }; + $Event::DIED = sub { + Event::verbose_exception_handler(@_); + Event::unloop_all(); + }; =item * Event->add_hooks(key => sub { ... }, ...); @@ -593,7 +596,7 @@ Currently support hooks are detailed as =head1 C API Event also has a direct API for callbacks written exclusively in C. -See L<Event::MakeMaker>. +See Event::MakeMaker. =head1 WHAT ABOUT THREADS? @@ -680,7 +683,7 @@ There seems to be some sort of bug in th Explicit blessing to '' (assuming package main) during global destruction. -=head2 WHY MICROSOFT WINDOWS MIGHT BE FASTER THAN UNIX +=head2 WHY SELECT/POLL SUCKS This section is concerned with advanced kernel architecture. @@ -716,10 +719,25 @@ Event Loop. Just start coding! =head1 ALSO SEE -L<Time::HiRes>, L<NetServer::Portal>, L<IPC::LDT>, L<Event-tcp>, -and L<Time::Warp>. +=over 4 + +=item * Useful and Fun + +Time::HiRes, NetServer::Portal, Time::Warp + +=item * Message Passing + +COPE, IPC::LDT, Event-tcp -While Tk does not yet support Event, L<PerlQt> does. +=item * GUI + +While Tk does not yet support Event, PerlQt does. + +=item * C API + +Inline + +=back =head1 SUPPORT gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/lib/Event/EventAPI.h' '/usr/tmp/mp4886.d/new/Event-0.80/lib/Event/EventAPI.h' Index: ./lib/Event/EventAPI.h --- ./lib/Event/EventAPI.h Tue Aug 29 12:49:36 2000 +++ ./lib/Event/EventAPI.h Tue Dec 5 16:30:01 2000 @@ -176,7 +176,7 @@ struct pe_event_stats_vtbl { }; struct EventAPI { -#define EventAPI_VERSION 21 +#define EventAPI_VERSION 22 I32 Ver; /* EVENTS */ @@ -197,6 +197,7 @@ struct EventAPI { pe_signal *(*new_signal)(HV*, SV*); /* TIMEABLE */ + double (*NVtime)(); void (*tstart)(pe_timeable *); void (*tstop)(pe_timeable *); @@ -214,12 +215,13 @@ struct EventAPI { void *(*sv_2watcher)(SV *sv); SV *(*event_2sv)(pe_event *ev); void *(*sv_2event)(SV *sv); + int (*sv_2interval)(char *label, SV *in, double *out); + SV (*events_mask_2sv)(int mask); + int (*sv_2events_mask)(SV *sv, int bits); /* EVERYTHING ELSE */ void (*unloop)(SV *); - double (*NVtime)(); void (*unloop_all)(SV *); - int (*sv_2interval)(char *label, SV *in, double *out); }; static struct EventAPI *GEventAPI=0; gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/lib/Event/MakeMaker.pm' '/usr/tmp/mp4886.d/new/Event-0.80/lib/Event/MakeMaker.pm' Index: ./lib/Event/MakeMaker.pm --- ./lib/Event/MakeMaker.pm Tue Jun 13 11:24:24 2000 +++ ./lib/Event/MakeMaker.pm Tue Nov 28 13:44:41 2000 @@ -2,23 +2,29 @@ use strict; package Event::MakeMaker; use Config; use base 'Exporter'; -use vars qw(@EXPORT_OK); -@EXPORT_OK = qw(&event_args); +use vars qw(@EXPORT_OK $installsitearch); +@EXPORT_OK = qw(&event_args $installsitearch); -my $installsitearch = $Config{sitearch}; -$installsitearch =~ s,$Config{prefix},$ENV{PERL5PREFIX}, if - exists $ENV{PERL5PREFIX}; +my %opt; +for my $opt (split /:+/, $ENV{PERL_MM_OPT}) { + my ($k,$v) = split /=/, $opt; + $opt{$k} = $v; +} + +my $extra = $Config{sitearch}; +$extra =~ s,$Config{prefix},$opt{PREFIX}, if + exists $opt{PREFIX}; + +for my $d ($extra, @INC) { + if (-e "$d/Event/EventAPI.h") { + $installsitearch = $d; + last + } +} sub event_args { my %arg = @_; - my $dir; - for my $d ($installsitearch, @INC) { - if (-e "$d/Event/EventAPI.h") { - $dir = $d; - last - } - } - $arg{INC} .= " -I$dir/Event"; + $arg{INC} .= " -I$installsitearch/Event"; %arg; } gdiff -up /dev/null '/usr/tmp/mp4886.d/new/Event-0.80/lib/Event/typemap' Index: ./lib/Event/typemap --- ./lib/Event/typemap Wed Dec 31 19:00:00 1969 +++ ./lib/Event/typemap Tue Nov 28 13:44:41 2000 @@ -0,0 +1,20 @@ +TYPEMAP + +pe_watcher * O_WATCHER +pe_event * O_EVENT + +INPUT + +O_WATCHER + $var = ($type) sv_2watcher($arg) + +O_EVENT + $var = ($type) sv_2event($arg) + +OUTPUT + +O_WATCHER + croak("use watcher_2sv($var)") + +O_EVENT + croak("use event_2sv($var)") gdiff -up '/usr/tmp/mp4886.d/old/Event-0.79/t/callback.t' '/usr/tmp/mp4886.d/new/Event-0.80/t/callback.t' Index: ./t/callback.t --- ./t/callback.t Tue Jun 13 11:24:25 2000 +++ ./t/callback.t Tue Dec 5 09:19:09 2000 @@ -1,7 +1,7 @@ #!./perl -w use strict; -use Test; plan tests => 5; +use Test; plan tests => 6; use Event 0.65; my $invoked_method=0; @@ -29,7 +29,12 @@ ok $@, '/Callback/'; ok $run->w->desc, 'nomethod'; ok $err, '/object method/'; }; + my $warn=''; + local $SIG{__WARN__} = sub { + $warn .= $_[0]; + }; Event::loop(); + ok $warn, '/loop without active watchers/'; } ok $invoked_method, 3; #### End of Patch data #### #### ApplyPatch data follows #### # Data version : 1.0 # Date generated : Thu Dec 7 15:35:30 2000 # Generated by : makepatch 2.00 (2.0BETA) # Recurse directories : Yes # r 'typemap' 234 0 # p 'ChangeLog' 26539 976220213 0100444 # p 'Event.xs' 19023 976051826 0100444 # p 'MANIFEST' 883 975437081 0100444 # p 'Makefile.PL' 571 975437081 0100444 # p 'c/ev.c' 7509 976025586 0100444 # p 'c/io.c' 5344 976140271 0100444 # p 'c/typemap.c' 4417 976051593 0100444 # p 'lib/Event.pm' 4074 976025998 0100444 # p 'lib/Event.pod' 25103 976220865 0100444 # p 'lib/Event/EventAPI.h' 6043 976051801 0100444 # p 'lib/Event/MakeMaker.pm' 3275 975437081 0100444 # c 'lib/Event/typemap' 0 975437081 0100444 # p 't/callback.t' 684 976025949 0100444 #### End of ApplyPatch data #### #### End of Patch kit [created: Thu Dec 7 15:35:30 2000] #### #### Checksum: 3571 353285 43032 ####
