comparison mercurial/util.py @ 2024:6328445b0e71

Fixes to testpid() for Windows. Handle processes that no longer exist and processes that belong to another user. Enables the lock breaking changes from d314a89fa4f1 and subsequently "fixes" the left over locks reported in bug 112.
author Lee Cantey <lcantey@gmail.com>
date Thu, 30 Mar 2006 18:20:08 -0800
parents a8a618c57690
children 581d9a8b5fb9
comparison
equal deleted inserted replaced
2023:3bdd3bf17cfa 2024:6328445b0e71
533 pf = output_line[14:] 533 pf = output_line[14:]
534 if pf[0] == '`': 534 if pf[0] == '`':
535 pf = pf[1:-1] # Remove the quotes 535 pf = pf[1:-1] # Remove the quotes
536 return pf 536 return pf
537 537
538 try: # ActivePython can create hard links using win32file module 538 try: # Mark Hammond's win32all package allows better functionality on Windows
539 import win32api, win32con, win32file 539 import win32api, win32con, win32file, pywintypes
540 540
541 # create hard links using win32file module
541 def os_link(src, dst): # NB will only succeed on NTFS 542 def os_link(src, dst): # NB will only succeed on NTFS
542 win32file.CreateHardLink(dst, src) 543 win32file.CreateHardLink(dst, src)
543 544
544 def nlinks(pathname): 545 def nlinks(pathname):
545 """Return number of hardlinks for the given file.""" 546 """Return number of hardlinks for the given file."""
552 return res[7] 553 return res[7]
553 except: 554 except:
554 return os.stat(pathname).st_nlink 555 return os.stat(pathname).st_nlink
555 556
556 def testpid(pid): 557 def testpid(pid):
557 '''return False if pid is dead, True if running or not known''' 558 '''return True if pid is still running or unable to determine, False otherwise'''
558 try: 559 try:
559 win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, 560 handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, pid)
560 False, pid) 561 if handle:
561 except: 562 status = win32process.GetExitCodeProcess(handle)
562 return True 563 if status == win32con.STILL_ACTIVE:
564 return True
565 else:
566 return False
567 except pywintypes.error, details:
568 if details[0] == 87: # ERROR_INVALID_PARAMETER
569 return False
570 return True
563 571
564 except ImportError: 572 except ImportError:
565 def testpid(pid): 573 def testpid(pid):
566 '''return False if pid dead, True if running or not known''' 574 '''return False if pid dead, True if running or not known'''
567 return True 575 return True