diff options
author | Jesse Noller <jnoller@gmail.com> | 2009-01-18 03:11:38 (GMT) |
---|---|---|
committer | Jesse Noller <jnoller@gmail.com> | 2009-01-18 03:11:38 (GMT) |
commit | b0516a6bc6cdc580846b075bc27b1d3281dd6295 (patch) | |
tree | 051beb24dbf3d805f6b8f1fd054c68031d1582bc | |
parent | 34f9b4c6f1b4129d8ded2cfd580687295bc9cb63 (diff) | |
download | cpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.zip cpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.tar.gz cpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.tar.bz2 |
Merge r68708 to py3k, fixes 4449
-rw-r--r-- | Doc/library/multiprocessing.rst | 6 | ||||
-rw-r--r-- | Lib/multiprocessing/sharedctypes.py | 14 | ||||
-rw-r--r-- | Lib/test/test_multiprocessing.py | 16 | ||||
-rw-r--r-- | Misc/NEWS | 6 |
4 files changed, 33 insertions, 9 deletions
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 9331b7c..50714ef 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -878,7 +878,7 @@ Shared :mod:`ctypes` Objects It is possible to create shared objects using shared memory which can be inherited by child processes. -.. function:: Value(typecode_or_type[, *args, lock]]) +.. function:: Value(typecode_or_type, *args[, lock]) Return a :mod:`ctypes` object allocated from shared memory. By default the return value is actually a synchronized wrapper for the object. @@ -960,7 +960,7 @@ processes. *typecode_or_type* determines the type of the returned object: it is either a ctypes type or a one character typecode of the kind used by the :mod:`array` - module. */*args* is passed on to the constructor for the type. + module. *\*args* is passed on to the constructor for the type. Note that setting and getting the value is potentially non-atomic -- use :func:`Value` instead to make sure that access is automatically synchronized @@ -970,7 +970,7 @@ processes. attributes which allow one to use it to store and retrieve strings -- see documentation for :mod:`ctypes`. -.. function:: Array(typecode_or_type, size_or_initializer[, *args[, lock]]) +.. function:: Array(typecode_or_type, size_or_initializer, *args[, lock]) The same as :func:`RawArray` except that depending on the value of *lock* a process-safe synchronization wrapper may be returned instead of a raw ctypes diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py index b94cd52..1976277 100644 --- a/Lib/multiprocessing/sharedctypes.py +++ b/Lib/multiprocessing/sharedctypes.py @@ -66,9 +66,12 @@ def Value(typecode_or_type, *args, lock=None): Return a synchronization wrapper for a Value ''' obj = RawValue(typecode_or_type, *args) - if lock is None: + if lock is False: + return obj + if lock in (True, None): lock = RLock() - assert hasattr(lock, 'acquire') + if not hasattr(lock, 'acquire'): + raise AttributeError("'%r' has no method 'acquire'" % lock) return synchronized(obj, lock) def Array(typecode_or_type, size_or_initializer, **kwds): @@ -79,9 +82,12 @@ def Array(typecode_or_type, size_or_initializer, **kwds): if kwds: raise ValueError('unrecognized keyword argument(s): %s' % list(kwds.keys())) obj = RawArray(typecode_or_type, size_or_initializer) - if lock is None: + if lock is False: + return obj + if lock in (True, None): lock = RLock() - assert hasattr(lock, 'acquire') + if not hasattr(lock, 'acquire'): + raise AttributeError("'%r' has no method 'acquire'" % lock) return synchronized(obj, lock) def copy(obj): diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index a8600c0..4e5d759 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -830,10 +830,16 @@ class _TestValue(BaseTestCase): obj3 = val3.get_obj() self.assertEqual(lock, lock3) - arr4 = self.RawValue('i', 5) + arr4 = self.Value('i', 5, lock=False) self.assertFalse(hasattr(arr4, 'get_lock')) self.assertFalse(hasattr(arr4, 'get_obj')) + self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') + + arr5 = self.RawValue('i', 5) + self.assertFalse(hasattr(arr5, 'get_lock')) + self.assertFalse(hasattr(arr5, 'get_obj')) + class _TestArray(BaseTestCase): @@ -888,9 +894,15 @@ class _TestArray(BaseTestCase): obj3 = arr3.get_obj() self.assertEqual(lock, lock3) - arr4 = self.RawArray('i', list(range(10))) + arr4 = self.Array('i', range(10), lock=False) self.assertFalse(hasattr(arr4, 'get_lock')) self.assertFalse(hasattr(arr4, 'get_obj')) + self.assertRaises(AttributeError, + self.Array, 'i', range(10), lock='notalock') + + arr5 = self.RawArray('i', range(10)) + self.assertFalse(hasattr(arr5, 'get_lock')) + self.assertFalse(hasattr(arr5, 'get_obj')) # # @@ -135,6 +135,12 @@ Library - Issue #4959: inspect.formatargspec now works for keyword only arguments without defaults. +- Issue #4449: AssertionError in mp_benchmarks.py, caused by an underlying issue + in sharedctypes.py. + +- Issue #1225107: inspect.isclass() returned True for instances with a custom + __getattr__. + - Issue #3826 and #4791: The socket module now closes the underlying socket appropriately when it is being used via socket.makefile() objects rather than delaying the close by waiting for garbage collection to do it. |