mirror of
https://github.com/iperov/DeepFaceLive
synced 2025-07-16 10:03:42 -07:00
code release
This commit is contained in:
parent
b941ba41a3
commit
a902f11f74
354 changed files with 826570 additions and 1 deletions
83
xlib/mp/RWLock.py
Normal file
83
xlib/mp/RWLock.py
Normal file
|
@ -0,0 +1,83 @@
|
|||
import multiprocessing
|
||||
|
||||
class RWLock():
|
||||
"""
|
||||
Multiprocessing non-recursive reader-writer lock
|
||||
"""
|
||||
def __init__(self):
|
||||
self._a = multiprocessing.RawArray('I', 2)
|
||||
#_a[0] : readers counter
|
||||
#_a[1] : writer flag
|
||||
self._v = memoryview(self._a).cast('B').cast('I')
|
||||
self._l = multiprocessing.Lock()
|
||||
|
||||
def read_lock(self):
|
||||
v = self._v
|
||||
l = self._l
|
||||
while True:
|
||||
# Non blocky wait writer flag release
|
||||
while v[1] != 0:
|
||||
pass
|
||||
|
||||
l.acquire()
|
||||
if v[1] != 0:
|
||||
# Writer flag is still acquired, go to non-blocky waiting
|
||||
l.release()
|
||||
continue
|
||||
|
||||
# Inc readers counter
|
||||
v[0] += 1
|
||||
l.release()
|
||||
return
|
||||
|
||||
def read_unlock(self):
|
||||
v = self._v
|
||||
l = self._l
|
||||
l.acquire()
|
||||
c = v[0]
|
||||
if c == 0:
|
||||
raise Exception('Invalid lock state')
|
||||
# Dec readers counter
|
||||
v[0] = c-1
|
||||
l.release()
|
||||
|
||||
def write_lock(self):
|
||||
v = self._v
|
||||
l = self._l
|
||||
|
||||
while True:
|
||||
# Non blocky wait writer flag release
|
||||
while v[1] != 0:
|
||||
pass
|
||||
l.acquire()
|
||||
if v[1] != 0:
|
||||
# Writer flag is still acquired, go to non-blocky waiting
|
||||
l.release()
|
||||
continue
|
||||
# set writer flag
|
||||
v[1] = 1
|
||||
l.release()
|
||||
|
||||
# Wait all readers gone
|
||||
while v[0] != 0:
|
||||
pass
|
||||
return
|
||||
|
||||
def write_unlock(self):
|
||||
v = self._v
|
||||
c = v[1]
|
||||
if c == 0:
|
||||
raise Exception('Invalid lock state')
|
||||
# Remove writer flag
|
||||
v[1] = 0
|
||||
|
||||
def __getstate__(self):
|
||||
d = self.__dict__.copy()
|
||||
# pop unpicklable memoryview object
|
||||
d.pop('_v')
|
||||
return d
|
||||
|
||||
def __setstate__(self, d):
|
||||
# restore memoryview of RawArray
|
||||
d['_v'] = memoryview(d['_a']).cast('B').cast('I')
|
||||
self.__dict__.update(d)
|
Loading…
Add table
Add a link
Reference in a new issue