Author: Amaury Forgeot d'Arc <[email protected]>
Branch: 
Changeset: r78095:2acc241fc909
Date: 2015-06-14 21:44 +0200
http://bitbucket.org/pypy/pypy/changeset/2acc241fc909/

Log:    multiprocessing: Move the imports to module initialization, to avoid
        a deadlock with the import lock.

diff --git a/pypy/module/_multiprocessing/__init__.py 
b/pypy/module/_multiprocessing/__init__.py
--- a/pypy/module/_multiprocessing/__init__.py
+++ b/pypy/module/_multiprocessing/__init__.py
@@ -18,3 +18,8 @@
         interpleveldefs['PipeConnection'] = \
             'interp_connection.W_PipeConnection'
         interpleveldefs['win32'] = 'interp_win32.win32_namespace(space)'
+
+    def init(self, space):
+        MixedModule.init(self, space)
+        from pypy.module._multiprocessing.interp_connection import State
+        space.fromcache(State).init(space)
diff --git a/pypy/module/_multiprocessing/interp_connection.py 
b/pypy/module/_multiprocessing/interp_connection.py
--- a/pypy/module/_multiprocessing/interp_connection.py
+++ b/pypy/module/_multiprocessing/interp_connection.py
@@ -15,11 +15,21 @@
 PY_SSIZE_T_MAX = sys.maxint
 PY_SSIZE_T_MIN = -sys.maxint - 1
 
+class State(object):
+    def __init__(self, space):
+        pass
+
+    def init(self, space):
+        w_builtins = space.getbuiltinmodule('__builtin__')
+        w_module = space.call_method(
+            w_builtins, '__import__', space.wrap("multiprocessing"))
+        self.w_BufferTooShort = space.getattr(w_module, 
space.wrap("BufferTooShort"))
+
+        self.w_picklemodule = space.call_method(
+            w_builtins, '__import__', space.wrap("pickle"))
+
 def BufferTooShort(space, w_data):
-    w_builtins = space.getbuiltinmodule('__builtin__')
-    w_module = space.call_method(
-        w_builtins, '__import__', space.wrap("multiprocessing"))
-    w_BufferTooShort = space.getattr(w_module, space.wrap("BufferTooShort"))
+    w_BufferTooShort = space.fromcache(State).w_BufferTooShort
     return OperationError(w_BufferTooShort, w_data)
 
 def w_handle(space, handle):
@@ -144,9 +154,7 @@
     def send(self, space, w_obj):
         self._check_writable(space)
 
-        w_builtins = space.getbuiltinmodule('__builtin__')
-        w_picklemodule = space.call_method(
-            w_builtins, '__import__', space.wrap("pickle"))
+        w_picklemodule = space.fromcache(State).w_picklemodule
         w_protocol = space.getattr(
             w_picklemodule, space.wrap("HIGHEST_PROTOCOL"))
         w_pickled = space.call_method(
@@ -170,8 +178,7 @@
                 rffi.free_charp(newbuf)
 
         w_builtins = space.getbuiltinmodule('__builtin__')
-        w_picklemodule = space.call_method(
-            w_builtins, '__import__', space.wrap("pickle"))
+        w_picklemodule = space.fromcache(State).w_picklemodule
         w_unpickled = space.call_method(
             w_picklemodule, "loads", w_received)
 
diff --git a/pypy/module/_multiprocessing/test/test_memory.py 
b/pypy/module/_multiprocessing/test/test_memory.py
--- a/pypy/module/_multiprocessing/test/test_memory.py
+++ b/pypy/module/_multiprocessing/test/test_memory.py
@@ -1,6 +1,8 @@
 class AppTestMemory:
     spaceconfig = dict(usemodules=('_multiprocessing', 'mmap',
-                                   '_rawffi', 'itertools'))
+                                   '_rawffi', 'itertools',
+                                   'signal', 'select', 'fcntl',
+                                   'binascii'))
 
     def test_address_of(self):
         import _multiprocessing
diff --git a/pypy/module/_multiprocessing/test/test_semaphore.py 
b/pypy/module/_multiprocessing/test/test_semaphore.py
--- a/pypy/module/_multiprocessing/test/test_semaphore.py
+++ b/pypy/module/_multiprocessing/test/test_semaphore.py
@@ -3,7 +3,9 @@
 
 
 class AppTestSemaphore:
-    spaceconfig = dict(usemodules=('_multiprocessing', 'thread'))
+    spaceconfig = dict(usemodules=('_multiprocessing', 'thread',
+                                   'signal', 'select', 'fcntl',
+                                   'binascii', 'struct'))
 
     def setup_class(cls):
         cls.w_SEMAPHORE = cls.space.wrap(SEMAPHORE)
diff --git a/pypy/objspace/fake/checkmodule.py 
b/pypy/objspace/fake/checkmodule.py
--- a/pypy/objspace/fake/checkmodule.py
+++ b/pypy/objspace/fake/checkmodule.py
@@ -14,6 +14,7 @@
         # force computation and record what we wrap
         module = mod.Module(space, W_Root())
         module.setup_after_space_initialization()
+        module.init(space)
         modules.append(module)
         for name in module.loaders:
             seeobj_w.append(module._load_lazily(space, name))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to