diff --git a/ChangeLog b/ChangeLog index 5d8819ca72..3753f49b35 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Mon Jun 13 01:54:20 2005 Yukihiro Matsumoto + + * signal.c (sigexit): call rb_thread_signal_exit() instead of + rb_exit(). [ruby-dev:26347] + + * eval.c (rb_thread_signal_exit): a new function to exit on main + thread. + + * eval.c (rb_thread_switch): exit status should be retrieved from + ruby_errinfo. + + * eval.c (rb_f_exit): ensure exit(0) should call + exit(EXIT_SUCCESS). + +Fri Jun 10 23:35:34 2005 Yukihiro Matsumoto + + * missing/mkdir.c: remove. [ruby-core:05177] + Fri Jun 10 22:54:26 2005 Nobuyoshi Nakada * missing.h: fd_set stuffs need sys/types.h. fixed: [ruby-core:05179] @@ -22,6 +40,15 @@ Thu Jun 9 19:55:41 2005 Tanaka Akira * gc.c (Init_stack): remove IA64_MAGIC_STACK_LIMIT. +Thu Jun 9 11:55:34 2005 Yukihiro Matsumoto + + * lib/delegate.rb (SimpleDelegator::__setobj__): need check for + recursive delegation. [ruby-core:04940] + +Wed Jun 8 18:47:10 2005 Yukihiro Matsumoto + + * misc/ruby-mode.el (ruby-expr-beg): fix looking point drift. + Wed Jun 8 11:11:34 2005 Yukihiro Matsumoto * bignum.c (get2comp): calculate proper 2's complement for diff --git a/configure.in b/configure.in index 4e0dc1490b..35fd46e7f8 100644 --- a/configure.in +++ b/configure.in @@ -423,7 +423,7 @@ AC_FUNC_ALLOCA AC_FUNC_MEMCMP AC_FUNC_FSEEKO AC_CHECK_FUNCS(ftello) -AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\ +AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\ strchr strstr strtoul crypt flock vsnprintf\ isnan finite isinf hypot acosh erf) AC_CHECK_FUNCS(fmod killpg wait4 waitpid syscall chroot fsync getcwd\ diff --git a/eval.c b/eval.c index da8094faeb..39530beee5 100644 --- a/eval.c +++ b/eval.c @@ -1353,6 +1353,14 @@ static int thread_reset_raised(); static VALUE exception_error; static VALUE sysstack_error; +static int +sysexit_status(err) + VALUE err; +{ + VALUE st = rb_iv_get(err, "status"); + return NUM2INT(st); +} + static int error_handle(ex) int ex; @@ -1399,8 +1407,7 @@ error_handle(ex) case TAG_RAISE: case TAG_FATAL: if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { - VALUE st = rb_iv_get(ruby_errinfo, "status"); - status = NUM2INT(st); + status = sysexit_status(ruby_errinfo); } else { error_print(); @@ -4334,6 +4341,9 @@ rb_f_exit(argc, argv) break; default: istatus = NUM2INT(status); +#if EXIT_SUCCESS != 0 + if (istatus == 0) istatus = EXIT_SUCCESS; +#endif break; } } @@ -10021,8 +10031,7 @@ rb_thread_switch(n) case RESTORE_EXIT: ruby_errinfo = th_raise_exception; ruby_current_node = th_raise_node; - error_print(); - terminate_process(EXIT_FAILURE, 0, 0); + terminate_process(sysexit_status(ruby_errinfo), 0, 0); break; case RESTORE_NORMAL: default: @@ -11970,6 +11979,28 @@ rb_thread_trap_eval(cmd, sig, safe) rb_thread_restore_context(curr_thread, RESTORE_TRAP); } +void +rb_thread_signal_exit() +{ + VALUE args[2]; + + rb_thread_critical = 0; + if (curr_thread == main_thread) { + rb_thread_ready(curr_thread); + rb_exit(EXIT_SUCCESS); + } + args[0] = INT2NUM(EXIT_SUCCESS); + args[1] = rb_str_new2("exit"); + rb_thread_ready(main_thread); + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + rb_thread_main_jump(rb_class_new_instance(2, args, rb_eSystemExit), + RESTORE_EXIT); +} + static VALUE rb_thread_raise(argc, argv, th) int argc; diff --git a/intern.h b/intern.h index 9779d4d835..9021d8f945 100644 --- a/intern.h +++ b/intern.h @@ -210,6 +210,7 @@ VALUE rb_thread_create _((VALUE (*)(ANYARGS), void*)); void rb_thread_interrupt _((void)); void rb_thread_trap_eval _((VALUE, int, int)); void rb_thread_signal_raise _((char*)); +void rb_thread_signal_exit _((void)); int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct timeval *)); void rb_thread_wait_for _((struct timeval)); VALUE rb_thread_current _((void)); diff --git a/lib/delegate.rb b/lib/delegate.rb index deffcaf0f5..2a30bc94b1 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -73,6 +73,7 @@ class SimpleDelegator -#include -/* - * Make a directory. - */ -int -mkdir (dpath, dmode) - char *dpath; - int dmode; -{ - int cpid, status; - struct stat statbuf; - - if (stat (dpath, &statbuf) == 0) - { - errno = EEXIST; /* Stat worked, so it already exists */ - return -1; - } - - /* If stat fails for a reason other than non-existence, return error */ - if (errno != ENOENT) - return -1; - - switch (cpid = fork ()) - { - - case -1: /* Error in fork() */ - return (-1); /* Errno is set already */ - - case 0: /* Child process */ - /* - * Cheap hack to set mode of new directory. Since this - * child process is going away anyway, we zap its umask. - * FIXME, this won't suffice to set SUID, SGID, etc. on this - * directory. Does anybody care? - */ - status = umask (0); /* Get current umask */ - status = umask (status | (0777 & ~dmode)); /* Set for mkdir */ - execl ("/bin/mkdir", "mkdir", dpath, (char *) 0); - _exit (-1); /* Can't exec /bin/mkdir */ - - default: /* Parent process */ - while (cpid != wait (&status)); /* Wait for kid to finish */ - } - - if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) - { - errno = EIO; /* We don't know why, but */ - return -1; /* /bin/mkdir failed */ - } - - return 0; -} - -int -rmdir (dpath) - char *dpath; -{ - int cpid, status; - struct stat statbuf; - - if (stat (dpath, &statbuf) != 0) - { - /* Stat just set errno. We don't have to */ - return -1; - } - - switch (cpid = fork ()) - { - - case -1: /* Error in fork() */ - return (-1); /* Errno is set already */ - - case 0: /* Child process */ - execl ("/bin/rmdir", "rmdir", dpath, (char *) 0); - _exit (-1); /* Can't exec /bin/mkdir */ - - default: /* Parent process */ - while (cpid != wait (&status)); /* Wait for kid to finish */ - } - - if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) - { - errno = EIO; /* We don't know why, but */ - return -1; /* /bin/rmdir failed */ - } - - return 0; -} diff --git a/signal.c b/signal.c index eebd0dd2ac..3003ceabf9 100644 --- a/signal.c +++ b/signal.c @@ -33,6 +33,7 @@ static struct signals { char *signm; int signo; } siglist [] = { + {"EXIT", 0}, #ifdef SIGHUP {"HUP", SIGHUP}, #endif @@ -508,7 +509,7 @@ static RETSIGTYPE sigexit(sig) int sig; { - rb_exit(0); + rb_thread_signal_exit(); } static VALUE