Skip to content

Commit 4d5d161

Browse files
[3.9] bpo-45310: Fix parrallel shared memory tests (GH-28661) (GH-28670)
Add a PID to names of POSIX shared memory objects to allow running multiprocessing tests (test_multiprocessing_fork, test_multiprocessing_spawn, etc) in parallel. (cherry picked from commit eb4495e)
1 parent e9d5cdd commit 4d5d161

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

Lib/test/_test_multiprocessing.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3769,13 +3769,20 @@ def _attach_existing_shmem_then_write(shmem_name_or_obj, binary_data):
37693769
local_sms.buf[:len(binary_data)] = binary_data
37703770
local_sms.close()
37713771

3772+
def _new_shm_name(self, prefix):
3773+
# Add a PID to the name of a POSIX shared memory object to allow
3774+
# running multiprocessing tests (test_multiprocessing_fork,
3775+
# test_multiprocessing_spawn, etc) in parallel.
3776+
return prefix + str(os.getpid())
3777+
37723778
@unittest.skipIf(sys.platform == "win32", "test is broken on Windows")
37733779
def test_shared_memory_basics(self):
3774-
sms = shared_memory.SharedMemory('test01_tsmb', create=True, size=512)
3780+
name_tsmb = self._new_shm_name('test01_tsmb')
3781+
sms = shared_memory.SharedMemory(name_tsmb, create=True, size=512)
37753782
self.addCleanup(sms.unlink)
37763783

37773784
# Verify attributes are readable.
3778-
self.assertEqual(sms.name, 'test01_tsmb')
3785+
self.assertEqual(sms.name, name_tsmb)
37793786
self.assertGreaterEqual(sms.size, 512)
37803787
self.assertGreaterEqual(len(sms.buf), sms.size)
37813788

@@ -3784,12 +3791,12 @@ def test_shared_memory_basics(self):
37843791
self.assertEqual(sms.buf[0], 42)
37853792

37863793
# Attach to existing shared memory segment.
3787-
also_sms = shared_memory.SharedMemory('test01_tsmb')
3794+
also_sms = shared_memory.SharedMemory(name_tsmb)
37883795
self.assertEqual(also_sms.buf[0], 42)
37893796
also_sms.close()
37903797

37913798
# Attach to existing shared memory segment but specify a new size.
3792-
same_sms = shared_memory.SharedMemory('test01_tsmb', size=20*sms.size)
3799+
same_sms = shared_memory.SharedMemory(name_tsmb, size=20*sms.size)
37933800
self.assertLess(same_sms.size, 20*sms.size) # Size was ignored.
37943801
same_sms.close()
37953802

@@ -3807,7 +3814,7 @@ def test_shared_memory_basics(self):
38073814
'multiprocessing.shared_memory._make_filename') as mock_make_filename:
38083815

38093816
NAME_PREFIX = shared_memory._SHM_NAME_PREFIX
3810-
names = ['test01_fn', 'test02_fn']
3817+
names = [self._new_shm_name('test01_fn'), self._new_shm_name('test02_fn')]
38113818
# Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary
38123819
# because some POSIX compliant systems require name to start with /
38133820
names = [NAME_PREFIX + name for name in names]
@@ -3829,17 +3836,17 @@ def test_shared_memory_basics(self):
38293836
# manages unlinking on its own and unlink() does nothing).
38303837
# True release of shared memory segment does not necessarily
38313838
# happen until process exits, depending on the OS platform.
3839+
name_dblunlink = self._new_shm_name('test01_dblunlink')
3840+
sms_uno = shared_memory.SharedMemory(
3841+
name_dblunlink,
3842+
create=True,
3843+
size=5000
3844+
)
38323845
with self.assertRaises(FileNotFoundError):
3833-
sms_uno = shared_memory.SharedMemory(
3834-
'test01_dblunlink',
3835-
create=True,
3836-
size=5000
3837-
)
3838-
38393846
try:
38403847
self.assertGreaterEqual(sms_uno.size, 5000)
38413848

3842-
sms_duo = shared_memory.SharedMemory('test01_dblunlink')
3849+
sms_duo = shared_memory.SharedMemory(name_dblunlink)
38433850
sms_duo.unlink() # First shm_unlink() call.
38443851
sms_duo.close()
38453852
sms_uno.close()
@@ -3851,7 +3858,7 @@ def test_shared_memory_basics(self):
38513858
# Attempting to create a new shared memory segment with a
38523859
# name that is already in use triggers an exception.
38533860
there_can_only_be_one_sms = shared_memory.SharedMemory(
3854-
'test01_tsmb',
3861+
name_tsmb,
38553862
create=True,
38563863
size=512
38573864
)
@@ -3865,7 +3872,7 @@ def test_shared_memory_basics(self):
38653872
# case of MacOS/darwin, requesting a smaller size is disallowed.
38663873
class OptionalAttachSharedMemory(shared_memory.SharedMemory):
38673874
_flags = os.O_CREAT | os.O_RDWR
3868-
ok_if_exists_sms = OptionalAttachSharedMemory('test01_tsmb')
3875+
ok_if_exists_sms = OptionalAttachSharedMemory(name_tsmb)
38693876
self.assertEqual(ok_if_exists_sms.size, sms.size)
38703877
ok_if_exists_sms.close()
38713878

@@ -4053,10 +4060,11 @@ def test_shared_memory_ShareableList_basics(self):
40534060
self.assertEqual(sl.count(b'adios'), 0)
40544061

40554062
# Exercise creating a duplicate.
4056-
sl_copy = shared_memory.ShareableList(sl, name='test03_duplicate')
4063+
name_duplicate = self._new_shm_name('test03_duplicate')
4064+
sl_copy = shared_memory.ShareableList(sl, name=name_duplicate)
40574065
try:
40584066
self.assertNotEqual(sl.shm.name, sl_copy.shm.name)
4059-
self.assertEqual('test03_duplicate', sl_copy.shm.name)
4067+
self.assertEqual(name_duplicate, sl_copy.shm.name)
40604068
self.assertEqual(list(sl), list(sl_copy))
40614069
self.assertEqual(sl.format, sl_copy.format)
40624070
sl_copy[-1] = 77

0 commit comments

Comments
 (0)