diff options
author | Jesse Noller <jnoller@gmail.com> | 2008-09-02 19:12:20 (GMT) |
---|---|---|
committer | Jesse Noller <jnoller@gmail.com> | 2008-09-02 19:12:20 (GMT) |
commit | 824f4f3cdcf304b39025e20b22b09fcbbceef43f (patch) | |
tree | 70b6aa05304c2392a27da2cf11973197494cb832 /Lib/multiprocessing/managers.py | |
parent | 9f76e4f127754fcea7f3bf974fc1036d6e799f9b (diff) | |
download | cpython-824f4f3cdcf304b39025e20b22b09fcbbceef43f.zip cpython-824f4f3cdcf304b39025e20b22b09fcbbceef43f.tar.gz cpython-824f4f3cdcf304b39025e20b22b09fcbbceef43f.tar.bz2 |
Merge r66115 forward to py3k, resolves issue3419
Diffstat (limited to 'Lib/multiprocessing/managers.py')
-rw-r--r-- | Lib/multiprocessing/managers.py | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index f895d62..f895c12 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -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): |