From 29d472ea59792fc6f13c4fabfbc88a3c7d716e50 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Mon, 18 Jan 2010 23:35:51 +0100 Subject: [PATCH] The output values of a process or thread are now collected in the process object and returned by PROCESS-JOIN. --- src/CHANGELOG | 3 +++ src/c/threads.d | 20 +++++++++++++++----- src/h/object.h | 1 + 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/CHANGELOG b/src/CHANGELOG index 1f96c9915..99a45d04e 100755 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -17,6 +17,9 @@ ECL 10.1.1: - PROCESS-JOIN would fail when called while a thread was being started. + - The output values of a process or thread are now collected in the process + object and returned by PROCESS-JOIN. + ;;; Local Variables: *** ;;; mode:text *** ;;; fill-column:79 *** diff --git a/src/c/threads.d b/src/c/threads.d index c606aa3c1..fa02dc15b 100644 --- a/src/c/threads.d +++ b/src/c/threads.d @@ -162,11 +162,20 @@ thread_entry_point(void *arg) * provides us with an elegant way to exit the thread: we just * do an unwind up to frs_top. */ - mp_get_lock(1, process->process.exit_lock); + mp_get_lock_wait(process->process.exit_lock); process->process.active = 1; CL_CATCH_ALL_BEGIN(env) { ecl_bds_bind(env, @'mp::*current-process*', process); - cl_apply(2, process->process.function, process->process.args); + env->values[0] = cl_apply(2, process->process.function, + process->process.args); + { + cl_object output = Cnil; + int i = env->nvalues; + while (i--) { + output = CONS(env->values[i], output); + } + process->process.exit_values = output; + } ecl_bds_unwind1(env); } CL_CATCH_ALL_END; @@ -192,6 +201,7 @@ alloc_process(cl_object name, cl_object initial_bindings) process->process.function = Cnil; process->process.args = Cnil; process->process.interrupt = Cnil; + process->process.exit_values = Cnil; process->process.env = NULL; if (initial_bindings != OBJNULL) { process->process.initial_bindings @@ -249,7 +259,7 @@ ecl_import_current_thread(cl_object name, cl_object bindings) THREAD_OP_UNLOCK(); ecl_init_env(env); env->bindings_hash = process->process.initial_bindings; - mp_get_lock(1, process->process.exit_lock); + mp_get_lock_wait(process->process.exit_lock); process->process.active = 1; ecl_enable_interrupts_env(env); return 1; @@ -440,7 +450,7 @@ mp_process_join(cl_object process) if (!Null(l)) { while (process->process.active != 1) cl_sleep(MAKE_FIXNUM(0)); - l = mp_get_lock(1, l); + l = mp_get_lock_wait(l); if (Null(l)) { FEerror("MP:PROCESS-JOIN: Error when " "joining process ~A", @@ -449,7 +459,7 @@ mp_process_join(cl_object process) mp_giveup_lock(l); } } - @(return Cnil) + return cl_values_list(process->process.exit_values); } cl_object diff --git a/src/h/object.h b/src/h/object.h index a82e97d71..3731a42da 100644 --- a/src/h/object.h +++ b/src/h/object.h @@ -845,6 +845,7 @@ struct ecl_process { cl_object parent; cl_object exit_lock; int trap_fpe_bits; + cl_object exit_values; }; struct ecl_lock {