Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: utf-8 -*-
from threading import Lock
class RWLock(object):
'''
'''
def __init__(self):
self._mutex = Lock()
self._writemutex = Lock()
self._readers = 0
self._writers = 0
self.read = self._RLock(self)
self.write = self._WLock(self)
class _Lock(object):
'''
'''
def __init__(self, rwlock):
self._parent = rwlock
class _WLock(_Lock):
'''
'''
def __enter__(self):
with self._parent._mutex:
self._parent._writers += 1
self._parent._writemutex.acquire()
def __exit__(self, exc_type, exc_value, traceback):
with self._parent._mutex:
self._parent._writers -= 1
self._parent._writemutex.release()
class _RLock(_Lock):
'''
'''
def __enter__(self):
self._parent._mutex.acquire()
if self._parent._writers > 0 or self._parent._readers == 0:
self._parent._mutex.release()
self._parent._writemutex.acquire()
self._parent._mutex.acquire()
self._parent._readers += 1
self._parent._mutex.release()
def __exit__(self, exc_type, exc_value, traceback):
self._parent._mutex.acquire()
self._parent._readers -= 1
if self._parent._readers == 0:
self._parent._writemutex.release()
self._parent._mutex.release()