Fwd: CPAN Upload: JPRIT/Event-0.76.tar.gz

[email protected] (Joshua N Pritikin)
Newsgroups perl.loop
Message-ID <[email protected]>
----- Forwarded message from [email protected] -----

Date: Wed, 26 Apr 2000 22:19:21 +0200
Subject: CPAN Upload: JPRIT/Event-0.76.tar.gz
From: [email protected]
To: [email protected],
    [email protected]
Reply-To: [email protected]

The uploaded file

    Event-0.76.tar.gz

has entered CPAN as

  file: $CPAN/authors/id/JPRIT/Event-0.76.tar.gz
  size: 148425 bytes
   md5: d6c1cc491093882e8f8e7db05166328c

No action is required on your part
Request entered by: JPRIT (Joshua N. Pritikin)
Request entered on: Wed, 26 Apr 2000 20:19:08 GMT
Request completed:  Wed, 26 Apr 2000 20:19:21 GMT

	Virtually Yours,
	Id: paused,v 1.68 1999/10/22 14:39:12 k Exp k 

# This is a patch for Event-0.75 to update it to Event-0.76
# 
# 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/mp5304.d/old/Event-0.75/ChangeLog' '/usr/tmp/mp5304.d/new/Event-0.76/ChangeLog'
Index: ./ChangeLog
--- ./ChangeLog	Mon Apr 24 09:43:08 2000
+++ ./ChangeLog	Wed Apr 26 13:13:37 2000
@@ -1,3 +1,16 @@
+2000-04-26  Joshua Pritikin  <[email protected]>
+
+	* Release 0.76.
+
+	* Fixed a horribly subtle bug in the handling of reentrant
+ 	INVOKE1-style watchers (e.g. a timer) in nested loops.  Added
+ 	test.  This change also removes at least one conditional from a
+ 	hot code path.
+
+2000-04-25  Joshua Pritikin  <[email protected]>
+
+	* EventAPI += unloop.
+
 2000-04-24  Joshua Pritikin  <[email protected]>
 
 	* Release 0.75.
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/Event.xs' '/usr/tmp/mp5304.d/new/Event-0.76/Event.xs'
Index: ./Event.xs
--- ./Event.xs	Tue Mar 21 09:07:23 2000
+++ ./Event.xs	Wed Apr 26 16:08:04 2000
@@ -306,6 +306,7 @@ BOOT:
       api->sv_2watcher = sv_2watcher;
       api->event_2sv = event_2sv;
       api->sv_2event = sv_2event;
+      api->unloop = pe_unloop;
       apisv = perl_get_sv("Event::API", 1);
       sv_setiv(apisv, (IV)api);
       SvREADONLY_on(apisv);
@@ -478,6 +479,7 @@ void
 _loop()
 	CODE:
 	pe_check_recovery();
+	pe_reentry();
 	while (ExitLevel >= LoopLevel && ActiveWatchers) {
 	  ENTER;
 	  SAVETMPS;
@@ -485,6 +487,7 @@ _loop()
 	  FREETMPS;
 	  LEAVE;
 	}
+	LEAVE; /* reentry */
 
 void
 _queue_pending()
@@ -496,7 +499,9 @@ _empty_queue(prio)
 	int prio
 	CODE:
 	pe_check_recovery();
+	pe_reentry();
 	while (pe_empty_queue(prio));
