@@ -3769,13 +3769,20 @@ def _attach_existing_shmem_then_write(shmem_name_or_obj, binary_data):
3769
3769
local_sms .buf [:len (binary_data )] = binary_data
3770
3770
local_sms .close ()
3771
3771
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
+
3772
3778
@unittest .skipIf (sys .platform == "win32" , "test is broken on Windows" )
3773
3779
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 )
3775
3782
self .addCleanup (sms .unlink )
3776
3783
3777
3784
# Verify attributes are readable.
3778
- self .assertEqual (sms .name , 'test01_tsmb' )
3785
+ self .assertEqual (sms .name , name_tsmb )
3779
3786
self .assertGreaterEqual (sms .size , 512 )
3780
3787
self .assertGreaterEqual (len (sms .buf ), sms .size )
3781
3788
@@ -3784,12 +3791,12 @@ def test_shared_memory_basics(self):
3784
3791
self .assertEqual (sms .buf [0 ], 42 )
3785
3792
3786
3793
# Attach to existing shared memory segment.
3787
- also_sms = shared_memory .SharedMemory ('test01_tsmb' )
3794
+ also_sms = shared_memory .SharedMemory (name_tsmb )
3788
3795
self .assertEqual (also_sms .buf [0 ], 42 )
3789
3796
also_sms .close ()
3790
3797
3791
3798
# 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 )
3793
3800
self .assertLess (same_sms .size , 20 * sms .size ) # Size was ignored.
3794
3801
same_sms .close ()
3795
3802
@@ -3807,7 +3814,7 @@ def test_shared_memory_basics(self):
3807
3814
'multiprocessing.shared_memory._make_filename' ) as mock_make_filename :
3808
3815
3809
3816
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' ) ]
3811
3818
# Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary
3812
3819
# because some POSIX compliant systems require name to start with /
3813
3820
names = [NAME_PREFIX + name for name in names ]
@@ -3829,17 +3836,17 @@ def test_shared_memory_basics(self):
3829
3836
# manages unlinking on its own and unlink() does nothing).
3830
3837
# True release of shared memory segment does not necessarily
3831
3838
# 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
+ )
3832
3845
with self .assertRaises (FileNotFoundError ):
3833
- sms_uno = shared_memory .SharedMemory (
3834
- 'test01_dblunlink' ,
3835
- create = True ,
3836
- size = 5000
3837
- )
3838
-
3839
3846
try :
3840
3847
self .assertGreaterEqual (sms_uno .size , 5000 )
3841
3848
3842
- sms_duo = shared_memory .SharedMemory ('test01_dblunlink' )
3849
+ sms_duo = shared_memory .SharedMemory (name_dblunlink )
3843
3850
sms_duo .unlink () # First shm_unlink() call.
3844
3851
sms_duo .close ()
3845
3852
sms_uno .close ()
@@ -3851,7 +3858,7 @@ def test_shared_memory_basics(self):
3851
3858
# Attempting to create a new shared memory segment with a
3852
3859
# name that is already in use triggers an exception.
3853
3860
there_can_only_be_one_sms = shared_memory .SharedMemory (
3854
- 'test01_tsmb' ,
3861
+ name_tsmb ,
3855
3862
create = True ,
3856
3863
size = 512
3857
3864
)
@@ -3865,7 +3872,7 @@ def test_shared_memory_basics(self):
3865
3872
# case of MacOS/darwin, requesting a smaller size is disallowed.
3866
3873
class OptionalAttachSharedMemory (shared_memory .SharedMemory ):
3867
3874
_flags = os .O_CREAT | os .O_RDWR
3868
- ok_if_exists_sms = OptionalAttachSharedMemory ('test01_tsmb' )
3875
+ ok_if_exists_sms = OptionalAttachSharedMemory (name_tsmb )
3869
3876
self .assertEqual (ok_if_exists_sms .size , sms .size )
3870
3877
ok_if_exists_sms .close ()
3871
3878
@@ -4053,10 +4060,11 @@ def test_shared_memory_ShareableList_basics(self):
4053
4060
self .assertEqual (sl .count (b'adios' ), 0 )
4054
4061
4055
4062
# 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 )
4057
4065
try :
4058
4066
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 )
4060
4068
self .assertEqual (list (sl ), list (sl_copy ))
4061
4069
self .assertEqual (sl .format , sl_copy .format )
4062
4070
sl_copy [- 1 ] = 77
0 commit comments