Switch to unified view

a b/src/mediaserver/cdplugins/uprcl/rwlock.py
1
# Python Cookbook by David Ascher, Alex Martelli. Credit: Sami Hangaslammi
2
3
import threading
4
5
class ReadWriteLock:
6
    """ A lock object that allows many simultaneous "read locks", but
7
    only one "write lock." """
8
9
    def __init__(self):
10
        self._read_ready = threading.Condition(threading.Lock(  ))
11
        self._readers = 0
12
13
    def acquire_read(self):
14
        """ Acquire a read lock. Blocks only if a thread has
15
        acquired the write lock. """
16
        self._read_ready.acquire(  )
17
        try:
18
            self._readers += 1
19
        finally:
20
            self._read_ready.release(  )
21
22
    def release_read(self):
23
        """ Release a read lock. """
24
        self._read_ready.acquire(  )
25
        try:
26
            self._readers -= 1
27
            if not self._readers:
28
                self._read_ready.notifyAll(  )
29
        finally:
30
            self._read_ready.release(  )
31
32
    def acquire_write(self):
33
        """ Acquire a write lock. Blocks until there are no
34
        acquired read or write locks. """
35
        self._read_ready.acquire(  )
36
        while self._readers > 0:
37
            self._read_ready.wait(  )
38
39
    def release_write(self):
40
        """ Release a write lock. """
41
        self._read_ready.release(  )
42