summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/django/utils/synch.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/django/utils/synch.py')
-rw-r--r--lib/python2.7/site-packages/django/utils/synch.py93
1 files changed, 0 insertions, 93 deletions
diff --git a/lib/python2.7/site-packages/django/utils/synch.py b/lib/python2.7/site-packages/django/utils/synch.py
deleted file mode 100644
index 4859907..0000000
--- a/lib/python2.7/site-packages/django/utils/synch.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Synchronization primitives:
-
- - reader-writer lock (preference to writers)
-
-(Contributed to Django by eugene@lazutkin.com)
-"""
-
-import contextlib
-try:
- import threading
-except ImportError:
- import dummy_threading as threading
-
-
-class RWLock(object):
- """
- Classic implementation of reader-writer lock with preference to writers.
-
- Readers can access a resource simultaneously.
- Writers get an exclusive access.
-
- API is self-descriptive:
- reader_enters()
- reader_leaves()
- writer_enters()
- writer_leaves()
- """
- def __init__(self):
- self.mutex = threading.RLock()
- self.can_read = threading.Semaphore(0)
- self.can_write = threading.Semaphore(0)
- self.active_readers = 0
- self.active_writers = 0
- self.waiting_readers = 0
- self.waiting_writers = 0
-
- def reader_enters(self):
- with self.mutex:
- if self.active_writers == 0 and self.waiting_writers == 0:
- self.active_readers += 1
- self.can_read.release()
- else:
- self.waiting_readers += 1
- self.can_read.acquire()
-
- def reader_leaves(self):
- with self.mutex:
- self.active_readers -= 1
- if self.active_readers == 0 and self.waiting_writers != 0:
- self.active_writers += 1
- self.waiting_writers -= 1
- self.can_write.release()
-
- @contextlib.contextmanager
- def reader(self):
- self.reader_enters()
- try:
- yield
- finally:
- self.reader_leaves()
-
- def writer_enters(self):
- with self.mutex:
- if self.active_writers == 0 and self.waiting_writers == 0 and self.active_readers == 0:
- self.active_writers += 1
- self.can_write.release()
- else:
- self.waiting_writers += 1
- self.can_write.acquire()
-
- def writer_leaves(self):
- with self.mutex:
- self.active_writers -= 1
- if self.waiting_writers != 0:
- self.active_writers += 1
- self.waiting_writers -= 1
- self.can_write.release()
- elif self.waiting_readers != 0:
- t = self.waiting_readers
- self.waiting_readers = 0
- self.active_readers += t
- while t > 0:
- self.can_read.release()
- t -= 1
-
- @contextlib.contextmanager
- def writer(self):
- self.writer_enters()
- try:
- yield
- finally:
- self.writer_leaves()