mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* thread.c: rename functions which require a parameter
"rb_thread_t *", the prefix to be rb_threadptr_ instead of rb_thread_. * thread.c (rb_thread_add_event_hook(), rb_thread_remove_event_hook): change the parameter type from rb_thread_t * to VALUE. * eval.c, eval_error.c, eval_intern.h, signal.c, vm_core.h, vm_eval.c: ditto. * include/ruby/intern.h: remove decl of rb_thread_signal_raise() and rb_thread_signal_exit(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
33a8def1e1
commit
79b62da9b4
9 changed files with 86 additions and 52 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
|||
Tue Jun 9 01:07:33 2009 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* thread.c: rename functions which require a parameter
|
||||
"rb_thread_t *", the prefix to be rb_threadptr_ instead of
|
||||
rb_thread_.
|
||||
|
||||
* thread.c (rb_thread_add_event_hook(), rb_thread_remove_event_hook):
|
||||
change the parameter type from rb_thread_t * to VALUE.
|
||||
|
||||
* eval.c, eval_error.c, eval_intern.h, signal.c, vm_core.h, vm_eval.c:
|
||||
ditto.
|
||||
|
||||
* include/ruby/intern.h: remove decl of rb_thread_signal_raise() and
|
||||
rb_thread_signal_exit().
|
||||
|
||||
Mon Jun 8 05:07:41 2009 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* thread_pthread.c (rb_thread_create_timer_thread): print fatal error
|
||||
|
|
4
eval.c
4
eval.c
|
@ -341,7 +341,7 @@ rb_longjmp(int tag, volatile VALUE mesg)
|
|||
const char *file;
|
||||
volatile int line = 0;
|
||||
|
||||
if (rb_thread_set_raised(th)) {
|
||||
if (rb_threadptr_set_raised(th)) {
|
||||
th->errinfo = exception_error;
|
||||
JUMP_TAG(TAG_FATAL);
|
||||
}
|
||||
|
@ -391,7 +391,7 @@ rb_longjmp(int tag, volatile VALUE mesg)
|
|||
th->errinfo = mesg;
|
||||
}
|
||||
else if (status) {
|
||||
rb_thread_reset_raised(th);
|
||||
rb_threadptr_reset_raised(th);
|
||||
JUMP_TAG(status);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -215,7 +215,7 @@ error_handle(int ex)
|
|||
int status = EXIT_FAILURE;
|
||||
rb_thread_t *th = GET_THREAD();
|
||||
|
||||
if (rb_thread_set_raised(th))
|
||||
if (rb_threadptr_set_raised(th))
|
||||
return EXIT_FAILURE;
|
||||
switch (ex & TAG_MASK) {
|
||||
case 0:
|
||||
|
@ -267,6 +267,6 @@ error_handle(int ex)
|
|||
rb_bug("Unknown longjmp status %d", ex);
|
||||
break;
|
||||
}
|
||||
rb_thread_reset_raised(th);
|
||||
rb_threadptr_reset_raised(th);
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -185,8 +185,8 @@ enum {
|
|||
RAISED_STACKOVERFLOW = 2,
|
||||
RAISED_NOMEMORY = 4
|
||||
};
|
||||
int rb_thread_set_raised(rb_thread_t *th);
|
||||
int rb_thread_reset_raised(rb_thread_t *th);
|
||||
int rb_threadptr_set_raised(rb_thread_t *th);
|
||||
int rb_threadptr_reset_raised(rb_thread_t *th);
|
||||
#define rb_thread_raised_set(th, f) ((th)->raised_flag |= (f))
|
||||
#define rb_thread_raised_reset(th, f) ((th)->raised_flag &= ~(f))
|
||||
#define rb_thread_raised_p(th, f) (((th)->raised_flag & (f)) != 0)
|
||||
|
|
|
@ -328,8 +328,6 @@ VALUE rb_thread_wakeup(VALUE);
|
|||
VALUE rb_thread_run(VALUE);
|
||||
VALUE rb_thread_kill(VALUE);
|
||||
VALUE rb_thread_create(VALUE (*)(ANYARGS), void*);
|
||||
void rb_thread_signal_raise(void *, int);
|
||||
void rb_thread_signal_exit(void *);
|
||||
int rb_thread_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
||||
int rb_thread_fd_select(int, rb_fdset_t *, rb_fdset_t *, rb_fdset_t *, struct timeval *);
|
||||
void rb_thread_wait_for(struct timeval);
|
||||
|
|
4
signal.c
4
signal.c
|
@ -664,12 +664,12 @@ rb_signal_exec(rb_thread_t *th, int sig)
|
|||
#ifdef SIGUSR2
|
||||
case SIGUSR2:
|
||||
#endif
|
||||
rb_thread_signal_raise(th, sig);
|
||||
rb_threadptr_signal_raise(th, sig);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (cmd == Qundef) {
|
||||
rb_thread_signal_exit(th);
|
||||
rb_threadptr_signal_exit(th);
|
||||
}
|
||||
else {
|
||||
signal_exec(cmd, safe, sig);
|
||||
|
|
95
thread.c
95
thread.c
|
@ -65,7 +65,7 @@ static void sleep_wait_for_interrupt(rb_thread_t *th, double sleepsec);
|
|||
static void sleep_forever(rb_thread_t *th, int nodeadlock);
|
||||
static double timeofday(void);
|
||||
struct timeval rb_time_interval(VALUE);
|
||||
static int rb_thread_dead(rb_thread_t *th);
|
||||
static int rb_threadptr_dead(rb_thread_t *th);
|
||||
|
||||
static void rb_check_deadlock(rb_vm_t *vm);
|
||||
|
||||
|
@ -249,7 +249,7 @@ reset_unblock_function(rb_thread_t *th, const struct rb_unblock_callback *old)
|
|||
}
|
||||
|
||||
static void
|
||||
rb_thread_interrupt(rb_thread_t *th)
|
||||
rb_threadptr_interrupt(rb_thread_t *th)
|
||||
{
|
||||
native_mutex_lock(&th->interrupt_lock);
|
||||
RUBY_VM_SET_INTERRUPT(th);
|
||||
|
@ -272,7 +272,7 @@ terminate_i(st_data_t key, st_data_t val, rb_thread_t *main_thread)
|
|||
|
||||
if (th != main_thread) {
|
||||
thread_debug("terminate_i: %p\n", (void *)th);
|
||||
rb_thread_interrupt(th);
|
||||
rb_threadptr_interrupt(th);
|
||||
th->thrown_errinfo = eTerminateSignal;
|
||||
th->status = THREAD_TO_KILL;
|
||||
}
|
||||
|
@ -350,7 +350,7 @@ thread_cleanup_func(void *th_ptr)
|
|||
}
|
||||
|
||||
extern void ruby_error_print(void);
|
||||
static VALUE rb_thread_raise(int, VALUE *, rb_thread_t *);
|
||||
static VALUE rb_threadptr_raise(rb_thread_t *, int, VALUE *);
|
||||
void rb_thread_recycle_stack_release(VALUE *);
|
||||
|
||||
void
|
||||
|
@ -429,7 +429,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s
|
|||
if (th != main_th) {
|
||||
if (TYPE(errinfo) == T_OBJECT) {
|
||||
/* treat with normal error object */
|
||||
rb_thread_raise(1, &errinfo, main_th);
|
||||
rb_threadptr_raise(main_th, 1, &errinfo);
|
||||
}
|
||||
}
|
||||
TH_POP_TAG();
|
||||
|
@ -449,7 +449,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s
|
|||
join_th = th->join_list_head;
|
||||
while (join_th) {
|
||||
if (join_th == main_th) errinfo = Qnil;
|
||||
rb_thread_interrupt(join_th);
|
||||
rb_threadptr_interrupt(join_th);
|
||||
switch (join_th->status) {
|
||||
case THREAD_STOPPED: case THREAD_STOPPED_FOREVER:
|
||||
join_th->status = THREAD_RUNNABLE;
|
||||
|
@ -1180,7 +1180,7 @@ thread_s_pass(VALUE klass)
|
|||
*/
|
||||
|
||||
void
|
||||
rb_thread_execute_interrupts(rb_thread_t *th)
|
||||
rb_threadptr_execute_interrupts(rb_thread_t *th)
|
||||
{
|
||||
if (GET_VM()->main_thread == th) {
|
||||
while (rb_signal_buff_size() && !th->exec_signal) native_thread_yield();
|
||||
|
@ -1254,18 +1254,18 @@ rb_gc_mark_threads(void)
|
|||
/*****************************************************/
|
||||
|
||||
static void
|
||||
rb_thread_ready(rb_thread_t *th)
|
||||
rb_threadptr_ready(rb_thread_t *th)
|
||||
{
|
||||
rb_thread_interrupt(th);
|
||||
rb_threadptr_interrupt(th);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
rb_thread_raise(int argc, VALUE *argv, rb_thread_t *th)
|
||||
rb_threadptr_raise(rb_thread_t *th, int argc, VALUE *argv)
|
||||
{
|
||||
VALUE exc;
|
||||
|
||||
again:
|
||||
if (rb_thread_dead(th)) {
|
||||
if (rb_threadptr_dead(th)) {
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
|
@ -1276,30 +1276,28 @@ rb_thread_raise(int argc, VALUE *argv, rb_thread_t *th)
|
|||
|
||||
exc = rb_make_exception(argc, argv);
|
||||
th->thrown_errinfo = exc;
|
||||
rb_thread_ready(th);
|
||||
rb_threadptr_ready(th);
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
void
|
||||
rb_thread_signal_raise(void *thptr, int sig)
|
||||
rb_threadptr_signal_raise(rb_thread_t *th, int sig)
|
||||
{
|
||||
VALUE argv[2];
|
||||
rb_thread_t *th = thptr;
|
||||
|
||||
argv[0] = rb_eSignal;
|
||||
argv[1] = INT2FIX(sig);
|
||||
rb_thread_raise(2, argv, th->vm->main_thread);
|
||||
rb_threadptr_raise(th->vm->main_thread, 2, argv);
|
||||
}
|
||||
|
||||
void
|
||||
rb_thread_signal_exit(void *thptr)
|
||||
rb_threadptr_signal_exit(rb_thread_t *th)
|
||||
{
|
||||
VALUE argv[2];
|
||||
rb_thread_t *th = thptr;
|
||||
|
||||
argv[0] = rb_eSystemExit;
|
||||
argv[1] = rb_str_new2("exit");
|
||||
rb_thread_raise(2, argv, th->vm->main_thread);
|
||||
rb_threadptr_raise(th->vm->main_thread, 2, argv);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1311,7 +1309,7 @@ ruby_thread_stack_overflow(rb_thread_t *th)
|
|||
}
|
||||
|
||||
int
|
||||
rb_thread_set_raised(rb_thread_t *th)
|
||||
rb_threadptr_set_raised(rb_thread_t *th)
|
||||
{
|
||||
if (th->raised_flag & RAISED_EXCEPTION) {
|
||||
return 1;
|
||||
|
@ -1321,7 +1319,7 @@ rb_thread_set_raised(rb_thread_t *th)
|
|||
}
|
||||
|
||||
int
|
||||
rb_thread_reset_raised(rb_thread_t *th)
|
||||
rb_threadptr_reset_raised(rb_thread_t *th)
|
||||
{
|
||||
if (!(th->raised_flag & RAISED_EXCEPTION)) {
|
||||
return 0;
|
||||
|
@ -1360,7 +1358,7 @@ thread_raise_m(int argc, VALUE *argv, VALUE self)
|
|||
{
|
||||
rb_thread_t *th;
|
||||
GetThreadPtr(self, th);
|
||||
rb_thread_raise(argc, argv, th);
|
||||
rb_threadptr_raise(th, argc, argv);
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
|
@ -1396,7 +1394,7 @@ rb_thread_kill(VALUE thread)
|
|||
|
||||
thread_debug("rb_thread_kill: %p (%p)\n", (void *)th, (void *)th->thread_id);
|
||||
|
||||
rb_thread_interrupt(th);
|
||||
rb_threadptr_interrupt(th);
|
||||
th->thrown_errinfo = eKillSignal;
|
||||
th->status = THREAD_TO_KILL;
|
||||
|
||||
|
@ -1466,7 +1464,7 @@ rb_thread_wakeup(VALUE thread)
|
|||
if (th->status == THREAD_KILLED) {
|
||||
rb_raise(rb_eThreadError, "killed thread");
|
||||
}
|
||||
rb_thread_ready(th);
|
||||
rb_threadptr_ready(th);
|
||||
if (th->status != THREAD_TO_KILL) {
|
||||
th->status = THREAD_RUNNABLE;
|
||||
}
|
||||
|
@ -1748,7 +1746,7 @@ thread_status_name(enum rb_thread_status status)
|
|||
}
|
||||
|
||||
static int
|
||||
rb_thread_dead(rb_thread_t *th)
|
||||
rb_threadptr_dead(rb_thread_t *th)
|
||||
{
|
||||
return th->status == THREAD_KILLED;
|
||||
}
|
||||
|
@ -1782,7 +1780,7 @@ rb_thread_status(VALUE thread)
|
|||
rb_thread_t *th;
|
||||
GetThreadPtr(thread, th);
|
||||
|
||||
if (rb_thread_dead(th)) {
|
||||
if (rb_threadptr_dead(th)) {
|
||||
if (!NIL_P(th->errinfo) && !FIXNUM_P(th->errinfo)
|
||||
/* TODO */ ) {
|
||||
return Qnil;
|
||||
|
@ -1811,7 +1809,7 @@ rb_thread_alive_p(VALUE thread)
|
|||
rb_thread_t *th;
|
||||
GetThreadPtr(thread, th);
|
||||
|
||||
if (rb_thread_dead(th))
|
||||
if (rb_threadptr_dead(th))
|
||||
return Qfalse;
|
||||
return Qtrue;
|
||||
}
|
||||
|
@ -1834,7 +1832,7 @@ rb_thread_stop_p(VALUE thread)
|
|||
rb_thread_t *th;
|
||||
GetThreadPtr(thread, th);
|
||||
|
||||
if (rb_thread_dead(th))
|
||||
if (rb_threadptr_dead(th))
|
||||
return Qtrue;
|
||||
if (th->status == THREAD_STOPPED || th->status == THREAD_STOPPED_FOREVER)
|
||||
return Qtrue;
|
||||
|
@ -2569,7 +2567,7 @@ timer_thread_function(void *arg)
|
|||
thread_status_name(prev_status), sig);
|
||||
mth->exec_signal = sig;
|
||||
if (mth->status != THREAD_KILLED) mth->status = THREAD_RUNNABLE;
|
||||
rb_thread_interrupt(mth);
|
||||
rb_threadptr_interrupt(mth);
|
||||
mth->status = prev_status;
|
||||
}
|
||||
|
||||
|
@ -3474,8 +3472,8 @@ thread_reset_event_flags(rb_thread_t *th)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
rb_thread_add_event_hook(rb_thread_t *th,
|
||||
static void
|
||||
rb_threadptr_add_event_hook(rb_thread_t *th,
|
||||
rb_event_hook_func_t func, rb_event_flag_t events, VALUE data)
|
||||
{
|
||||
rb_event_hook_t *hook = alloc_event_hook(func, events, data);
|
||||
|
@ -3484,6 +3482,21 @@ rb_thread_add_event_hook(rb_thread_t *th,
|
|||
thread_reset_event_flags(th);
|
||||
}
|
||||
|
||||
static rb_thread_t *
|
||||
thval2thread_t(VALUE thval)
|
||||
{
|
||||
rb_thread_t *th;
|
||||
GetThreadPtr(thval, th);
|
||||
return th;
|
||||
}
|
||||
|
||||
void
|
||||
rb_thread_add_event_hook(VALUE thval,
|
||||
rb_event_hook_func_t func, rb_event_flag_t events, VALUE data)
|
||||
{
|
||||
rb_threadptr_add_event_hook(thval2thread_t(thval), func, events, data);
|
||||
}
|
||||
|
||||
static int
|
||||
set_threads_event_flags_i(st_data_t key, st_data_t val, st_data_t flag)
|
||||
{
|
||||
|
@ -3542,14 +3555,20 @@ remove_event_hook(rb_event_hook_t **root, rb_event_hook_func_t func)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
rb_thread_remove_event_hook(rb_thread_t *th, rb_event_hook_func_t func)
|
||||
static int
|
||||
rb_threadptr_revmove_event_hook(rb_thread_t *th, rb_event_hook_func_t func)
|
||||
{
|
||||
int ret = remove_event_hook(&th->event_hooks, func);
|
||||
thread_reset_event_flags(th);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
rb_thread_remove_event_hook(VALUE thval, rb_event_hook_func_t func)
|
||||
{
|
||||
return rb_threadptr_revmove_event_hook(thval2thread_t(thval), func);
|
||||
}
|
||||
|
||||
int
|
||||
rb_remove_event_hook(rb_event_hook_func_t func)
|
||||
{
|
||||
|
@ -3569,7 +3588,7 @@ clear_trace_func_i(st_data_t key, st_data_t val, st_data_t flag)
|
|||
{
|
||||
rb_thread_t *th;
|
||||
GetThreadPtr((VALUE)key, th);
|
||||
rb_thread_remove_event_hook(th, 0);
|
||||
rb_threadptr_revmove_event_hook(th, 0);
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
|
||||
|
@ -3649,7 +3668,7 @@ thread_add_trace_func(rb_thread_t *th, VALUE trace)
|
|||
rb_raise(rb_eTypeError, "trace_func needs to be Proc");
|
||||
}
|
||||
|
||||
rb_thread_add_event_hook(th, call_trace_func, RUBY_EVENT_ALL, trace);
|
||||
rb_threadptr_add_event_hook(th, call_trace_func, RUBY_EVENT_ALL, trace);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -3666,7 +3685,7 @@ thread_set_trace_func_m(VALUE obj, VALUE trace)
|
|||
{
|
||||
rb_thread_t *th;
|
||||
GetThreadPtr(obj, th);
|
||||
rb_thread_remove_event_hook(th, call_trace_func);
|
||||
rb_threadptr_revmove_event_hook(th, call_trace_func);
|
||||
|
||||
if (NIL_P(trace)) {
|
||||
return Qnil;
|
||||
|
@ -3778,7 +3797,7 @@ ruby_suppress_tracing(VALUE (*func)(VALUE, int), VALUE arg, int always)
|
|||
th->tracing = 1;
|
||||
}
|
||||
|
||||
raised = rb_thread_reset_raised(th);
|
||||
raised = rb_threadptr_reset_raised(th);
|
||||
|
||||
PUSH_TAG();
|
||||
if ((state = EXEC_TAG()) == 0) {
|
||||
|
@ -3786,7 +3805,7 @@ ruby_suppress_tracing(VALUE (*func)(VALUE, int), VALUE arg, int always)
|
|||
}
|
||||
|
||||
if (raised) {
|
||||
rb_thread_set_raised(th);
|
||||
rb_threadptr_set_raised(th);
|
||||
}
|
||||
POP_TAG();
|
||||
|
||||
|
@ -3979,7 +3998,7 @@ rb_check_deadlock(rb_vm_t *vm)
|
|||
printf("%d %d %p %p\n", vm->living_threads->num_entries, vm->sleeper, GET_THREAD(), vm->main_thread);
|
||||
st_foreach(vm->living_threads, debug_i, (st_data_t)0);
|
||||
#endif
|
||||
rb_thread_raise(2, argv, vm->main_thread);
|
||||
rb_threadptr_raise(vm->main_thread, 2, argv);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#define RUBY_VERSION "1.9.2"
|
||||
#define RUBY_RELEASE_DATE "2009-06-08"
|
||||
#define RUBY_RELEASE_DATE "2009-06-09"
|
||||
#define RUBY_PATCHLEVEL -1
|
||||
#define RUBY_BRANCH_NAME "trunk"
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
|||
#define RUBY_VERSION_TEENY 1
|
||||
#define RUBY_RELEASE_YEAR 2009
|
||||
#define RUBY_RELEASE_MONTH 6
|
||||
#define RUBY_RELEASE_DAY 8
|
||||
#define RUBY_RELEASE_DAY 9
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
|
@ -625,11 +625,13 @@ extern rb_vm_t *ruby_current_vm;
|
|||
#define RUBY_VM_SET_FINALIZER_INTERRUPT(th) ((th)->interrupt_flag |= 0x04)
|
||||
#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & 0x02)
|
||||
|
||||
void rb_thread_execute_interrupts(rb_thread_t *);
|
||||
void rb_threadptr_signal_raise(rb_thread_t *th, int sig);
|
||||
void rb_threadptr_signal_exit(rb_thread_t *th);
|
||||
void rb_threadptr_execute_interrupts(rb_thread_t *);
|
||||
|
||||
#define RUBY_VM_CHECK_INTS_TH(th) do { \
|
||||
if (UNLIKELY(th->interrupt_flag)) { \
|
||||
rb_thread_execute_interrupts(th); \
|
||||
rb_threadptr_execute_interrupts(th); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
|
Loading…
Reference in a new issue