mercurial/lock.py
changeset 15583 926a06f7a353
parent 14494 1ffeeb91c55d
child 15589 cc24e4ed3e0c
equal deleted inserted replaced
15581:d8fa35c28335 15583:926a06f7a353
    33         self.f = file
    33         self.f = file
    34         self.held = 0
    34         self.held = 0
    35         self.timeout = timeout
    35         self.timeout = timeout
    36         self.releasefn = releasefn
    36         self.releasefn = releasefn
    37         self.desc = desc
    37         self.desc = desc
       
    38         self.postreleasehooks  = []
    38         self.lock()
    39         self.lock()
    39 
    40 
    40     def __del__(self):
    41     def __del__(self):
    41         if self.held:
    42         if self.held:
    42             warnings.warn("use lock.release instead of del lock",
    43             warnings.warn("use lock.release instead of del lock",
   117             l.release()
   118             l.release()
   118         except error.LockError:
   119         except error.LockError:
   119             return locker
   120             return locker
   120 
   121 
   121     def release(self):
   122     def release(self):
       
   123         """release the lock and execute callback function if any
       
   124 
       
   125         If the lock have been aquired multiple time, the actual release is
       
   126         delayed to the last relase call."""
   122         if self.held > 1:
   127         if self.held > 1:
   123             self.held -= 1
   128             self.held -= 1
   124         elif self.held == 1:
   129         elif self.held == 1:
   125             self.held = 0
   130             self.held = 0
   126             if self.releasefn:
   131             if self.releasefn:
   127                 self.releasefn()
   132                 self.releasefn()
   128             try:
   133             try:
   129                 util.unlink(self.f)
   134                 util.unlink(self.f)
   130             except OSError:
   135             except OSError:
   131                 pass
   136                 pass
       
   137             for callback in self.postreleasehooks:
       
   138                 callback()
   132 
   139 
   133 def release(*locks):
   140 def release(*locks):
   134     for lock in locks:
   141     for lock in locks:
   135         if lock is not None:
   142         if lock is not None:
   136             lock.release()
   143             lock.release()