@@ -1362,13 +1362,135 @@ def test_closed_queue_put_get_exceptions(self):
13621362
13631363class _TestLock (BaseTestCase ):
13641364
1365+ @staticmethod
1366+ def _acquire (lock , l = None ):
1367+ lock .acquire ()
1368+ if l is not None :
1369+ l .append (repr (lock ))
1370+
1371+ @staticmethod
1372+ def _acquire_event (lock , event ):
1373+ lock .acquire ()
1374+ event .set ()
1375+ time .sleep (1.0 )
1376+
1377+ def test_repr_lock (self ):
1378+ if self .TYPE != 'processes' :
1379+ self .skipTest ('test not appropriate for {}' .format (self .TYPE ))
1380+
1381+ lock = self .Lock ()
1382+ self .assertEqual (f'<Lock(owner=None)>' , repr (lock ))
1383+
1384+ lock .acquire ()
1385+ self .assertEqual (f'<Lock(owner=MainProcess)>' , repr (lock ))
1386+ lock .release ()
1387+
1388+ tname = 'T1'
1389+ l = []
1390+ t = threading .Thread (target = self ._acquire ,
1391+ args = (lock , l ),
1392+ name = tname )
1393+ t .start ()
1394+ time .sleep (0.1 )
1395+ self .assertEqual (f'<Lock(owner=MainProcess|{ tname } )>' , l [0 ])
1396+ lock .release ()
1397+
1398+ t = threading .Thread (target = self ._acquire ,
1399+ args = (lock ,),
1400+ name = tname )
1401+ t .start ()
1402+ time .sleep (0.1 )
1403+ self .assertEqual ('<Lock(owner=SomeOtherThread)>' , repr (lock ))
1404+ lock .release ()
1405+
1406+ pname = 'P1'
1407+ l = multiprocessing .Manager ().list ()
1408+ p = self .Process (target = self ._acquire ,
1409+ args = (lock , l ),
1410+ name = pname )
1411+ p .start ()
1412+ p .join ()
1413+ self .assertEqual (f'<Lock(owner={ pname } )>' , l [0 ])
1414+
1415+ lock = self .Lock ()
1416+ event = self .Event ()
1417+ p = self .Process (target = self ._acquire_event ,
1418+ args = (lock , event ),
1419+ name = 'P2' )
1420+ p .start ()
1421+ event .wait ()
1422+ self .assertEqual (f'<Lock(owner=SomeOtherProcess)>' , repr (lock ))
1423+ p .terminate ()
1424+
13651425 def test_lock (self ):
13661426 lock = self .Lock ()
13671427 self .assertEqual (lock .acquire (), True )
13681428 self .assertEqual (lock .acquire (False ), False )
13691429 self .assertEqual (lock .release (), None )
13701430 self .assertRaises ((ValueError , threading .ThreadError ), lock .release )
13711431
1432+ @staticmethod
1433+ def _acquire_release (lock , timeout , l = None , n = 1 ):
1434+ for _ in range (n ):
1435+ lock .acquire ()
1436+ if l is not None :
1437+ l .append (repr (lock ))
1438+ time .sleep (timeout )
1439+ for _ in range (n ):
1440+ lock .release ()
1441+
1442+ def test_repr_rlock (self ):
1443+ if self .TYPE != 'processes' :
1444+ self .skipTest ('test not appropriate for {}' .format (self .TYPE ))
1445+
1446+ lock = self .RLock ()
1447+ self .assertEqual ('<RLock(None, 0)>' , repr (lock ))
1448+
1449+ n = 3
1450+ for _ in range (n ):
1451+ lock .acquire ()
1452+ self .assertEqual (f'<RLock(MainProcess, { n } )>' , repr (lock ))
1453+ for _ in range (n ):
1454+ lock .release ()
1455+
1456+ t , l = [], []
1457+ for i in range (n ):
1458+ t .append (threading .Thread (target = self ._acquire_release ,
1459+ args = (lock , 0.1 , l , i + 1 ),
1460+ name = f'T{ i + 1 } ' ))
1461+ t [- 1 ].start ()
1462+ for t_ in t :
1463+ t_ .join ()
1464+ for i in range (n ):
1465+ self .assertIn (f'<RLock(MainProcess|T{ i + 1 } , { i + 1 } )>' , l )
1466+
1467+
1468+ t = threading .Thread (target = self ._acquire_release ,
1469+ args = (lock , 0.2 ),
1470+ name = f'T1' )
1471+ t .start ()
1472+ time .sleep (0.1 )
1473+ self .assertEqual ('<RLock(SomeOtherThread, nonzero)>' , repr (lock ))
1474+ time .sleep (0.2 )
1475+
1476+ pname = 'P1'
1477+ l = multiprocessing .Manager ().list ()
1478+ p = self .Process (target = self ._acquire_release ,
1479+ args = (lock , 0.1 , l ),
1480+ name = pname )
1481+ p .start ()
1482+ p .join ()
1483+ self .assertEqual (f'<RLock({ pname } , 1)>' , l [0 ])
1484+
1485+ event = self .Event ()
1486+ lock = self .RLock ()
1487+ p = self .Process (target = self ._acquire_event ,
1488+ args = (lock , event ))
1489+ p .start ()
1490+ event .wait ()
1491+ self .assertEqual ('<RLock(SomeOtherProcess, nonzero)>' , repr (lock ))
1492+ p .join ()
1493+
13721494 def test_rlock (self ):
13731495 lock = self .RLock ()
13741496 self .assertEqual (lock .acquire (), True )
0 commit comments