mercurial/lock.py
changeset 43748 cd822413b9aa
parent 43551 313e3a279828
child 43749 039fbd14d4e2
equal deleted inserted replaced
43747:da5ccc591cff 43748:cd822413b9aa
   328         except (OSError, IOError) as why:
   328         except (OSError, IOError) as why:
   329             if why.errno == errno.ENOENT:
   329             if why.errno == errno.ENOENT:
   330                 return None
   330                 return None
   331             raise
   331             raise
   332 
   332 
   333     def _testlock(self, locker):
   333     def _lockshouldbebroken(self, locker):
   334         if locker is None:
   334         if locker is None:
   335             return None
   335             return False
   336         try:
   336         try:
   337             host, pid = locker.split(b":", 1)
   337             host, pid = locker.split(b":", 1)
   338         except ValueError:
   338         except ValueError:
   339             return locker
   339             return False
   340         if host != lock._host:
   340         if host != lock._host:
   341             return locker
   341             return False
   342         try:
   342         try:
   343             pid = int(pid)
   343             pid = int(pid)
   344         except ValueError:
   344         except ValueError:
       
   345             return False
       
   346         if procutil.testpid(pid):
       
   347             return False
       
   348         return True
       
   349 
       
   350     def _testlock(self, locker):
       
   351         if not self._lockshouldbebroken(locker):
   345             return locker
   352             return locker
   346         if procutil.testpid(pid):
   353 
   347             return locker
       
   348         # if locker dead, break lock.  must do this with another lock
   354         # if locker dead, break lock.  must do this with another lock
   349         # held, or can race and break valid lock.
   355         # held, or can race and break valid lock.
   350         try:
   356         try:
   351             l = lock(self.vfs, self.f + b'.break', timeout=0)
   357             with lock(self.vfs, self.f + b'.break', timeout=0):
   352             self.vfs.unlink(self.f)
   358                 self.vfs.unlink(self.f)
   353             l.release()
       
   354         except error.LockError:
   359         except error.LockError:
   355             return locker
   360             return locker
   356 
   361 
   357     def testlock(self):
   362     def testlock(self):
   358         """return id of locker if lock is valid, else None.
   363         """return id of locker if lock is valid, else None.