]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merge r66115 forward to py3k, resolves issue3419
authorJesse Noller <jnoller@gmail.com>
Tue, 2 Sep 2008 19:12:20 +0000 (19:12 +0000)
committerJesse Noller <jnoller@gmail.com>
Tue, 2 Sep 2008 19:12:20 +0000 (19:12 +0000)
Lib/multiprocessing/managers.py

index f895d625fdd9d5b06e7582920642dd49914c1f4a..f895c129a50a74ad6bf1b35b161ea21176955c04 100644 (file)
@@ -378,7 +378,13 @@ class Server(object):
 
             self.id_to_obj[ident] = (obj, set(exposed), method_to_typeid)
             if ident not in self.id_to_refcount:
-                self.id_to_refcount[ident] = None
+                self.id_to_refcount[ident] = 0
+            # increment the reference count immediately, to avoid
+            # this object being garbage collected before a Proxy
+            # object for it can be created.  The caller of create()
+            # is responsible for doing a decref once the Proxy object
+            # has been created.
+            self.incref(c, ident)
             return ident, tuple(exposed)
         finally:
             self.mutex.release()
@@ -400,11 +406,7 @@ class Server(object):
     def incref(self, c, ident):
         self.mutex.acquire()
         try:
-            try:
-                self.id_to_refcount[ident] += 1
-            except TypeError:
-                assert self.id_to_refcount[ident] is None
-                self.id_to_refcount[ident] = 1
+            self.id_to_refcount[ident] += 1
         finally:
             self.mutex.release()
 
@@ -641,6 +643,8 @@ class BaseManager(object):
                     token, self._serializer, manager=self,
                     authkey=self._authkey, exposed=exp
                     )
+                conn = self._Client(token.address, authkey=self._authkey)
+                dispatch(conn, None, 'decref', (token.id,))
                 return proxy
             temp.__name__ = typeid
             setattr(cls, typeid, temp)
@@ -733,10 +737,13 @@ class BaseProxy(object):
         elif kind == '#PROXY':
             exposed, token = result
             proxytype = self._manager._registry[token.typeid][-1]
-            return proxytype(
+            proxy = proxytype(
                 token, self._serializer, manager=self._manager,
                 authkey=self._authkey, exposed=exposed
                 )
+            conn = self._Client(token.address, authkey=self._authkey)
+            dispatch(conn, None, 'decref', (token.id,))
+            return proxy
         raise convert_to_error(kind, result)
 
     def _getvalue(self):