From 3913bad4957ac30e58a7ffe9279333ad176a8eea Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Fri, 21 Jul 2017 11:35:33 +0100 Subject: [PATCH] bpo-19896: Add typecodes 'q' and 'Q' to multiprocessing.sharedctypes (#2741) * bpo-19896: Add typcodes 'q' and 'Q' to multiprocessing.sharedctypes. Patch by Antony Lee. * Add NEWS entry. * Slightly tweak NEWS entry Make it clear this is more of a fix rather than a new feature. --- Lib/multiprocessing/sharedctypes.py | 13 +++++++------ Lib/test/_test_multiprocessing.py | 17 ++++++++++++----- .../2017-07-18-13-24-50.bpo-19896.-S0IWu.rst | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-07-18-13-24-50.bpo-19896.-S0IWu.rst diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py index 7228751770f..066cf8f031d 100644 --- a/Lib/multiprocessing/sharedctypes.py +++ b/Lib/multiprocessing/sharedctypes.py @@ -23,12 +23,13 @@ __all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized'] # typecode_to_type = { - 'c': ctypes.c_char, 'u': ctypes.c_wchar, - 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, - 'h': ctypes.c_short, 'H': ctypes.c_ushort, - 'i': ctypes.c_int, 'I': ctypes.c_uint, - 'l': ctypes.c_long, 'L': ctypes.c_ulong, - 'f': ctypes.c_float, 'd': ctypes.c_double + 'c': ctypes.c_char, 'u': ctypes.c_wchar, + 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, + 'h': ctypes.c_short, 'H': ctypes.c_ushort, + 'i': ctypes.c_int, 'I': ctypes.c_uint, + 'l': ctypes.c_long, 'L': ctypes.c_ulong, + 'q': ctypes.c_longlong, 'Q': ctypes.c_ulonglong, + 'f': ctypes.c_float, 'd': ctypes.c_double } # diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 0515730d14a..9ef44a0e409 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -106,7 +106,7 @@ PRELOAD = ['__main__', 'test.test_multiprocessing_forkserver'] # try: - from ctypes import Structure, c_int, c_double + from ctypes import Structure, c_int, c_double, c_longlong except ImportError: Structure = object c_int = c_double = None @@ -1637,6 +1637,7 @@ class _TestValue(BaseTestCase): ('i', 4343, 24234), ('d', 3.625, -4.25), ('h', -232, 234), + ('q', 2 ** 33, 2 ** 34), ('c', latin('x'), latin('y')) ] @@ -3179,7 +3180,8 @@ class _TestHeap(BaseTestCase): class _Foo(Structure): _fields_ = [ ('x', c_int), - ('y', c_double) + ('y', c_double), + ('z', c_longlong,) ] class _TestSharedCTypes(BaseTestCase): @@ -3191,9 +3193,10 @@ class _TestSharedCTypes(BaseTestCase): self.skipTest("requires multiprocessing.sharedctypes") @classmethod - def _double(cls, x, y, foo, arr, string): + def _double(cls, x, y, z, foo, arr, string): x.value *= 2 y.value *= 2 + z.value *= 2 foo.x *= 2 foo.y *= 2 string.value *= 2 @@ -3203,18 +3206,20 @@ class _TestSharedCTypes(BaseTestCase): def test_sharedctypes(self, lock=False): x = Value('i', 7, lock=lock) y = Value(c_double, 1.0/3.0, lock=lock) + z = Value(c_longlong, 2 ** 33, lock=lock) foo = Value(_Foo, 3, 2, lock=lock) arr = self.Array('d', list(range(10)), lock=lock) string = self.Array('c', 20, lock=lock) string.value = latin('hello') - p = self.Process(target=self._double, args=(x, y, foo, arr, string)) + p = self.Process(target=self._double, args=(x, y, z, foo, arr, string)) p.daemon = True p.start() p.join() self.assertEqual(x.value, 14) self.assertAlmostEqual(y.value, 2.0/3.0) + self.assertEqual(z.value, 2 ** 34) self.assertEqual(foo.x, 6) self.assertAlmostEqual(foo.y, 4.0) for i in range(10): @@ -3225,12 +3230,14 @@ class _TestSharedCTypes(BaseTestCase): self.test_sharedctypes(lock=True) def test_copy(self): - foo = _Foo(2, 5.0) + foo = _Foo(2, 5.0, 2 ** 33) bar = copy(foo) foo.x = 0 foo.y = 0 + foo.z = 0 self.assertEqual(bar.x, 2) self.assertAlmostEqual(bar.y, 5.0) + self.assertEqual(bar.z, 2 ** 33) # # diff --git a/Misc/NEWS.d/next/Library/2017-07-18-13-24-50.bpo-19896.-S0IWu.rst b/Misc/NEWS.d/next/Library/2017-07-18-13-24-50.bpo-19896.-S0IWu.rst new file mode 100644 index 00000000000..ce06279440f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-07-18-13-24-50.bpo-19896.-S0IWu.rst @@ -0,0 +1 @@ +Fix multiprocessing.sharedctypes to recognize typecodes ``'q'`` and ``'Q'``.