mirror of
https://github.com/YosysHQ/sby.git
synced 2025-04-23 13:25:31 +00:00
rm ctypes impl as it is no longer needed
This commit is contained in:
parent
031cdb8df3
commit
3a776c329f
1 changed files with 0 additions and 88 deletions
|
@ -1,88 +0,0 @@
|
|||
from ctypes import sizeof, windll
|
||||
from ctypes.wintypes import DWORD, LONG, ULONG
|
||||
from ctypes import Structure, c_char, pointer, POINTER
|
||||
import os
|
||||
|
||||
# relevant WinAPI references:
|
||||
# https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot
|
||||
# https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/ns-tlhelp32-processentry32
|
||||
# https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-process32first
|
||||
# https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-process32next
|
||||
|
||||
TH32CS_SNAPPROCESS = 0x00000002
|
||||
INVALID_HANDLE_VALUE = -1
|
||||
|
||||
|
||||
class PROCESSENTRY32(Structure):
|
||||
_fields_ = [
|
||||
("dwSize", DWORD),
|
||||
("cntUsage", DWORD),
|
||||
("th32ProcessID", DWORD),
|
||||
("th32DefaultHeapID", POINTER(ULONG)),
|
||||
("th32ModuleID", DWORD),
|
||||
("cntThreads", DWORD),
|
||||
("th32ParentProcessID", DWORD),
|
||||
("pcPriClassBase", LONG),
|
||||
("dwFlags", DWORD),
|
||||
("szExeFile", c_char * 260),
|
||||
]
|
||||
|
||||
|
||||
def _visit_all_children(pid, lookup, visited):
|
||||
if pid not in visited:
|
||||
visited.add(pid)
|
||||
if pid in lookup:
|
||||
for c in lookup[pid]:
|
||||
_visit_all_children(c, lookup, visited)
|
||||
|
||||
|
||||
def _update_lookup(pid_lookup, pe):
|
||||
cpid = pe.contents.th32ProcessID
|
||||
ppid = pe.contents.th32ParentProcessID
|
||||
# pid 0 should be the only one that is its own parent.
|
||||
# don't add this entry to the graph to avoid an unwanted cycle
|
||||
if ppid == 0 and cpid == 0:
|
||||
return
|
||||
assert (
|
||||
cpid != ppid
|
||||
), "Internal error listing windows processes - process is its own parent"
|
||||
if ppid not in pid_lookup:
|
||||
pid_lookup[ppid] = []
|
||||
pid_lookup[ppid].append(cpid)
|
||||
|
||||
|
||||
def _create_process_lookup():
|
||||
handle = windll.kernel32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
|
||||
if handle == INVALID_HANDLE_VALUE:
|
||||
raise RuntimeError(
|
||||
"Could not snapshot running processes - invalid handle returned"
|
||||
)
|
||||
pe = pointer(PROCESSENTRY32())
|
||||
pe.contents.dwSize = sizeof(PROCESSENTRY32)
|
||||
pid_lookup = {}
|
||||
if windll.kernel32.Process32First(handle, pe) != 0:
|
||||
_update_lookup(pid_lookup, pe)
|
||||
while windll.kernel32.Process32Next(handle, pe) != 0:
|
||||
_update_lookup(pid_lookup, pe)
|
||||
|
||||
return pid_lookup
|
||||
|
||||
|
||||
def win_killpg(pid):
|
||||
"""
|
||||
Approximate the behaviour of os.killpg(pid, signal.SIGKILL) on Windows.
|
||||
|
||||
Windows processes appear to keep track of their parent rather than their
|
||||
children, so it is necessary to build a graph of all running processes
|
||||
first and use this to derive a list of child processes to be killed.
|
||||
"""
|
||||
pid_lookup = _create_process_lookup()
|
||||
to_kill = set()
|
||||
_visit_all_children(pid, pid_lookup, to_kill)
|
||||
for p in to_kill:
|
||||
try:
|
||||
# "Any other value for sig will cause the process to be
|
||||
# unconditionally killed by the TerminateProcess API"
|
||||
os.kill(p, -1)
|
||||
except (PermissionError, OSError) as e:
|
||||
print("WARNING: error while killing pid {}: {}".format(p, e))
|
Loading…
Add table
Add a link
Reference in a new issue