mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
Merge r68708 to py3k, fixes 4449
This commit is contained in:
parent
34f9b4c6f1
commit
b0516a6bc6
4 changed files with 33 additions and 9 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue