Skip to content

Commit 69ebc33

Browse files
bpo-45310: Fix parrallel shared memory tests
Add a PID to names of POSIX shared memory objects to allow running multiprocessing tests (test_multiprocessing_fork, test_multiprocessing_spawn, etc) in parallel.
1 parent ec4d917 commit 69ebc33

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

Lib/test/_test_multiprocessing.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3773,12 +3773,16 @@ def _attach_existing_shmem_then_write(shmem_name_or_obj, binary_data):
37733773
local_sms.buf[:len(binary_data)] = binary_data
37743774
local_sms.close()
37753775

3776+
def _new_shm_name(self, prefix):
3777+
return prefix + str(os.getpid())
3778+
37763779
def test_shared_memory_basics(self):
3777-
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)
37783782
self.addCleanup(sms.unlink)
37793783

37803784
# Verify attributes are readable.
3781-
self.assertEqual(sms.name, 'test01_tsmb')
3785+
self.assertEqual(sms.name, name_tsmb)
37823786
self.assertGreaterEqual(sms.size, 512)
37833787
self.assertGreaterEqual(len(sms.buf), sms.size)
37843788

@@ -3798,12 +3802,12 @@ def test_shared_memory_basics(self):
37983802
self.assertEqual(sms.buf[0], 42)
37993803

38003804
# Attach to existing shared memory segment.
3801-
also_sms = shared_memory.SharedMemory('test01_tsmb')
3805+
also_sms = shared_memory.SharedMemory(name_tsmb)
38023806
self.assertEqual(also_sms.buf[0], 42)
38033807
also_sms.close()
38043808

38053809
# Attach to existing shared memory segment but specify a new size.
3806-
same_sms = shared_memory.SharedMemory('test01_tsmb', size=20*sms.size)
3810+
same_sms = shared_memory.SharedMemory(name_tsmb, size=20*sms.size)
38073811
self.assertLess(same_sms.size, 20*sms.size) # Size was ignored.
38083812
same_sms.close()
38093813

@@ -3821,7 +3825,7 @@ def test_shared_memory_basics(self):
38213825
'multiprocessing.shared_memory._make_filename') as mock_make_filename:
38223826

38233827
NAME_PREFIX = shared_memory._SHM_NAME_PREFIX
3824-
names = ['test01_fn', 'test02_fn']
3828+
names = [self._new_shm_name('test01_fn'), self._new_shm_name('test02_fn')]
38253829
# Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary
38263830
# because some POSIX compliant systems require name to start with /
38273831
names = [NAME_PREFIX + name for name in names]
@@ -3843,17 +3847,17 @@ def test_shared_memory_basics(self):
38433847
# manages unlinking on its own and unlink() does nothing).
38443848
# True release of shared memory segment does not necessarily
38453849
# happen until process exits, depending on the OS platform.
3850+
name_dblunlink = self._new_shm_name('test01_dblunlink')
3851+
sms_uno = shared_memory.SharedMemory(
3852+
name_dblunlink,
3853+
create=True,
3854+
size=5000
3855+
)
38463856
with self.assertRaises(FileNotFoundError):
3847-
sms_uno = shared_memory.SharedMemory(
3848-
'test01_dblunlink',
3849-
create=True,
3850-
size=5000
3851-
)
3852-
38533857
try:
38543858
self.assertGreaterEqual(sms_uno.size, 5000)
38553859

3856-
sms_duo = shared_memory.SharedMemory('test01_dblunlink')
3860+
sms_duo = shared_memory.SharedMemory(name_dblunlink)
38573861
sms_duo.unlink() # First shm_unlink() call.
38583862
sms_duo.close()
38593863
sms_uno.close()
@@ -3865,7 +3869,7 @@ def test_shared_memory_basics(self):
38653869
# Attempting to create a new shared memory segment with a
38663870
# name that is already in use triggers an exception.
38673871
there_can_only_be_one_sms = shared_memory.SharedMemory(
3868-
'test01_tsmb',
3872+
name_tsmb,
38693873
create=True,
38703874
size=512
38713875
)
@@ -3879,7 +3883,7 @@ def test_shared_memory_basics(self):
38793883
# case of MacOS/darwin, requesting a smaller size is disallowed.
38803884
class OptionalAttachSharedMemory(shared_memory.SharedMemory):
38813885
_flags = os.O_CREAT | os.O_RDWR
3882-
ok_if_exists_sms = OptionalAttachSharedMemory('test01_tsmb')
3886+
ok_if_exists_sms = OptionalAttachSharedMemory(name_tsmb)
38833887
self.assertEqual(ok_if_exists_sms.size, sms.size)
38843888
ok_if_exists_sms.close()
38853889

@@ -4084,10 +4088,12 @@ def test_shared_memory_ShareableList_basics(self):
40844088
self.assertEqual(sl.count(b'adios'), 0)
40854089

40864090
# Exercise creating a duplicate.
4087-
sl_copy = shared_memory.ShareableList(sl, name='test03_duplicate')
4091+
pid = os.getpid()
4092+
name_duplicate = self._new_shm_name('test03_duplicate')
4093+
sl_copy = shared_memory.ShareableList(sl, name=name_duplicate)
40884094
try:
40894095
self.assertNotEqual(sl.shm.name, sl_copy.shm.name)
4090-
self.assertEqual('test03_duplicate', sl_copy.shm.name)
4096+
self.assertEqual(name_duplicate, sl_copy.shm.name)
40914097
self.assertEqual(list(sl), list(sl_copy))
40924098
self.assertEqual(sl.format, sl_copy.format)
40934099
sl_copy[-1] = 77

0 commit comments

Comments
 (0)