Mercurial > cpython-lru_cache-weakref
annotate Lib/mutex.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 7b1f6e5e9294 |
| children | b6f52c1ef6da |
| rev | line source |
|---|---|
| 216 | 1 # Mutual exclusion -- for use with module sched |
| 2 | |
| 3 # A mutex has two pieces of state -- a 'locked' bit and a queue. | |
| 4 # When the mutex is not locked, the queue is empty. | |
| 5 # Otherwise, the queue contains 0 or more (function, argument) pairs | |
| 6 # representing functions (or methods) waiting to acquire the lock. | |
| 7 # When the mutex is unlocked while the queue is not empty, | |
| 8 # the first queue entry is removed and its function(argument) pair called, | |
| 9 # implying it now has the lock. | |
| 10 # | |
| 11 # Of course, no multi-threading is implied -- hence the funny interface | |
| 12 # for lock, where a function is called once the lock is aquired. | |
| 13 # | |
| 531 | 14 class mutex: |
| 216 | 15 # |
| 16 # Create a new mutex -- initially unlocked | |
| 17 # | |
|
1435
560ec7030817
* Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents:
1110
diff
changeset
|
18 def __init__(self): |
| 216 | 19 self.locked = 0 |
| 20 self.queue = [] | |
| 21 # | |
| 22 # Test the locked bit of the mutex | |
| 23 # | |
| 24 def test(self): | |
| 25 return self.locked | |
| 26 # | |
| 27 # Atomic test-and-set -- grab the lock if it is not set, | |
| 28 # return true if it succeeded | |
| 29 # | |
| 30 def testandset(self): | |
| 31 if not self.locked: | |
| 32 self.locked = 1 | |
| 33 return 1 | |
| 34 else: | |
| 35 return 0 | |
| 36 # | |
| 37 # Lock a mutex, call the function with supplied argument | |
| 38 # when it is acquired. | |
| 39 # If the mutex is already locked, place function and argument | |
| 40 # in the queue. | |
| 41 # | |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
42 def lock(self, function, argument): |
| 216 | 43 if self.testandset(): |
| 44 function(argument) | |
| 45 else: | |
|
4363
7b1f6e5e9294
Change to always call list.append with a single argument.
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
46 self.queue.append((function, argument)) |
| 216 | 47 # |
| 48 # Unlock a mutex. If the queue is not empty, call the next | |
| 49 # function with its argument. | |
| 50 # | |
| 51 def unlock(self): | |
| 52 if self.queue: | |
| 53 function, argument = self.queue[0] | |
| 54 del self.queue[0] | |
| 55 function(argument) | |
| 56 else: | |
| 57 self.locked = 0 | |
| 58 # |
