comparison mercurial/lock.py @ 43708:cd822413b9aa

lock: refactor in preparation for next commit Differential Revision: https://phab.mercurial-scm.org/D7198
author Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
date Fri, 01 Nov 2019 19:59:07 -0400
parents 313e3a279828
children 039fbd14d4e2
comparison
equal deleted inserted replaced
43707:da5ccc591cff 43708: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.