Kaydet (Commit) b0516a6b authored tarafından Jesse Noller's avatar Jesse Noller

Merge r68708 to py3k, fixes 4449

üst 34f9b4c6
......@@ -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
......
......@@ -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):
......
......@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment