annotate Lib/mutex.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 7b1f6e5e9294
children b6f52c1ef6da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
216
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Mutual exclusion -- for use with module sched
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # A mutex has two pieces of state -- a 'locked' bit and a queue.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # When the mutex is not locked, the queue is empty.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Otherwise, the queue contains 0 or more (function, argument) pairs
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # representing functions (or methods) waiting to acquire the lock.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # When the mutex is unlocked while the queue is not empty,
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # the first queue entry is removed and its function(argument) pair called,
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # implying it now has the lock.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Of course, no multi-threading is implied -- hence the funny interface
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # for lock, where a function is called once the lock is aquired.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 #
531
8331076cfe15 New class syntax.
Guido van Rossum <guido@python.org>
parents: 216
diff changeset
14 class mutex:
216
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # Create a new mutex -- initially unlocked
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 self.locked = 0
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 self.queue = []
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Test the locked bit of the mutex
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 def test(self):
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 return self.locked
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 # Atomic test-and-set -- grab the lock if it is not set,
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # return true if it succeeded
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 def testandset(self):
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 if not self.locked:
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 self.locked = 1
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 return 1
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 else:
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 return 0
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 # Lock a mutex, call the function with supplied argument
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 # when it is acquired.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 # If the mutex is already locked, place function and argument
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 # in the queue.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if self.testandset():
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 function(argument)
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # Unlock a mutex. If the queue is not empty, call the next
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 # function with its argument.
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 #
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 def unlock(self):
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 if self.queue:
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 function, argument = self.queue[0]
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 del self.queue[0]
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 function(argument)
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 else:
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 self.locked = 0
1754b8024b55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 #