home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Lib / mutex.py < prev    next >
Text File  |  1996-10-08  |  2KB  |  59 lines

  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. #
  14. class mutex:
  15.     #
  16.     # Create a new mutex -- initially unlocked
  17.     #
  18.     def __init__(self):
  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.     #
  42.     def lock(self, function, argument):
  43.         if self.testandset():
  44.             function(argument)
  45.         else:
  46.             self.queue.append((function, argument))
  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.     #
  59.