Merged revisions 68708 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68708 | jesse.noller | 2009-01-17 20:45:38 -0600 (Sat, 17 Jan 2009) | 1 line

  Resolve issue 4449: AssertionError in mp_benchmarks.py
........
This commit is contained in:
Benjamin Peterson 2009-01-18 04:01:18 +00:00
parent 0293c80410
commit afd7eaadb0
3 changed files with 27 additions and 9 deletions

View File

@ -880,7 +880,7 @@ Shared :mod:`ctypes` Objects
It is possible to create shared objects using shared memory which can be It is possible to create shared objects using shared memory which can be
inherited by child processes. 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 a :mod:`ctypes` object allocated from shared memory. By default the
return value is actually a synchronized wrapper for the object. return value is actually a synchronized wrapper for the object.
@ -962,7 +962,7 @@ processes.
*typecode_or_type* determines the type of the returned object: it is either a *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` 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 Note that setting and getting the value is potentially non-atomic -- use
:func:`Value` instead to make sure that access is automatically synchronized :func:`Value` instead to make sure that access is automatically synchronized
@ -972,7 +972,7 @@ processes.
attributes which allow one to use it to store and retrieve strings -- see attributes which allow one to use it to store and retrieve strings -- see
documentation for :mod:`ctypes`. 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 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 process-safe synchronization wrapper may be returned instead of a raw ctypes

View File

@ -69,9 +69,12 @@ def Value(typecode_or_type, *args, **kwds):
if kwds: if kwds:
raise ValueError('unrecognized keyword argument(s): %s' % kwds.keys()) raise ValueError('unrecognized keyword argument(s): %s' % kwds.keys())
obj = RawValue(typecode_or_type, *args) obj = RawValue(typecode_or_type, *args)
if lock is None: if lock is False:
return obj
if lock in (True, None):
lock = RLock() lock = RLock()
assert hasattr(lock, 'acquire') if not hasattr(lock, 'acquire'):
raise AttributeError("'%r' has no method 'acquire'" % lock)
return synchronized(obj, lock) return synchronized(obj, lock)
def Array(typecode_or_type, size_or_initializer, **kwds): def Array(typecode_or_type, size_or_initializer, **kwds):
@ -82,9 +85,12 @@ def Array(typecode_or_type, size_or_initializer, **kwds):
if kwds: if kwds:
raise ValueError('unrecognized keyword argument(s): %s' % kwds.keys()) raise ValueError('unrecognized keyword argument(s): %s' % kwds.keys())
obj = RawArray(typecode_or_type, size_or_initializer) 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() lock = RLock()
assert hasattr(lock, 'acquire') if not hasattr(lock, 'acquire'):
raise AttributeError("'%r' has no method 'acquire'" % lock)
return synchronized(obj, lock) return synchronized(obj, lock)
def copy(obj): def copy(obj):

View File

@ -829,10 +829,16 @@ class _TestValue(BaseTestCase):
obj3 = val3.get_obj() obj3 = val3.get_obj()
self.assertEqual(lock, lock3) 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_lock'))
self.assertFalse(hasattr(arr4, 'get_obj')) 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): class _TestArray(BaseTestCase):
@ -887,9 +893,15 @@ class _TestArray(BaseTestCase):
obj3 = arr3.get_obj() obj3 = arr3.get_obj()
self.assertEqual(lock, lock3) self.assertEqual(lock, lock3)
arr4 = self.RawArray('i', range(10)) arr4 = self.Array('i', range(10), lock=False)
self.assertFalse(hasattr(arr4, 'get_lock')) self.assertFalse(hasattr(arr4, 'get_lock'))
self.assertFalse(hasattr(arr4, 'get_obj')) 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'))
# #
# #