From 47f1525ebdba36c0fdd9c60e282a18d96f8d74dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Sun, 19 Feb 2017 13:00:58 +0100 Subject: [PATCH] external-process: add disabled terminate-process --- src/lsp/process.lsp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/lsp/process.lsp b/src/lsp/process.lsp index fdfe900be..7dee9afc7 100644 --- a/src/lsp/process.lsp +++ b/src/lsp/process.lsp @@ -29,6 +29,8 @@ (ext:external-process-wait external-process nil) (values status (external-process-%code external-process))))) +;;; XXX: we do not handle zombies yet + ;;; --------------------------------------------------------------------------- ;;; si:waitpid -> (values status code pid) ;;; --------------------------------------------------------------------------- @@ -47,6 +49,19 @@ (values (external-process-%status process) (external-process-%code process))) +#+ (or) +(defun terminate-process (process &optional force) + (let ((pid (external-process-pid process))) + #+windows + (ffi:c-inline + (process pid) (:object :object) :void + "HANDLE *ph = (HANDLE*)ecl_foreign_data_pointer_safe(#1); + ret = TerminateProcess(*ph, -1); + if (ret == 0) FEerror(\"Cannot terminate the process ~A\", 1, #2);") + #-windows + (unless (zerop (si:signal pid (if force +sigkill+ +sigterm+))) + (error "Cannot terminate the process ~A" process)))) + ;;; ;;; Backwards compatible SI:SYSTEM call. We avoid ANSI C system() ;;; because we are consuming the process wait status using a SIGCHLD