From 65407be26ccebf28d628de35775921834dfd86f3 Mon Sep 17 00:00:00 2001 From: steven-jenkins Date: Mon, 11 Feb 2002 15:38:35 +0000 Subject: [PATCH] GC_PROTECT'ed the necessary variables (specifically, where >1 arg to a function 'may GC') --- scsh/syscalls1.c | 67 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/scsh/syscalls1.c b/scsh/syscalls1.c index 5e905b6..33c8638 100644 --- a/scsh/syscalls1.c +++ b/scsh/syscalls1.c @@ -61,17 +61,18 @@ s48_value wait_pid(s48_value s48_pid, s48_value s48_flags) pid_t pid = (pid_t) s48_extract_integer (s48_pid); int flags = s48_extract_integer (s48_flags); pid_t result_pid; + s48_value sch_retval = S48_UNSPECIFIC; + s48_value sch_result_pid = S48_UNSPECIFIC; s48_value sch_status = S48_UNSPECIFIC; s48_value sch_status_list = S48_UNSPECIFIC; - s48_value sch_retval = S48_UNSPECIFIC; - S48_DECLARE_GC_PROTECT(4); + S48_DECLARE_GC_PROTECT(3); - S48_GC_PROTECT_4(sch_result_pid, sch_status, sch_status_list, sch_retval); + S48_GC_PROTECT_3(sch_result_pid, sch_status, sch_status_list); result_pid = waitpid(pid, &status, flags); if (result_pid == -1) - if (errno == ECHILD) sch_result_pid = s48_enter_fixnum (0); + if (errno == ECHILD) sch_result_pid = s48_enter_fixnum(0); else s48_raise_os_error_2 (errno, s48_pid, s48_flags); else { sch_result_pid = s48_enter_integer (result_pid); @@ -79,7 +80,7 @@ s48_value wait_pid(s48_value s48_pid, s48_value s48_flags) } sch_status_list = s48_cons (sch_status, S48_NULL); sch_retval = s48_cons (sch_result_pid, sch_status_list); - + S48_GC_UNPROTECT(); return sch_retval; @@ -126,8 +127,8 @@ s48_value scheme_exec(s48_value prog, s48_value argv, s48_value env) } s48_stop_alarm_interrupts(); execve(s48_extract_string (prog), unix_argv, unix_env); /* Do it. */ + s48_start_alarm_interrupts(); e = errno; - s48_start_alarm_interrupts(); if( env != S48_TRUE ) { Free(unix_env); } @@ -164,12 +165,16 @@ s48_value scsh_fork() s48_value scheme_pipe() { int fds[2]; + s48_value sch_retval = S48_UNSPECIFIC; + if(pipe(fds) == -1) s48_raise_os_error(errno); - else - return s48_cons (s48_enter_fixnum (fds[0]), - s48_cons (s48_enter_fixnum (fds [1]), - S48_NULL)); + else { + sch_retval = s48_cons(s48_enter_fixnum(fds[0]), + s48_cons(s48_enter_fixnum (fds[1]), S48_NULL)); + } + + return sch_retval; } s48_value scsh_kill (s48_value sch_pid, s48_value sch_signal) @@ -317,14 +322,37 @@ s48_value scheme_cwd() s48_value process_times() { struct tms tms; + + s48_value sch_result_utime = S48_UNSPECIFIC; + s48_value sch_result_stime = S48_UNSPECIFIC; + s48_value sch_result_cutime = S48_UNSPECIFIC; + s48_value sch_result_cstime = S48_UNSPECIFIC; + s48_value sch_result_retval = S48_UNSPECIFIC; + + S48_DECLARE_GC_PROTECT(4); + clock_t t = times(&tms); if (t == -1) s48_raise_os_error(errno); - return - s48_cons(s48_enter_integer (tms.tms_utime), - s48_cons(s48_enter_integer (tms.tms_stime), - s48_cons(s48_enter_integer (tms.tms_cutime), - s48_cons(s48_enter_integer (tms.tms_cstime), - S48_NULL)))); + + S48_GC_PROTECT_4(sch_result_utime, + sch_result_stime, + sch_result_cutime, + sch_result_cstime); + + sch_result_utime = s48_enter_integer(tms.tms_utime); + sch_result_stime = s48_enter_integer(tms.tms_stime); + sch_result_cutime = s48_enter_integer(tms.tms_cutime); + sch_result_cstime = s48_enter_integer(tms.tms_cstime); + + + sch_result_retval = s48_cons(sch_result_utime, + s48_cons(sch_result_stime, + s48_cons(sch_result_cutime, + s48_cons(sch_result_cstime, S48_NULL)))); + + S48_GC_UNPROTECT(); + + return sch_result_retval; } s48_value cpu_clock_ticks_per_sec() @@ -671,12 +699,17 @@ s48_value get_groups() get_groups(); } else{ + S48_DECLARE_GC_PROTECT(1); + S48_GC_PROTECT_1(l); + while (i > 0){ l = s48_cons(s48_enter_integer(gp[--i]), l); } if (veclen > 20) Free(gp); - + + S48_GC_UNPROTECT(); + return l; } }