Skip to content

Commit d6bb529

Browse files
committed
Initial commit
1 parent 760872e commit d6bb529

File tree

2 files changed

+124
-2
lines changed

2 files changed

+124
-2
lines changed

Lib/multiprocessing/synchronize.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def __repr__(self):
174174
name = process.current_process().name
175175
if threading.current_thread().name != 'MainThread':
176176
name += '|' + threading.current_thread().name
177-
elif self._semlock._get_value() == 1:
177+
elif not self._semlock._is_zero():
178178
name = 'None'
179179
elif self._semlock._count() > 0:
180180
name = 'SomeOtherThread'
@@ -200,7 +200,7 @@ def __repr__(self):
200200
if threading.current_thread().name != 'MainThread':
201201
name += '|' + threading.current_thread().name
202202
count = self._semlock._count()
203-
elif self._semlock._get_value() == 1:
203+
elif not self._semlock._is_zero():
204204
name, count = 'None', 0
205205
elif self._semlock._count() > 0:
206206
name, count = 'SomeOtherThread', 'nonzero'

Lib/test/_test_multiprocessing.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,13 +1362,135 @@ def test_closed_queue_put_get_exceptions(self):
13621362

13631363
class _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

Comments
 (0)