summary refs log blame commit diff stats
path: root/nimsuggest/procmonitor.nim
blob: 0f1ba1e0d39d0a88061cf7ddd43ac819e6809b73 (plain) (tree)

































                                                                          
# Monitor a client process and shutdown the current process, if the client
# process is found to be dead

import os

when defined(posix):
  import posix_utils
  import posix

when defined(windows):
  import winlean

when defined(posix):
  proc monitorClientProcessIdThreadProc(pid: int) {.thread.} =
    while true:
      sleep(1000)
      try:
        sendSignal(Pid(pid), 0)
      except:
        discard kill(Pid(getCurrentProcessId()), cint(SIGTERM))

when defined(windows):
  proc monitorClientProcessIdThreadProc(pid: int) {.thread.} =
    var process = openProcess(SYNCHRONIZE, 0, DWORD(pid))
    if process != 0:
      discard waitForSingleObject(process, INFINITE)
      discard closeHandle(process)
    quit(0)

var tid: Thread[int]

proc hookProcMonitor*(pid: int) =
  when defined(posix) or defined(windows):
    createThread(tid, monitorClientProcessIdThreadProc, pid)