Issue #21565: multiprocessing: use contex-manager protocol for synchronization

primitives.
This commit is contained in:
Charles-François Natali 2014-05-25 14:12:12 +01:00
parent 1691e35953
commit a924fc7abc
9 changed files with 43 additions and 102 deletions

View file

@ -188,6 +188,12 @@ def __init__(self, obj, lock=None, ctx=None):
self.acquire = self._lock.acquire
self.release = self._lock.release
def __enter__(self):
return self._lock.__enter__()
def __exit__(self, *args):
return self._lock.__exit__(*args)
def __reduce__(self):
assert_spawning(self)
return synchronized, (self._obj, self._lock)
@ -212,32 +218,20 @@ def __len__(self):
return len(self._obj)
def __getitem__(self, i):
self.acquire()
try:
with self:
return self._obj[i]
finally:
self.release()
def __setitem__(self, i, value):
self.acquire()
try:
with self:
self._obj[i] = value
finally:
self.release()
def __getslice__(self, start, stop):
self.acquire()
try:
with self:
return self._obj[start:stop]
finally:
self.release()
def __setslice__(self, start, stop, values):
self.acquire()
try:
with self:
self._obj[start:stop] = values
finally:
self.release()
class SynchronizedString(SynchronizedArray):