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