[Zodb-checkins] SVN: ZODB/trunk/ Internal 3.5a5 release.

Tim Peters tim.one at comcast.net
Tue Jul 19 12:43:11 EDT 2005


Log message for revision 37334:
  Internal 3.5a5 release.
  

Changed:
  U   ZODB/trunk/NEWS.txt
  U   ZODB/trunk/doc/guide/zodb.tex
  U   ZODB/trunk/setup.py
  U   ZODB/trunk/src/ThreadedAsync/LoopCallback.py
  U   ZODB/trunk/src/ZEO/__init__.py
  U   ZODB/trunk/src/ZEO/version.txt
  U   ZODB/trunk/src/ZODB/__init__.py

-=-
Modified: ZODB/trunk/NEWS.txt
===================================================================
--- ZODB/trunk/NEWS.txt	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/NEWS.txt	2005-07-19 16:42:40 UTC (rev 37334)
@@ -1,11 +1,12 @@
-What's new in ZODB3 3.5a5?
+What's new in ZODB3 3.5a6?
 ==========================
 Release date: DD-MMM-2005
 
 Following is combined news from internal releases (to support ongoing
 Zope3 development).  These are the dates of the internal releases:
 
-- 3.5a5 DD-MMM-2005
+- 3.5a6 DD-MMM-2005
+- 3.5a5 19-Jul-2005
 - 3.5a4 14-Jul-2005
 - 3.5a3 17-Jun-2005
 - 3.5a2 16-Jun-2005
@@ -83,6 +84,13 @@
 ThreadedAsync.LoopCallback
 --------------------------
 
+- (3.5a5) This once again physically replaces Python's ``asyncore.loop``
+  function with its own loop function, because it turns out Zope relied on
+  the seemingly unused ``LoopCallback.exit_status`` global, which was
+  removed in the change described below.  Python's ``asyncore.loop`` is again
+  not invoked, so any breakpoints or debugging prints added to that are again
+  "lost".
+
 - (3.5a4) This replaces Python's ``asyncore.loop`` function with its own, in
   order to get notified when ``loop()`` is first called.  The signature of
   ``asyncore.loop`` changed in Python 2.4, but ``LoopCallback.loop``'s
@@ -225,6 +233,13 @@
 ThreadedAsync.LoopCallback
 --------------------------
 
+- (3.4.1a6) This once again physically replaces Python's ``asyncore.loop``
+  function with its own loop function, because it turns out Zope relied on
+  the seemingly unused ``LoopCallback.exit_status`` global, which was
+  removed in the change described below.  Python's ``asyncore.loop`` is again
+  not invoked, so any breakpoints or debugging prints added to that are again
+  "lost".
+
 - (3.4.1a1) This replaces Python's ``asyncore.loop`` function with its own,
   in order to get notified when ``loop()`` is first called.  The signature of
   ``asyncore.loop`` changed in Python 2.4, but ``LoopCallback.loop``'s

Modified: ZODB/trunk/doc/guide/zodb.tex
===================================================================
--- ZODB/trunk/doc/guide/zodb.tex	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/doc/guide/zodb.tex	2005-07-19 16:42:40 UTC (rev 37334)
@@ -1,7 +1,7 @@
 \documentclass{howto}
 
 \title{ZODB/ZEO Programming Guide}
-\release{3.5a4}
+\release{3.5a5}
 \date{\today}
 
 \author{A.M.\ Kuchling}

