diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index 5bcb1f935..26cebde16 100755 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -1988,6 +1988,7 @@ cl_symbols[] = { {KEY_ "EXITED", KEYWORD, NULL, -1, OBJNULL}, {KEY_ "SIGNALED", KEYWORD, NULL, -1, OBJNULL}, {KEY_ "STOPPED", KEYWORD, NULL, -1, OBJNULL}, +{KEY_ "RESUMED", KEYWORD, NULL, -1, OBJNULL}, /* ~ external-process extension */ /* unixsys.d */ diff --git a/src/c/symbols_list2.h b/src/c/symbols_list2.h index 671ce0c9e..43c041a0a 100644 --- a/src/c/symbols_list2.h +++ b/src/c/symbols_list2.h @@ -1988,6 +1988,7 @@ cl_symbols[] = { {KEY_ "EXITED",NULL}, {KEY_ "SIGNALED",NULL}, {KEY_ "STOPPED",NULL}, +{KEY_ "RESUMED",NULL}, /* ~ external-process extension */ /* unixsys.d */ diff --git a/src/c/unixsys.d b/src/c/unixsys.d index c354c7154..9bf76838b 100644 --- a/src/c/unixsys.d +++ b/src/c/unixsys.d @@ -175,7 +175,12 @@ si_waitpid(cl_object pid, cl_object wait) ecl_enable_interrupts_env(the_env); #else int code_int, error; - error = waitpid(ecl_to_fix(pid), &code_int, Null(wait)? WNOHANG : 0); + + if (Null(wait)) + error = waitpid(ecl_to_fix(pid), &code_int, WNOHANG | WUNTRACED | WCONTINUED); + else + error = waitpid(ecl_to_fix(pid), &code_int, WUNTRACED | WCONTINUED); + if (error < 0) { if (errno == EINTR) { status = @':abort'; @@ -199,6 +204,9 @@ si_waitpid(cl_object pid, cl_object wait) } else if (WIFSTOPPED(code_int)) { status = @':stopped'; code = ecl_make_fixnum(WSTOPSIG(code_int)); + } else if (WIFCONTINUED(code_int)) { + status = @':resumed'; + code = ecl_make_fixnum(SIGCONT); } else { status = @':running'; code = ECL_NIL; diff --git a/src/lsp/process.lsp b/src/lsp/process.lsp index dfb1e2c1a..99c7dfd15 100644 --- a/src/lsp/process.lsp +++ b/src/lsp/process.lsp @@ -50,13 +50,14 @@ (ext:external-process-wait external-process nil) (values status (external-process-%code external-process))))) -;;; --------------------------------------------------------------------------- -;;; si:waitpid -> (values status code pid) -;;; --------------------------------------------------------------------------- -;;; nochg :: (values nil nil nil) -;;; error :: (values (member :abort :error) nil nil) -;;; chang :: (values (member :exited :signalled :stopped :running) code pid) -;;; --------------------------------------------------------------------------- +;;; --------------------------------------------------------------------- +;;; si:waitpid -> (values status code pid) +;;; --------------------------------------------------------------------- +;;; no change :: (values nil nil nil) +;;; error :: (values (member :abort :error) nil nil) +;;; finished :: (values (member :exited :signalled) code pid) +;;; running :: (values (member :stopped :resumed :running) code pid) +;;; --------------------------------------------------------------------- (defun external-process-wait (process &optional wait) (let ((pid (external-process-pid process))) (when pid @@ -68,7 +69,7 @@ (external-process-pid process) nil (external-process-%status process) status (external-process-%code process) code))) - ((:stopped :running) + ((:stopped :resumed :running) (setf (external-process-%status process) status (external-process-%code process) code)) ((nil) #| wait was nil and process didn't change |#)))))