summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Noller <jnoller@gmail.com>2009-01-18 03:11:38 (GMT)
committerJesse Noller <jnoller@gmail.com>2009-01-18 03:11:38 (GMT)
commitb0516a6bc6cdc580846b075bc27b1d3281dd6295 (patch)
tree051beb24dbf3d805f6b8f1fd054c68031d1582bc
parent34f9b4c6f1b4129d8ded2cfd580687295bc9cb63 (diff)
downloadcpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.zip
cpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.tar.gz
cpython-b0516a6bc6cdc580846b075bc27b1d3281dd6295.tar.bz2
Merge r68708 to py3k, fixes 4449
-rw-r--r--Doc/library/multiprocessing.rst6
-rw-r--r--Lib/multiprocessing/sharedctypes.py14
-rw-r--r--Lib/test/test_multiprocessing.py16
-rw-r--r--Misc/NEWS6
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'))
#
#
diff --git a/Misc/NEWS b/Misc/NEWS
index fee788f..b1c5d7f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.