Fwd: CPAN Upload: JPRIT/Event-0.68.tar.gz
[email protected] (Joshua N Pritikin)
| Newsgroups | perl.loop |
|---|---|
| Message-ID | <[email protected]> |
----- Forwarded message from [email protected] ----- Date: Tue, 15 Feb 2000 21:59:57 +0100 Subject: CPAN Upload: JPRIT/Event-0.68.tar.gz From: [email protected] To: [email protected], [email protected] The uploaded file Event-0.68.tar.gz has entered CPAN as file: $CPAN/authors/id/JPRIT/Event-0.68.tar.gz size: 66194 bytes md5: cc5484a0759ac94ae0f83fecde182ba1 No action is required on your part Request entered by: JPRIT (Joshua N. Pritikin) Request entered on: Tue, 15 Feb 2000 20:58:33 GMT Request completed: Tue, 15 Feb 2000 20:59:57 GMT Virtually Yours, Id: paused,v 1.68 1999/10/22 14:39:12 k Exp k ----- End forwarded message ----- # This is a patch for Event-0.67 to update it to Event-0.68 # # 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 # 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: # touch 'demo/stdin.t' chmod 0444 'demo/stdin.t' # # This command terminates the shell and need not be executed manually. exit # #### End of Preamble #### #### Patch data follows #### gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/ChangeLog' '/usr/tmp/mp29431.d/new/Event-0.68/ChangeLog' Index: ./ChangeLog --- ./ChangeLog Wed Feb 9 16:10:47 2000 +++ ./ChangeLog Tue Feb 15 15:19:11 2000 @@ -1,3 +1,19 @@ +2000-02-15 Joshua Pritikin <[email protected]> + + * Release 0.68. + +2000-02-14 Joshua Pritikin <[email protected]> + + * More careful checking of + intervals. (suggested by [email protected]) + +2000-02-10 Joshua Pritikin <[email protected]> + + * Fix yet another typemap bug. ([email protected]) + + * Make io default to poll=r; more stringent start test; + fix demo/stdin.t (suggested by [email protected]) + 2000-02-09 Joshua Pritikin <[email protected]> * Release 0.67. Hopefully this release will prove stable. gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/Event.xs' '/usr/tmp/mp29431.d/new/Event-0.68/Event.xs' Index: ./Event.xs --- ./Event.xs Mon Feb 7 15:16:44 2000 +++ ./Event.xs Tue Feb 15 15:19:38 2000 @@ -23,6 +23,23 @@ extern "C" { # define whichsig Perl_whichsig /* ? */ #endif +/* lexical warnings -- waiting for appropriate magic from + [email protected] */ +#if 0 +static void Event_warn(const char* pat, ...) { + dTHX; + va_list args; + va_start(args, pat); + if (!ckWARN_d(WARN_ALL)) + return; + Perl_vwarner(aTHX_ WARN_ALL, pat, &args); + va_end(args); +} + +# undef warn +# define warn Event_warn +#endif + #ifdef croak # undef croak #endif gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/MANIFEST' '/usr/tmp/mp29431.d/new/Event-0.68/MANIFEST' Index: ./MANIFEST --- ./MANIFEST Wed Feb 9 08:51:53 2000 +++ ./MANIFEST Thu Feb 10 09:00:52 2000 @@ -22,12 +22,13 @@ c/typemap.c c/unix_io.c c/var.c c/watcher.c +demo/group.t demo/in.pl demo/inactivity.t -demo/group.t demo/process.pm demo/readline.t demo/spin_io.t +demo/stdin.t demo/variable_repeater.t lib/Event.pm lib/Event.pod gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/TODO' '/usr/tmp/mp29431.d/new/Event-0.68/TODO' Index: ./TODO --- ./TODO Tue Feb 8 16:57:12 2000 +++ ./TODO Tue Feb 15 15:09:02 2000 @@ -1,10 +1,12 @@ +finish up lexical warnings + deprecate inactivity completely? -add timeout for var watchers? +omitting parked=>1 should be a warning, not an error -increase the number of priority levels? - ASYNC 0 1 2 3 4 5 6 7 8 9 IDLE - HIGH NORM +attribute set methods should return the new value + +add timeout for var watchers? find owner for Win32 port @@ -12,6 +14,14 @@ documentation how to design new event types (in perl) how to design new event types (in C)?? [email protected] signal discussion: + The API rsignal overrides the current signal handler. If the signal + watcher is cancelled (or otherwise disabled) then rsignal is reset to + SIG_DFL. Maybe the original handler + should be restored. On the other hand, assignment to %SIG will mess + up Event watchers so maybe Event should refuse to watch a signal if a + handler is already installed. + optimization update io event-mask without invalidating cache determine IntervalEpsilon dynamically & make available from perl @@ -19,22 +29,18 @@ optimization queue events from both sides? try to hoist system calls from the inner loop +there seems to be some sort of bug in the shutdown phase + Attempt to free unreferenced scalar during global destruction. + Use of uninitialized value during global destruction. + Explicit blessing to '' (assuming package main) during global + destruction. + rethink pe_check_recovery & ENTER/LEAVE points [email protected] signal discussion: - The API rsignal overrides the current signal handler. If the signal - watcher is cancelled (or otherwise disabled) then rsignal is reset to - SIG_DFL. Maybe the original handler - should be restored. On the other hand, assignment to %SIG will mess - up Event watchers so maybe Event should refuse to watch a signal if a - handler is already installed. - -there seems to be some sort of bug in the shutdown phase -> Attempt to free unreferenced scalar during global destruction. -> Use of uninitialized value during global destruction. -> Explicit blessing to '' (assuming package main) during global -> destruction. +increase the number of priority levels? + ASYNC 0 1 2 3 4 5 6 7 8 9 IDLE + HIGH NORM loop StarvePrio? gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/c/group.c' '/usr/tmp/mp29431.d/new/Event-0.68/c/group.c' Index: ./c/group.c --- ./c/group.c Wed Feb 9 12:29:57 2000 +++ ./c/group.c Tue Feb 15 15:17:22 2000 @@ -35,7 +35,7 @@ static char *pe_group_start(pe_watcher * if (!ev->callback) return "without callback"; - if (!sv_2interval(gp->timeout, &timeout)) + if (!sv_2interval("group", gp->timeout, &timeout)) return "repeating group has no timeout"; gp->since = WaHARD(ev)? gp->tm.at : NVtime(); @@ -62,7 +62,7 @@ static void pe_group_alarm(pe_watcher *w } } - if (!sv_2interval(gp->timeout, &timeout)) + if (!sv_2interval("group", gp->timeout, &timeout)) croak("Event: can't extract timeout"); /* impossible */ remaining = gp->since + timeout - now; @@ -125,6 +125,7 @@ WKEYMETH(_group_timeout) { SV *old = gp->timeout; gp->timeout = SvREFCNT_inc(nval); SvREFCNT_dec(old); + VERIFYINTERVAL("group", gp->timeout); /* recalc expiration XXX */ } } gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/c/idle.c' '/usr/tmp/mp29431.d/new/Event-0.68/c/idle.c' Index: ./c/idle.c --- ./c/idle.c Mon Feb 7 10:15:08 2000 +++ ./c/idle.c Tue Feb 15 15:17:55 2000 @@ -36,7 +36,7 @@ static char *pe_idle_start(pe_watcher *e WaCBTIME_off(ev); if (!repeating) ev->cbtime = NVtime(); now = WaHARD(ev)? ev->cbtime : NVtime(); - if (sv_2interval(ip->min_interval, &min)) { + if (sv_2interval("min", ip->min_interval, &min)) { ip->tm.at = min + now; pe_timeable_start(&ip->tm); D_IDLE(warn("min %.2f setup '%s'\n", min, SvPV(ev->desc,na))); @@ -44,7 +44,7 @@ static char *pe_idle_start(pe_watcher *e else { PE_RING_UNSHIFT(&ip->iring, &Idle); D_IDLE(warn("idle '%s'\n", SvPV(ev->desc,na))); - if (sv_2interval(ip->max_interval, &max)) { + if (sv_2interval("max", ip->max_interval, &max)) { D_IDLE(warn("max %.2f setup '%s'\n", max, SvPV(ev->desc,na))); ip->tm.at = max + now; pe_timeable_start(&ip->tm); @@ -58,7 +58,7 @@ static void pe_idle_alarm(pe_watcher *wa double min,max,left; pe_idle *ip = (pe_idle*) wa; pe_timeable_stop(&ip->tm); - if (sv_2interval(ip->min_interval, &min)) { + if (sv_2interval("min", ip->min_interval, &min)) { left = wa->cbtime + min - now; if (left > IntervalEpsilon) { ++TimeoutTooEarly; @@ -72,7 +72,7 @@ static void pe_idle_alarm(pe_watcher *wa PE_RING_UNSHIFT(&ip->iring, &Idle); D_IDLE(warn("idle '%s'\n", SvPV(wa->desc,na))); } - if (sv_2interval(ip->max_interval, &max)) { + if (sv_2interval("max", ip->max_interval, &max)) { left = wa->cbtime + max - now; if (left < IntervalEpsilon) { pe_event *ev; @@ -108,6 +108,7 @@ WKEYMETH(_idle_max_interval) { SV *old = ip->max_interval; ip->max_interval = SvREFCNT_inc(nval); if (old) SvREFCNT_dec(old); + VERIFYINTERVAL("max", ip->max_interval); } } @@ -121,6 +122,7 @@ WKEYMETH(_idle_min_interval) { SV *old = ip->min_interval; ip->min_interval = SvREFCNT_inc(nval); if (old) SvREFCNT_dec(old); + VERIFYINTERVAL("min", ip->min_interval); } } gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/c/io.c' '/usr/tmp/mp29431.d/new/Event-0.68/c/io.c' Index: ./c/io.c --- ./c/io.c Tue Feb 8 17:20:49 2000 +++ ./c/io.c Thu Feb 10 08:27:22 2000 @@ -14,7 +14,7 @@ static pe_watcher *pe_io_allocate(HV *st ev->fd = -1; ev->timeout = 0; ev->handle = &PL_sv_undef; - ev->poll = 0; + ev->poll = PE_R; ev->tm_callback = 0; ev->tm_ext_data = 0; WaINVOKE1_off(ev); @@ -43,7 +43,7 @@ static char *pe_io_start(pe_watcher *_ev assigning anything to the 'handle'. This should be more officially supported but maybe it is too unix specific. */ - if (ev->fd >= 0) { + if (ev->fd >= 0 && (ev->poll & ~PE_T)) { if (!ev->base.callback) return "without io callback"; PE_RING_UNSHIFT(&ev->ioring, &IOWatch); @@ -132,7 +132,7 @@ WKEYMETH(_io_poll) { XPUSHs(sv_2mortal(events_mask_2sv(io->poll))); PUTBACK; } else { - int nev = sv_2events_mask(nval, PE_R|PE_W|PE_E|PE_T); + int nev = sv_2events_mask(nval, PE_R|PE_W|PE_E); if (io->timeout) nev |= PE_T; else nev &= ~PE_T; if (io->poll != nev) { gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/c/timer.c' '/usr/tmp/mp29431.d/new/Event-0.68/c/timer.c' Index: ./c/timer.c --- ./c/timer.c Tue Feb 8 17:22:15 2000 +++ ./c/timer.c Tue Feb 15 15:16:56 2000 @@ -29,7 +29,7 @@ static char *pe_timer_start(pe_watcher * the appropriate time increment. */ double interval; - if (!sv_2interval(tm->interval, &interval)) + if (!sv_2interval("timer", tm->interval, &interval)) return "repeating timer has no interval"; tm->tm.at = interval + (WaHARD(ev)? tm->tm.at : NVtime()); @@ -74,6 +74,7 @@ WKEYMETH(_timer_interval) { SV *old = tp->interval; tp->interval = SvREFCNT_inc(nval); SvREFCNT_dec(old); + VERIFYINTERVAL("timer", tp->interval); /* recalc expiration XXX */ } } gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/c/typemap.c' '/usr/tmp/mp29431.d/new/Event-0.68/c/typemap.c' Index: ./c/typemap.c --- ./c/typemap.c Wed Feb 9 08:47:22 2000 +++ ./c/typemap.c Tue Feb 15 15:18:40 2000 @@ -55,6 +55,8 @@ static void* sv_2watcher(SV *sv) { sv = SvRV(sv); if (SvTYPE(sv) < SVt_PVMG) croak("sv_2watcher: not a watcher"); + if (!SvOBJECT(sv)) + croak("sv_2watcher: not an object"); mg = mg_find(sv, '~'); if (mg) { if (mg->mg_private != MG_PRIVATE_CODE) { @@ -62,8 +64,7 @@ static void* sv_2watcher(SV *sv) { } return (void*) mg->mg_obj; } - croak("Attempt to use destroyed object (RV=0x%x %s=0x%x)", - origsv, HvNAME(SvSTASH(sv)), sv); + croak("sv_2watcher: can't decode SV=0x%x", origsv); return 0; } @@ -102,7 +103,10 @@ static void *sv_2event(SV *sv) { /***************************************************************/ -static int sv_2interval(SV *in, double *out) { +#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) { SV *sv = in; if (!sv) return 0; if (SvGMAGICAL(sv)) @@ -110,7 +114,10 @@ static int sv_2interval(SV *in, double * if (!SvOK(sv)) return 0; if (SvROK(sv)) sv = SvRV(sv); - if (SvNOK(sv)) { + if (!SvOK(sv)) { + warn("Event: %s interval undef", label); + *out = 0; + } else if (SvNOK(sv)) { *out = SvNVX(sv); } else if (SvIOK(sv)) { *out = SvIVX(sv); @@ -118,11 +125,13 @@ static int sv_2interval(SV *in, double * *out = SvNV(sv); } else { sv_dump(in); - croak("Interval must be a number of reference to a number"); + croak("Event: %s interval must be a number or reference to a number", + label); return 0; } if (*out < 0) { - warn("Event: negative timeout (%.2f) clipped to zero", *out); + warn("Event: %s has negative timeout %.2f (clipped to zero)", + label, *out); *out = 0; } return 1; gdiff -up /dev/null '/usr/tmp/mp29431.d/new/Event-0.68/demo/stdin.t' Index: ./demo/stdin.t --- ./demo/stdin.t Wed Dec 31 19:00:00 1969 +++ ./demo/stdin.t Thu Feb 10 08:08:00 2000 @@ -0,0 +1,7 @@ +use Event; + +$w=Event->io(fd=>\*STDIN, cb=>sub {<STDIN>; warn "CALLED!\n";}); + +print "io default poll attribute:", $w->poll, "\n"; + +Event::loop(); gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/lib/Event.pm' '/usr/tmp/mp29431.d/new/Event-0.68/lib/Event.pm' Index: ./lib/Event.pm --- ./lib/Event.pm Wed Feb 9 16:11:04 2000 +++ ./lib/Event.pm Tue Feb 15 15:09:11 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.67'; +$VERSION = '0.68'; # If we inherit DynaLoader then we inherit AutoLoader; Bletch! require DynaLoader; gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/ppport.h' '/usr/tmp/mp29431.d/new/Event-0.68/ppport.h' Index: ./ppport.h --- ./ppport.h Wed Dec 22 17:00:07 1999 +++ ./ppport.h Mon Feb 14 09:02:47 2000 @@ -187,6 +187,7 @@ __DATA__ #ifndef dTHX # define dTHX dTHR # define pTHX_ +# define aTHX_ #endif #ifndef boolSV gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/t/callback.t' '/usr/tmp/mp29431.d/new/Event-0.68/t/callback.t' Index: ./t/callback.t --- ./t/callback.t Tue Feb 8 17:46:38 2000 +++ ./t/callback.t Tue Feb 15 15:49:26 2000 @@ -1,7 +1,7 @@ #!./perl -w use strict; -use Test; plan tests => 3; +use Test; plan tests => 5; use Event 0.65; my $invoked_method=0; @@ -17,11 +17,19 @@ Event->timer(after => 0, cb => [$main, ' local $SIG{__WARN__} = sub { ok $_[0], '/nomethod/'; }; - Event->timer(after => 0, cb => [$main, 'nomethod'])->cancel; + Event->timer(desc => 'nomethod', after => 0, cb => [$main, 'nomethod']); } eval { Event->timer(after => 0, cb => ['main']); }; ok $@, '/Callback/'; -Event::loop(); +{ + local $Event::DIED = sub { + my ($run,$err) = @_; + ok $run->w->desc, 'nomethod'; + ok $err, '/object method/'; + }; + Event::loop(); +} + ok $invoked_method, 3; gdiff -up '/usr/tmp/mp29431.d/old/Event-0.67/t/io.t' '/usr/tmp/mp29431.d/new/Event-0.68/t/io.t' Index: ./t/io.t --- ./t/io.t Fri Feb 4 08:15:51 2000 +++ ./t/io.t Thu Feb 10 08:38:04 2000 @@ -8,12 +8,18 @@ BEGIN { } } -use Test; plan tests => 6; +use Test; plan tests => 8; use Event qw(loop unloop); use Event::Watcher qw(R W); use Symbol; #$Event::DebugLevel = 3; + +eval { Event->io }; +ok $@, "/nothing to watch/"; + +eval { Event->io(fd => \*STDIN, cb => \&die, poll => 0) }; +ok $@, "/nothing to watch/"; my $noticed_bogus_fd=0; my $bogus_timeout=0; #### End of Patch data #### #### ApplyPatch data follows #### # Data version : 1.0 # Date generated : Tue Feb 15 15:57:49 2000 # Generated by : makepatch 2.00 (2.0BETA) # Recurse directories : Yes # p 'ChangeLog' 22650 950645951 0100444 # p 'Event.xs' 18104 950645978 0100444 # p 'MANIFEST' 906 950191252 0100444 # p 'TODO' 1620 950645342 0100444 # p 'c/group.c' 3709 950645842 0100444 # p 'c/idle.c' 3573 950645875 0100444 # p 'c/io.c' 5369 950189242 0100444 # p 'c/timer.c' 2173 950645816 0100444 # p 'c/typemap.c' 4161 950645920 0100444 # c 'demo/stdin.t' 0 950188080 0100444 # p 'lib/Event.pm' 4254 950645351 0100444 # p 'ppport.h' 7852 950536967 0100444 # p 't/callback.t' 543 950647766 0100444 # p 't/io.t' 1650 950189884 0100444 #### End of ApplyPatch data #### #### End of Patch kit [created: Tue Feb 15 15:57:49 2000] #### #### Checksum: 490 16017 42654 #### -- "Never ascribe to malice that which can be explained by stupidity." via, but not speaking for Deutsche Bank