Skip to content

Commit 00b403d

Browse files
committed
initial commits
- Add tests for [BoundedSemaphore], Barrier and Condition - Update test for [R]Lock and Event
1 parent 5918085 commit 00b403d

2 files changed

Lines changed: 220 additions & 68 deletions

File tree

Lib/multiprocessing/synchronize.py

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,23 @@ def _make_name():
125125
return '%s-%s' % (process.current_process()._config['semprefix'],
126126
next(SemLock._rand))
127127

128+
def _get_procname_and_count(self):
129+
try:
130+
if self._semlock._is_mine():
131+
name = process.current_process().name
132+
if threading.current_thread().name != 'MainThread':
133+
name += '|' + threading.current_thread().name
134+
count = self._semlock._count()
135+
elif not self._semlock._is_zero():
136+
name, count = 'None', 0
137+
elif self._semlock._count() > 0:
138+
name, count = 'SomeOtherThread', 'nonzero'
139+
else:
140+
name, count = 'SomeOtherProcess', 'nonzero'
141+
except Exception:
142+
name, count = 'unknown', 'unknown'
143+
return name, count
144+
128145
#
129146
# Semaphore
130147
#
@@ -143,11 +160,12 @@ def get_value(self):
143160
return self._semlock._get_value()
144161

145162
def __repr__(self):
163+
res = super().__repr__()
146164
try:
147165
value = self.get_value()
148166
except Exception:
149167
value = 'unknown'
150-
return '<%s(value=%s)>' % (self.__class__.__name__, value)
168+
return f'<{res[1:-1]} (value={value})>'
151169

152170
#
153171
# Bounded semaphore
@@ -159,12 +177,13 @@ def __init__(self, value=1, *, ctx):
159177
SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx)
160178

161179
def __repr__(self):
180+
res = object.__repr__(self)
162181
try:
163182
value = self.get_value()
164183
except Exception:
165184
value = 'unknown'
166-
return '<%s(value=%s, maxvalue=%s)>' % \
167-
(self.__class__.__name__, value, self._semlock.maxvalue)
185+
return f'<{res[1:-1]} (value={value}, ' \
186+
f'maxvalue={self._semlock.maxvalue})>'
168187

169188
#
170189
# Non-recursive lock
@@ -176,20 +195,9 @@ def __init__(self, *, ctx):
176195
SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
177196

178197
def __repr__(self):
179-
try:
180-
if self._semlock._is_mine():
181-
name = process.current_process().name
182-
if threading.current_thread().name != 'MainThread':
183-
name += '|' + threading.current_thread().name
184-
elif not self._semlock._is_zero():
185-
name = 'None'
186-
elif self._semlock._count() > 0:
187-
name = 'SomeOtherThread'
188-
else:
189-
name = 'SomeOtherProcess'
190-
except Exception:
191-
name = 'unknown'
192-
return '<%s(owner=%s)>' % (self.__class__.__name__, name)
198+
res = super().__repr__()
199+
name, _ = self._get_procname_and_count()
200+
return f'<{res[1:-1]} (owner={name})>'
193201

194202
#
195203
# Recursive lock
@@ -201,21 +209,9 @@ def __init__(self, *, ctx):
201209
SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1, ctx=ctx)
202210

203211
def __repr__(self):
204-
try:
205-
if self._semlock._is_mine():
206-
name = process.current_process().name
207-
if threading.current_thread().name != 'MainThread':
208-
name += '|' + threading.current_thread().name
209-
count = self._semlock._count()
210-
elif not self._semlock._is_zero():
211-
name, count = 'None', 0
212-
elif self._semlock._count() > 0:
213-
name, count = 'SomeOtherThread', 'nonzero'
214-
else:
215-
name, count = 'SomeOtherProcess', 'nonzero'
216-
except Exception:
217-
name, count = 'unknown', 'unknown'
218-
return '<%s(%s, %s)>' % (self.__class__.__name__, name, count)
212+
res = super().__repr__()
213+
name, count = self._get_procname_and_count()
214+
return f'<{res[1:-1]} (owner={name}, count={count})>'
219215

220216
#
221217
# Condition variable
@@ -251,12 +247,15 @@ def _make_methods(self):
251247
self.release = self._lock.release
252248

253249
def __repr__(self):
250+
res = super().__repr__()
254251
try:
255252
num_waiters = (self._sleeping_count.get_value() -
256253
self._woken_count.get_value())
257254
except Exception:
258255
num_waiters = 'unknown'
259-
return '<%s(%s, %s)>' % (self.__class__.__name__, self._lock, num_waiters)
256+
257+
lock_repr, _ = self._lock._get_procname_and_count()
258+
return f'<{res[1:-1]} (lock={lock_repr}, waiters={num_waiters})>'
260259

261260
def wait(self, timeout=None):
262261
assert self._lock._semlock._is_mine(), \
@@ -368,8 +367,10 @@ def wait(self, timeout=None):
368367
return False
369368

370369
def __repr__(self):
370+
res = super().__repr__()
371371
set_status = 'set' if self.is_set() else 'unset'
372-
return f"<{type(self).__qualname__} at {id(self):#x} {set_status}>"
372+
return f'<{res[1:-1]} ({set_status})>'
373+
373374
#
374375
# Barrier
375376
#
@@ -409,3 +410,9 @@ def _count(self):
409410
@_count.setter
410411
def _count(self, value):
411412
self._array[1] = value
413+
414+
def __repr__(self):
415+
res = object.__repr__(self)
416+
if self.broken:
417+
return f'<{res[1:-1]} (broken)>'
418+
return f'<{res[1:-1]} (waiters={self.n_waiting}/{self.parties})>'

0 commit comments

Comments
 (0)