Modified: ZODB/trunk/setup.py
===================================================================
--- ZODB/trunk/setup.py	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/setup.py	2005-07-19 16:42:40 UTC (rev 37334)
@@ -264,7 +264,7 @@
 doclines = __doc__.split("\n")
 
 setup(name="ZODB3",
-      version="3.5a4",
+      version="3.5a5",
       maintainer="Zope Corporation",
       maintainer_email="zodb-dev at zope.org",
       url = "http://www.zope.org/Wikis/ZODB",

Modified: ZODB/trunk/src/ThreadedAsync/LoopCallback.py
===================================================================
--- ZODB/trunk/src/ThreadedAsync/LoopCallback.py	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/src/ThreadedAsync/LoopCallback.py	2005-07-19 16:42:40 UTC (rev 37334)
@@ -29,7 +29,10 @@
 import asyncore
 import thread
 
-_original_asyncore_loop = asyncore.loop
+# Zope pokes a non-None value into exit_status when it wants the loop()
+# function to exit.  Indeed, there appears to be no other way to tell
+# Zope3 to shut down.
+exit_status = None
 
 _loop_lock = thread.allocate_lock()
 _looping = None # changes to socket map when loop() starts
@@ -66,14 +69,36 @@
             del _loop_callbacks[i]
             return
 
-# Caution:  the signature of asyncore.loop changed in Python 2.4.
-# That's why we use `args` and `kws` instead of spelling out the
-# "intended" arguments.  Since we _replace_ asyncore.loop with this
-# loop(), we need to be compatible with all signatures.
-def loop(*args, **kws):
+# Because of the exit_status magic, we can't just invoke asyncore.loop(),
+# and that's a shame.
+# The signature of asyncore.loop changed between Python 2.3 and 2.4, and
+# this loop() has 2.4's signature, which added the optional `count` argument.
+# Since we physically replace asyncore.loop with this `loop`, and want
+# compatibility with both Pythons, we need to support the most recent
+# signature.  Applications running under 2.3 should (of course) avoid using
+# the `count` argument, since 2.3 doesn't have it.
+def loop(timeout=30.0, use_poll=False, map=None, count=None):
     global _looping
+    global exit_status
 
-    map = kws.get("map", asyncore.socket_map)
+    exit_status = None
+
+    if map is None:
+        map = asyncore.socket_map
+
+    # This section is taken from Python 2.3's asyncore.loop, and is more
+    # elaborate than the corresponding section of 2.4's:  in 2.4 poll2 and
+    # poll3 are aliases for the same function, in 2.3 they're different
+    # functions.
+    if use_poll:
+        if hasattr(select, 'poll'):
+            poll_fun = asyncore.poll3
+        else:
+            poll_fun = asyncore.poll2
+    else:
+        poll_fun = asyncore.poll
+
+    # The loop is about to start:  invoke any registered callbacks.
     _loop_lock.acquire()
     try:
         _looping = map
@@ -83,7 +108,15 @@
     finally:
         _loop_lock.release()
 
-    result = _original_asyncore_loop(*args, **kws)
+    # Run the loop.  This is 2.4's logic, with the addition that we stop
+    # if/when this module's exit_status global is set to a non-None value.
+    if count is None:
+        while map and exit_status is None:
+            poll_fun(timeout, map)
+    else:
+        while map and count > 0 and exit_status is None:
+            poll_fun(timeout, map)
+            count -= 1
 
     _loop_lock.acquire()
     try:
@@ -91,16 +124,15 @@
     finally:
         _loop_lock.release()
 
-    return result
-
-
 # Evil:  rebind asyncore.loop to the above loop() function.
 #
 # Code should explicitly call ThreadedAsync.loop() instead of asyncore.loop().
 # Most of ZODB has been fixed, but ripping this out may break 3rd party code.
-# Maybe we should issue a warning and let it continue for a while.  Or
-# maybe we should get rid of this mechanism entirely, and have each ZEO
-# piece that needs one run its own asyncore loop in its own thread.
+# Maybe we should issue a warning and let it continue for a while (NOTE:  code
+# to raise DeprecationWarning was written but got commented out below; don't
+# know why it got commented out).  Or maybe we should get rid of this
+# mechanism entirely, and have each piece that needs one run its own asyncore
+# loop in its own thread.
 
 ##def deprecated_loop(*args, **kws):
 ##    import warnings

Modified: ZODB/trunk/src/ZEO/__init__.py
===================================================================
--- ZODB/trunk/src/ZEO/__init__.py	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/src/ZEO/__init__.py	2005-07-19 16:42:40 UTC (rev 37334)
@@ -22,4 +22,4 @@
 """
 
 # The next line must use double quotes, so release.py recognizes it.
-version = "3.5a4"
+version = "3.5a5"

Modified: ZODB/trunk/src/ZEO/version.txt
===================================================================
--- ZODB/trunk/src/ZEO/version.txt	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/src/ZEO/version.txt	2005-07-19 16:42:40 UTC (rev 37334)
@@ -1 +1 @@
-3.5a4
+3.5a5

Modified: ZODB/trunk/src/ZODB/__init__.py
===================================================================
--- ZODB/trunk/src/ZODB/__init__.py	2005-07-19 16:38:00 UTC (rev 37333)
+++ ZODB/trunk/src/ZODB/__init__.py	2005-07-19 16:42:40 UTC (rev 37334)
@@ -13,7 +13,7 @@
 ##############################################################################
 
 # The next line must use double quotes, so release.py recognizes it.
-__version__ = "3.5a4"
+__version__ = "3.5a5"
 
 import sys
 import __builtin__



More information about the Zodb-checkins mailing list