+	LEAVE; /* reentry */
 
 void
 queue_time(prio)
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/c/ev.c' '/usr/tmp/mp5304.d/new/Event-0.76/c/ev.c'
Index: ./c/ev.c
--- ./c/ev.c	Fri Mar 24 10:35:53 2000
+++ ./c/ev.c	Wed Apr 26 12:36:59 2000
@@ -222,20 +222,6 @@ static void pe_event_invoke(pe_event *ev
 
     /* SETUP */
     ENTER;
-    if (CurCBFrame >= 0) {
-	pe_watcher *pwa;
-	frp = CBFrame + CurCBFrame;
-	pwa = frp->ev->up;
-	assert(pwa->running == frp->run_id);
-	if (Estat.on)
-	    Estat.suspend(frp->stats);
-	if (!WaREENTRANT(pwa) && WaREPEAT(pwa) && !WaSUSPEND(pwa)) {
-	    /* temporarily suspend non-reentrant watcher until callback is
-	       finished! */
-	    pe_watcher_suspend(pwa);
-	    SAVEDESTRUCTOR(_resume_watcher, pwa);
-	}
-    }
     SAVEINT(wa->running);
     PE_RING_DETACH(&ev->peer);
     frp = &CBFrame[++CurCBFrame];
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/c/queue.c' '/usr/tmp/mp5304.d/new/Event-0.76/c/queue.c'
Index: ./c/queue.c
--- ./c/queue.c	Fri Mar  3 13:27:14 2000
+++ ./c/queue.c	Wed Apr 26 16:16:31 2000
@@ -199,9 +199,42 @@ static int one_event(double tm) {  /**IN
     }
 }
 
+static void pe_reentry() {
+    pe_watcher *wa;
+    struct pe_cbframe *frp;
+
+    ENTER;  /* for SAVE*() macro (see below) */
+
+    if (CurCBFrame < 0)
+	return;
+
+    frp = CBFrame + CurCBFrame;
+    wa = frp->ev->up;
+    assert(wa->running == frp->run_id);
+    if (Estat.on)
+	Estat.suspend(frp->stats);  /* reversed by pe_event_postCB? */
+    if (WaREPEAT(wa)) {
+	if (WaREENTRANT(wa)) {
+	    if (WaACTIVE(wa) && WaINVOKE1(wa))
+		pe_watcher_on(wa, 1);
+	} else {
+	    if (!WaSUSPEND(wa)) {
+		/* temporarily suspend non-reentrant watcher until
+		   callback is finished! */
+		pe_watcher_suspend(wa);
+		SAVEDESTRUCTOR(_resume_watcher, wa);
+	    }
+	}
+    }
+}
+
 static int safe_one_event(double maxtm) {
+    int got;
     pe_check_recovery();
-    return one_event(maxtm);
+    pe_reentry();
+    got = one_event(maxtm);
+    LEAVE; /* reentry */
+    return got;
 }
 
 static void pe_unloop(SV *why) {
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/lib/Event.pm' '/usr/tmp/mp5304.d/new/Event-0.76/lib/Event.pm'
Index: ./lib/Event.pm
--- ./lib/Event.pm	Mon Apr 24 09:43:21 2000
+++ ./lib/Event.pm	Wed Apr 26 13:13:50 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.75';
+$VERSION = '0.76';
 
 # If we inherit DynaLoader then we inherit AutoLoader; Bletch!
 require DynaLoader;
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/lib/Event/EventAPI.h' '/usr/tmp/mp5304.d/new/Event-0.76/lib/Event/EventAPI.h'
Index: ./lib/Event/EventAPI.h
--- ./lib/Event/EventAPI.h	Mon Feb  7 13:28:45 2000
+++ ./lib/Event/EventAPI.h	Tue Apr 25 13:37:56 2000
@@ -208,6 +208,9 @@ struct EventAPI {
     void *(*sv_2watcher)(SV *sv);
     SV   *(*event_2sv)(pe_event *ev);
     void *(*sv_2event)(SV *sv);
+
+    /* EVERYTHING ELSE */
+    void (*unloop)(SV *);
 };
 
 static struct EventAPI *GEventAPI=0;
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/lib/Event/MakeMaker.pm' '/usr/tmp/mp5304.d/new/Event-0.76/lib/Event/MakeMaker.pm'
Index: ./lib/Event/MakeMaker.pm
--- ./lib/Event/MakeMaker.pm	Wed Dec 22 17:00:07 1999
+++ ./lib/Event/MakeMaker.pm	Tue Apr 25 13:29:59 2000
@@ -35,16 +35,16 @@ This is an advanced feature of Event.
 
 =head1 DESCRIPTION
 
-If you need optimal performance, you can hook into Event at the
-C-level.  You'll need to make changes to your C<Makefile.PL> and add
-code to your C<xs> or C<c> file(s).
+For optimal performance, hook into Event at the C-level.  You'll need
+to make changes to your C<Makefile.PL> and add code to your C<xs> /
+C<c> file(s).
 
 =head1 WARNING
 
-When you hook in at the C-level, you get a I<huge> performance gain
-but you reduce the chances that your code will work unmodified with
-newer versions of perl or L<Event>.  This may or not be a problem.
-Just be aware of it and set your expectations accordingly.
+When you hook in at the C-level you get a I<huge> performance gain,
+but you also reduce the chances that your code will work unmodified
+with newer versions of C<perl> or C<Event>.  This may or may not be a
+problem.  Just be aware, and set your expectations accordingly.
 
 =head1 HOW TO
 
gdiff -up '/usr/tmp/mp5304.d/old/Event-0.75/t/timer.t' '/usr/tmp/mp5304.d/new/Event-0.76/t/timer.t'
Index: ./t/timer.t
--- ./t/timer.t	Fri Feb  4 08:17:48 2000
+++ ./t/timer.t	Wed Apr 26 12:43:28 2000
@@ -1,9 +1,11 @@
 # the time for -*-perl-*-
 
-use Test; plan tests => 6;
+use Test; plan tests => 7;
 use Event qw(loop unloop);
 
-# $Event::DebugLevel = 4;
+# $Event::DebugLevel = 3;
+
+#if (0) {
 
 my $count = 0;
 Event->timer(after => 0.5, interval => .1, nice => -1,
@@ -37,3 +39,18 @@ $long->cb(sub { ok 1 });
 $long->at(time);
 
 ok loop(), 'ok';
+
+$_->cancel for Event::all_watchers();
+
+#}
+
+my $depth=0;
+Event->timer(interval => .01, cb => sub {
+		 if (++$depth < 2) {
+		     loop();
+		 } else {
+		     Event::unloop_all('reentrant');
+		 }
+	     });
+
+ok loop(), 'reentrant';
#### End of Patch data ####

#### ApplyPatch data follows ####
# Data version        : 1.0
# Date generated      : Wed Apr 26 16:17:29 2000
# Generated by        : makepatch 2.00 (2.0BETA)
# Recurse directories : Yes
# p 'ChangeLog' 25114 956769217 0100444
# p 'Event.xs' 18510 956779684 0100444
# p 'c/ev.c' 7797 956767019 0100444
# p 'c/queue.c' 5203 956780191 0100444
# p 'lib/Event.pm' 4074 956769230 0100444
# p 'lib/Event/EventAPI.h' 5571 956684276 0100444
# p 'lib/Event/MakeMaker.pm' 3284 956683799 0100444
# p 't/timer.t' 871 956767408 0100444
#### End of ApplyPatch data ####

#### End of Patch kit [created: Wed Apr 26 16:17:29 2000] ####
#### Checksum: 260 7964 12339 ####
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.