Mercurial > public > mercurial-scm > hg
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. |