GC_PROTECT'ed the necessary variables (specifically, where >1 arg to

a function 'may GC')
This commit is contained in:
steven-jenkins 2002-02-11 15:38:35 +00:00
parent bf57bfb356
commit 65407be26c
1 changed files with 50 additions and 17 deletions

View File

@ -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); pid_t pid = (pid_t) s48_extract_integer (s48_pid);
int flags = s48_extract_integer (s48_flags); int flags = s48_extract_integer (s48_flags);
pid_t result_pid; pid_t result_pid;
s48_value sch_retval = S48_UNSPECIFIC;
s48_value sch_result_pid = S48_UNSPECIFIC; s48_value sch_result_pid = S48_UNSPECIFIC;
s48_value sch_status = S48_UNSPECIFIC; s48_value sch_status = S48_UNSPECIFIC;
s48_value sch_status_list = S48_UNSPECIFIC; s48_value sch_status_list = S48_UNSPECIFIC;
s48_value sch_retval = S48_UNSPECIFIC; S48_DECLARE_GC_PROTECT(3);
S48_DECLARE_GC_PROTECT(4);
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); result_pid = waitpid(pid, &status, flags);
if (result_pid == -1) 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 s48_raise_os_error_2 (errno, s48_pid, s48_flags);
else { else {
sch_result_pid = s48_enter_integer (result_pid); sch_result_pid = s48_enter_integer (result_pid);
@ -126,8 +127,8 @@ s48_value scheme_exec(s48_value prog, s48_value argv, s48_value env)
} }
s48_stop_alarm_interrupts(); s48_stop_alarm_interrupts();
execve(s48_extract_string (prog), unix_argv, unix_env); /* Do it. */ execve(s48_extract_string (prog), unix_argv, unix_env); /* Do it. */
e = errno;
s48_start_alarm_interrupts(); s48_start_alarm_interrupts();
e = errno;
if( env != S48_TRUE ) { if( env != S48_TRUE ) {
Free(unix_env); Free(unix_env);
} }
@ -164,12 +165,16 @@ s48_value scsh_fork()
s48_value scheme_pipe() s48_value scheme_pipe()
{ {
int fds[2]; int fds[2];
s48_value sch_retval = S48_UNSPECIFIC;
if(pipe(fds) == -1) if(pipe(fds) == -1)
s48_raise_os_error(errno); s48_raise_os_error(errno);
else else {
return s48_cons (s48_enter_fixnum (fds[0]), sch_retval = s48_cons(s48_enter_fixnum(fds[0]),
s48_cons (s48_enter_fixnum (fds [1]), s48_cons(s48_enter_fixnum (fds[1]), S48_NULL));
S48_NULL)); }
return sch_retval;
} }
s48_value scsh_kill (s48_value sch_pid, s48_value sch_signal) s48_value scsh_kill (s48_value sch_pid, s48_value sch_signal)
@ -317,14 +322,37 @@ s48_value scheme_cwd()
s48_value process_times() s48_value process_times()
{ {
struct tms tms; 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); clock_t t = times(&tms);
if (t == -1) s48_raise_os_error(errno); if (t == -1) s48_raise_os_error(errno);
return
s48_cons(s48_enter_integer (tms.tms_utime), S48_GC_PROTECT_4(sch_result_utime,
s48_cons(s48_enter_integer (tms.tms_stime), sch_result_stime,
s48_cons(s48_enter_integer (tms.tms_cutime), sch_result_cutime,
s48_cons(s48_enter_integer (tms.tms_cstime), sch_result_cstime);
S48_NULL))));
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() s48_value cpu_clock_ticks_per_sec()
@ -671,12 +699,17 @@ s48_value get_groups()
get_groups(); get_groups();
} }
else{ else{
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(l);
while (i > 0){ while (i > 0){
l = s48_cons(s48_enter_integer(gp[--i]), l); l = s48_cons(s48_enter_integer(gp[--i]), l);
} }
if (veclen > 20) Free(gp); if (veclen > 20) Free(gp);
S48_GC_UNPROTECT();
return l; return l;
} }
} }