Wow, what a nightmare!  This bug affects 0.61-0.65!

----- Forwarded message from [EMAIL PROTECTED] -----

Date: Tue, 8 Feb 2000 23:00:29 +0100
Subject: CPAN Upload: JPRIT/Event-0.66.tar.gz
Sender: [EMAIL PROTECTED]
From: [EMAIL PROTECTED]
To: [EMAIL PROTECTED],
    [EMAIL PROTECTED]

The uploaded file

    Event-0.66.tar.gz

has entered CPAN as

  file: $CPAN/authors/id/JPRIT/Event-0.66.tar.gz
  size: 65126 bytes
   md5: c2e690c473191b321e99cd399f2f6ee7

No action is required on your part
Request entered by: JPRIT (Joshua N. Pritikin)
Request entered on: Tue, 08 Feb 2000 21:59:34 GMT
Request completed:  Tue, 08 Feb 2000 22:00:29 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.65 to update it to Event-0.66
# 
# 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.
# STEP 2: Run the 'patch' program with this file as input.
#
#### End of Preamble ####

#### Patch data follows ####
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/ChangeLog' 
'/usr/tmp/mp15127.d/new/Event-0.66/ChangeLog'
Index: ./ChangeLog
--- ./ChangeLog Mon Feb  7 16:21:58 2000
+++ ./ChangeLog Tue Feb  8 16:53:18 2000
@@ -1,3 +1,14 @@
+2000-02-08  Joshua Pritikin  <[EMAIL PROTECTED]>
+
+       * Release 0.66.
+
+       * Fix horrendously subtle bug uncovered by Event-tcp.
+
+       * Eliminate (hopefully all) silent failures.
+
+       * Restrict var watchers to
+       scalars. ([EMAIL PROTECTED] is too creative)
+
 2000-02-07  Joshua Pritikin  <[EMAIL PROTECTED]>
 
        * Release 0.65.
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/ev.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/ev.c'
Index: ./c/ev.c
--- ./c/ev.c    Mon Feb  7 13:26:55 2000
+++ ./c/ev.c    Tue Feb  8 15:46:37 2000
@@ -148,8 +148,13 @@ static void pe_event_postCB(pe_cbframe *
     pe_event *ev = fp->ev;
     pe_watcher *wa = ev->up;
     --CurCBFrame;
-    if (WaACTIVE(wa) && WaINVOKE1(wa) && WaREPEAT(wa))
-       pe_watcher_on(wa, 1);
+    if (WaACTIVE(wa) && WaINVOKE1(wa) && WaREPEAT(wa)) {
+       char *excuse = pe_watcher_on(wa, 1);
+       if (SvIV(DebugLevel) && excuse) {
+           STRLEN n_a;
+           warn("Event: can't restart '%s' %s", SvPV(wa->desc,n_a), excuse);
+       }
+    }
     if (Estat.on) {
        if (fp->stats) {
            Estat.scrub(fp->stats, wa);
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/io.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/io.c'
Index: ./c/io.c
--- ./c/io.c    Mon Feb  7 10:17:15 2000
+++ ./c/io.c    Tue Feb  8 16:51:21 2000
@@ -45,15 +45,17 @@ static char *pe_io_start(pe_watcher *_ev
 
     if (ev->fd >= 0) {
        if (!ev->base.callback)
-           return "Without io callback";
+           return "without io callback";
        PE_RING_UNSHIFT(&ev->ioring, &IOWatch);
        ++IOWatchCount;
        IOWatch_OK = 0;
        ++ok;
     }
     if (ev->timeout) {
-       if (!ev->base.callback && !ev->tm_callback)
+       if (!ev->base.callback && !ev->tm_callback) {
+           assert(!ok);
            return "without timeout callback";
+       }
        WaCBTIME_on(ev);
        ev->poll |= PE_T;
        ev->tm.at = NVtime() + ev->timeout;  /* too early okay */
@@ -110,9 +112,15 @@ static void pe_io_alarm(pe_watcher *_wa,
 }
 
 static void _io_restart(pe_watcher *ev) {
+    char *excuse;
     if (!WaPOLLING(ev)) return;
     pe_watcher_off(ev);
-    pe_watcher_on(ev, 0); /* ignore failure */
+    excuse = pe_watcher_on(ev, 0);
+    if (SvIV(DebugLevel) && excuse) {
+       STRLEN n_a;
+       warn("Event: can't restart '%s' %s",
+            SvPV(ev->desc, n_a), excuse);
+    }
 }
 
 static void pe_io_reset_handle(pe_watcher *ev) {  /* used by unix_io */
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/signal.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/signal.c'
Index: ./c/signal.c
--- ./c/signal.c        Mon Feb  7 10:17:55 2000
+++ ./c/signal.c        Tue Feb  8 15:47:49 2000
@@ -83,9 +83,17 @@ WKEYMETH(_signal_signal) {
            croak("Unrecognized signal '%s'", SvPV(nval, n_a));
        if (!PE_SIGVALID(sig))
            croak("Signal '%s' cannot be caught", SvPV(nval, n_a));
+       /* factor XXX */
        if (active) pe_watcher_off(ev);
        sg->signal = sig;
-       if (active) pe_watcher_on(ev, 0);
+       if (active) {
+           char *excuse = pe_watcher_on(ev, 0);
+           if (SvIV(DebugLevel) && excuse) {
+               STRLEN n_a;
+               warn("Event: can't restart '%s' %s",
+                    SvPV(ev->desc, n_a), excuse);
+           }
+       }
     }
 }
 
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/timer.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/timer.c'
Index: ./c/timer.c
--- ./c/timer.c Mon Feb  7 13:24:54 2000
+++ ./c/timer.c Tue Feb  8 15:46:55 2000
@@ -57,10 +57,18 @@ WKEYMETH(_timer_at) {
        XPUSHs(sv_2mortal(newSVnv(tp->tm.at)));
        PUTBACK;
     } else {
+       /* factor XXX */
        int active = WaPOLLING(ev);
        if (active) pe_watcher_off(ev);
        tp->tm.at = SvNV(nval);
-       if (active) pe_watcher_on(ev, 0);
+       if (active) {
+           char *excuse = pe_watcher_on(ev, 0);
+           if (SvIV(DebugLevel) && excuse) {
+               STRLEN n_a;
+               warn("Event: can't restart '%s' %s",
+                    SvPV(ev->desc,n_a), excuse);
+           }
+       }
     }
 }
 
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/unix_io.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/unix_io.c'
Index: ./c/unix_io.c
--- ./c/unix_io.c       Wed Jan 19 10:40:29 2000
+++ ./c/unix_io.c       Tue Feb  8 16:51:45 2000
@@ -87,12 +87,12 @@ static void pe_sys_multiplex(double time
        while (ev) {
            int fd = ev->fd;
            ev->xref = -1;
-           if (fd >= 0) {
+           assert(fd >= 0); {
                int bits=0;
                if (ev->poll & PE_R) bits |= (POLLIN | POLLRDNORM | POLLHUP);
                if (ev->poll & PE_W) bits |= (POLLOUT |POLLWRNORM |POLLWRBAND);
                if (ev->poll & PE_E) bits |= (POLLRDBAND | POLLPRI);
-               if (bits) {
+               assert(bits); {
                    int ok=0;;
                    for (xx = 0; xx < Nfds; xx++) {
                        if (Pollfd[xx].fd == fd) { ok=1; break; }
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/var.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/var.c'
Index: ./c/var.c
--- ./c/var.c   Mon Feb  7 10:18:42 2000
+++ ./c/var.c   Tue Feb  8 15:48:10 2000
@@ -127,9 +127,14 @@ static void pe_var_stop(pe_watcher *_ev)
 }
 
 static void _var_restart(pe_watcher *ev) {
+    char *excuse;
     if (!WaPOLLING(ev)) return;
     pe_watcher_off(ev);
-    pe_watcher_on(ev, 0);
+    excuse = pe_watcher_on(ev, 0);
+    if (SvIV(DebugLevel) && excuse) {
+       STRLEN n_a;
+       warn("Event: can't restart '%s' %s", SvPV(ev->desc, n_a), excuse);
+    }
 }
 
 WKEYMETH(_var_events) {
@@ -155,9 +160,19 @@ WKEYMETH(_var_variable) {
        int active = WaPOLLING(ev);
        if (!SvROK(nval))
            croak("Expecting a reference");
+       if (SvTYPE(SvRV(nval)) > SVt_PVMG)
+           croak("Var watchers can only watch plain vanilla scalars");
+       /* factor XXX */
        if (active) pe_watcher_off(ev);
        vp->variable = SvREFCNT_inc(nval);
-       if (active) pe_watcher_on(ev, 0);
+       if (active) {
+           char *excuse = pe_watcher_on(ev, 0);
+           if (SvIV(DebugLevel) && excuse) {
+               STRLEN n_a;
+               warn("Event: can't restart '%s' %s",
+                    SvPV(ev->desc,n_a), excuse);
+           }
+       }
        SvREFCNT_dec(old);
     }
 }
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/c/watcher.c' 
'/usr/tmp/mp15127.d/new/Event-0.66/c/watcher.c'
Index: ./c/watcher.c
--- ./c/watcher.c       Mon Feb  7 13:26:35 2000
+++ ./c/watcher.c       Tue Feb  8 16:46:59 2000
@@ -310,8 +310,11 @@ static void pe_watcher_resume(pe_watcher
     if (WaDEBUGx(ev) >= 4)
        warn("Event: resume '%s'%s%s\n", SvPV(ev->desc,n_a),
             WaACTIVE(ev)?" ACTIVE":"");
-    if (WaACTIVE(ev))
-       pe_watcher_on(ev, 0);  /* ignore failure */
+    if (WaACTIVE(ev)) {
+       char *excuse = pe_watcher_on(ev, 0);
+       if (excuse)
+           warn("Event: can't resume '%s' %s", SvPV(ev->desc,n_a), excuse);
+    }
 }
 
 static char *pe_watcher_on(pe_watcher *wa, int repeat) {
@@ -323,7 +326,9 @@ static char *pe_watcher_on(pe_watcher *w
              SvPV(wa->desc,n_a));
     }
     excuse = (*wa->vtbl->start)(wa, repeat);
-    if (!excuse)
+    if (excuse)
+       pe_watcher_stop(wa, 1); /* update flags! */
+    else
        WaPOLLING_on(wa); /* must happen nowhere else!! */
     return excuse;
 }
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/lib/Event.pm' 
'/usr/tmp/mp15127.d/new/Event-0.66/lib/Event.pm'
Index: ./lib/Event.pm
--- ./lib/Event.pm      Mon Feb  7 16:22:05 2000
+++ ./lib/Event.pm      Tue Feb  8 16:53:36 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.65';
+$VERSION = '0.66';
 
 # If we inherit DynaLoader then we inherit AutoLoader; Bletch!
 require DynaLoader;
gdiff -up '/usr/tmp/mp15127.d/old/Event-0.65/lib/Event.pod' 
'/usr/tmp/mp15127.d/new/Event-0.66/lib/Event.pod'
Index: ./lib/Event.pod
--- ./lib/Event.pod     Mon Feb  7 13:08:50 2000
+++ ./lib/Event.pod     Tue Feb  8 11:42:40 2000
@@ -74,7 +74,10 @@ Watchers are returned in order of most r
 
 =item all_idle()
 
-Return all watchers on the idle queue.
+If the event queue is very busy, all the idle watchers will sit on the
+idle queue waiting to run.  However, be aware that if an idle watcher
+has the C<max> attribute set then it will queue a normal event when
+its C<max> wait time is exceeded.
 
 =back
 
@@ -214,7 +217,9 @@ Otherwise, they might be deprecated.
 Extra attributes: var => \$var, poll => 'rw'
 
 Var watchers generate events when the given variable is read from or
-written to.
+written to.  As perl is a concise language, it is often difficult to
+predict when a variable will be read.  For this reason, variable
+watchers should poll for writes unless you know what you are doing.
 
 =item timer
 
#### End of Patch data ####

#### ApplyPatch data follows ####
# Data version        : 1.0
# Date generated      : Tue Feb  8 16:58:46 2000
# Generated by        : makepatch 2.00 (2.0BETA)
# Recurse directories : Yes
# p 'ChangeLog' 22088 950046798 0100444
# p 'c/ev.c' 7857 950042797 0100444
# p 'c/io.c' 5367 950046681 0100444
# p 'c/signal.c' 3845 950042869 0100444
# p 'c/timer.c' 2173 950042815 0100444
# p 'c/unix_io.c' 6439 950046705 0100444
# p 'c/var.c' 4139 950042890 0100444
# p 'c/watcher.c' 8948 950046419 0100444
# p 'lib/Event.pm' 4254 950046816 0100444
# p 'lib/Event.pod' 21914 950028160 0100444
#### End of ApplyPatch data ####

#### End of Patch kit [created: Tue Feb  8 16:58:46 2000] ####
#### Checksum: 294 9736 6843 ####

-- 
"May the best description of competition prevail."
           via, but not speaking for Deutsche Bank

Reply via email to