From 3da2b8fba2177649e2e1a947f099cfe5cf061ad8 Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 25 Apr 2026 12:49:14 +0200 Subject: [PATCH 1/4] add tests --- tests/scryer/cli/unix/process.md | 22 +++++++++++++++++++++- tests/scryer/cli/windows/process.md | 18 +++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tests/scryer/cli/unix/process.md b/tests/scryer/cli/unix/process.md index 6bb174e4..8709caa7 100644 --- a/tests/scryer/cli/unix/process.md +++ b/tests/scryer/cli/unix/process.md @@ -1,5 +1,6 @@ ```trycmd -$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_wait(P, exit(1)), halt' +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), halt' +pid=[..] ``` @@ -11,4 +12,23 @@ $ scryer-prolog -f --no-add-history -g 'use_module(library(process)), use_modul ```trycmd $ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("sh", ["-c", "sleep 5"], [process(P), stdout(null)]), process_kill(P), process_wait(P, killed(9)), halt' +``` + + +```trycmd +$ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), process_id(P, Pid2), write(pid=Pid2), nl' +? success +pid=[..] +pid=[..] + +``` + + +domain error is expected release option doesn't exsist yet +```trycmd +$ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1), [release(false)]), process_id(P, Pid2), write(pid=Pid2), nl, process_release(P), process_id(P, Pid3), write(pid=Pid3), nl' +? success +pid=[..] +use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(domain_error(process_wait_option,release),[predicate-process_wait/3,predicate-check_options/3,predicate-must_be_known_options/3]) + ``` \ No newline at end of file diff --git a/tests/scryer/cli/windows/process.md b/tests/scryer/cli/windows/process.md index da27656b..dcfb33bc 100644 --- a/tests/scryer/cli/windows/process.md +++ b/tests/scryer/cli/windows/process.md @@ -1,9 +1,25 @@ ```trycmd -$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_wait(P, exit(1)), halt' +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), halt' +pid=[..] ``` ```trycmd $ scryer-prolog -f --no-add-history -g 'use_module(library(process)), use_module(library(format)), process_create("cmd", [], [process(P), stdout(null), stdin(pipe(S))]), format(S, "exit 1~n", []), process_wait(P, exit(1)), halt' +``` + +```trycmd +$ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), process_id(P, Pid2), write(pid=Pid2), nl' +pid=[..] +pid=[..] + +``` + +domain error is expected as the release option has not yet been added +```trycmd +$ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1), [release(false)]), process_id(P, Pid2), write(pid=Pid2), nl, process_release(P), process_id(P, Pid3), write(pid=Pid3), nl' +pid=[..] +use_module(library(process)),process_create("cmd",["/C","exit","1"],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(domain_error(process_wait_option,release),[predicate-process_wait/3,predicate-check_options/3,predicate-must_be_known_options/3]) + ``` \ No newline at end of file From f8c46798501821a920ecf09bde329021c5d9e37f Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 25 Apr 2026 12:59:20 +0200 Subject: [PATCH 2/4] add process_wait/3 release(Bool) option make process_wait/3 release the Process by default --- src/lib/process.pl | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/lib/process.pl b/src/lib/process.pl index 57c71426..371006d8 100644 --- a/src/lib/process.pl +++ b/src/lib/process.pl @@ -95,10 +95,12 @@ process_wait(Process, Status) :- call_with_error_context(process_wait(Process, S % `Options` is a a list of the following options % % * timeout(Timeout) supported values for `Timeout` are 0 or `infinite` +% * release(Bool) supported values for `Bool` are `true` or `false` % % Each options may be specified at most once, when an option is not specified the following defaults apply: % % - timeout(infinite) +% - release(true) % process_wait(Process, Status, Options) :- call_with_error_context(process_wait_(Process, Status, Options), predicate-process_wait/3). @@ -106,17 +108,29 @@ process_wait_(Process, Status, Options) :- valid_process(Process), check_options( [ - option([timeout], valid_timeout, timeout(infinite), timeout(Timeout)) + option([timeout], valid_timeout, timeout(infinite), timeout(Timeout)), + option([release], valid_release, release(true), release(Release)) ], Options, process_wait_option ), '$process_wait'(Process, Exit, Timeout), + ((true = Release) -> '$process_release'(Process) ; true), Exit = Status. valid_timeout(timeout(infinite)). valid_timeout(timeout(0)). +valid_release(release(Arg)) :- + ( var(Arg) -> instantiation_error([]) + ; valid_bool(Arg) -> true + ; domain_error(boolean, Arg, []) + ). + + +valid_bool(true). +valid_bool(false). + %% process_kill(+Process). % @@ -139,10 +153,9 @@ process_kill_(Process) :- % process_release(Process) :- call_with_error_context(process_release_(Process), predicate-process_release/1). -process_release_(Process) :- +process_release_(Process) :- valid_process(Process), - process_wait(Process, _), - '$process_release'(Process). + process_wait(Process, _). must_be_known_options(Valid, Options, Domain) :- call_with_error_context(must_be_known_options_(Valid, [], Options, Domain),predicate-must_be_known_options/3). @@ -184,9 +197,9 @@ find_option(Names, Found, T) :- functor(Found, Name, 1), memberd_t(Name, Names, T). -valid_stdio(IO) :- arg(1, IO, Arg), - ( var(Arg) -> instantiation_error([]) - ; valid_stdio_(Arg) -> true +valid_stdio(IO) :- arg(1, IO, Arg), + ( var(Arg) -> instantiation_error([]) + ; valid_stdio_(Arg) -> true ; domain_error(stdio_spec, Arg, []) ). From 83add732e07c67e166844bff8a7d9ae43030d0cd Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 25 Apr 2026 13:56:48 +0200 Subject: [PATCH 3/4] adjust test expectations --- tests/scryer/cli/unix/process.md | 20 +++++++++++++++----- tests/scryer/cli/windows/process.md | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/tests/scryer/cli/unix/process.md b/tests/scryer/cli/unix/process.md index 8709caa7..3232855c 100644 --- a/tests/scryer/cli/unix/process.md +++ b/tests/scryer/cli/unix/process.md @@ -15,20 +15,30 @@ $ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_c ``` +existence error is expected as the process was released, but the program shouldn't panic, see [issue 3300](https://github.com/mthom/scryer-prolog/issues/3300) ```trycmd $ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), process_id(P, Pid2), write(pid=Pid2), nl' -? success -pid=[..] +? failed pid=[..] +use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1)),process_id(P,Pid2),write(pid=Pid2),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) + +thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +called `Result::unwrap()` on an `Err` value: () +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` -domain error is expected release option doesn't exsist yet +existence error is expected as the process was released, but the program shouldn't panic, see [issue 3300](https://github.com/mthom/scryer-prolog/issues/3300) ```trycmd $ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("false", [], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1), [release(false)]), process_id(P, Pid2), write(pid=Pid2), nl, process_release(P), process_id(P, Pid3), write(pid=Pid3), nl' -? success +? failed pid=[..] -use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(domain_error(process_wait_option,release),[predicate-process_wait/3,predicate-check_options/3,predicate-must_be_known_options/3]) +pid=[..] +use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) + +thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +called `Result::unwrap()` on an `Err` value: () +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` \ No newline at end of file diff --git a/tests/scryer/cli/windows/process.md b/tests/scryer/cli/windows/process.md index dcfb33bc..d593cb45 100644 --- a/tests/scryer/cli/windows/process.md +++ b/tests/scryer/cli/windows/process.md @@ -9,17 +9,29 @@ $ scryer-prolog -f --no-add-history -g 'use_module(library(process)), use_modul ``` +existence error is expected as the process has been released, but the panic is unexpected see [issue 3300](https://github.com/mthom/scryer-prolog/issues/3300) ```trycmd $ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1)), process_id(P, Pid2), write(pid=Pid2), nl' +? failed pid=[..] -pid=[..] +use_module(library(process)),process_create("cmd",["/C","exit","1"],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1)),process_id(P,Pid2),write(pid=Pid2),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) + +thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +called `Result::unwrap()` on an `Err` value: () +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` -domain error is expected as the release option has not yet been added +existence error is expected as the process has been released, but the panic is unexpected see [issue 3300](https://github.com/mthom/scryer-prolog/issues/3300) ```trycmd $ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), process_create("cmd", ["/C", "exit", "1"], [process(P)]), process_id(P, Pid), write(pid=Pid), nl, process_wait(P, exit(1), [release(false)]), process_id(P, Pid2), write(pid=Pid2), nl, process_release(P), process_id(P, Pid3), write(pid=Pid3), nl' +? failed pid=[..] -use_module(library(process)),process_create("cmd",["/C","exit","1"],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(domain_error(process_wait_option,release),[predicate-process_wait/3,predicate-check_options/3,predicate-must_be_known_options/3]) +pid=[..] +use_module(library(process)),process_create("cmd",["/C","exit","1"],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) + +thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +called `Result::unwrap()` on an `Err` value: () +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` \ No newline at end of file From ab2b652c8483dab4abacaa9afd980853e81da45a Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 25 Apr 2026 15:19:41 +0200 Subject: [PATCH 4/4] fix linux tests on 1.85 old rust versions didn't print the pid --- tests/scryer/cli/unix/process.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scryer/cli/unix/process.md b/tests/scryer/cli/unix/process.md index 3232855c..c81a08a8 100644 --- a/tests/scryer/cli/unix/process.md +++ b/tests/scryer/cli/unix/process.md @@ -22,7 +22,7 @@ $ scryer-prolog -f --no-add-history -t halt -g 'use_module(library(process)), pr pid=[..] use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1)),process_id(P,Pid2),write(pid=Pid2),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) -thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +thread 'main'[..] panicked at src/machine/loader.rs:[..]:[..]: called `Result::unwrap()` on an `Err` value: () note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace @@ -37,7 +37,7 @@ pid=[..] pid=[..] use_module(library(process)),process_create("false",[],[process(P)]),process_id(P,Pid),write(pid=Pid),nl,process_wait(P,exit(1),[release(false)]),process_id(P,Pid2),write(pid=Pid2),nl,process_release(P),process_id(P,Pid3),write(pid=Pid3),nl causes: error(existence_error(process,$dropped_value),[predicate-process_id/2|process_id/2]) -thread 'main' ([..]) panicked at src/machine/loader.rs:[..]:[..]: +thread 'main'[..] panicked at src/machine/loader.rs:[..]:[..]: called `Result::unwrap()` on an `Err` value: () note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace