Bug #4027 » sigmask.patch
| eval_intern.h (working copy) | ||
|---|---|---|
| void rb_thread_terminate_all(void); | ||
| VALUE rb_vm_top_self(); | ||
| VALUE rb_vm_cbase(void); | ||
| void rb_trap_restore_mask(void); | ||
| #ifndef CharNext		/* defined as CharNext[AW] on Windows. */ | ||
| #define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) | ||
| vm_eval.c (working copy) | ||
|---|---|---|
| 	VALUE desc = rb_inspect(tag); | ||
| 	rb_raise(rb_eArgError, "uncaught throw %s", RSTRING_PTR(desc)); | ||
|     } | ||
|     rb_trap_restore_mask(); | ||
|     th->errinfo = NEW_THROW_OBJECT(tag, 0, TAG_THROW); | ||
|     JUMP_TAG(TAG_THROW); | ||
| eval.c (working copy) | ||
|---|---|---|
| 	JUMP_TAG(TAG_FATAL); | ||
|     } | ||
|     rb_trap_restore_mask(); | ||
|     if (tag != TAG_FATAL) { | ||
| 	EXEC_EVENT_HOOK(th, RUBY_EVENT_RAISE, th->cfp->self, 0, 0); | ||
|     } | ||
| signal.c (working copy) | ||
|---|---|---|
|     return signal_buff.size; | ||
| } | ||
| #if USE_TRAP_MASK | ||
| # ifdef HAVE_SIGPROCMASK | ||
| static sigset_t trap_last_mask; | ||
| # else | ||
| static int trap_last_mask; | ||
| # endif | ||
| #endif | ||
| #if HAVE_PTHREAD_H | ||
| #include <pthread.h> | ||
| #endif | ||
| ... | ... | |
|     vm->trap_list[sig].cmd = command; | ||
|     vm->trap_list[sig].safe = rb_safe_level(); | ||
|     /* enable at least specified signal. */ | ||
| #if USE_TRAP_MASK | ||
| #ifdef HAVE_SIGPROCMASK | ||
|     sigdelset(&arg->mask, sig); | ||
| #else | ||
|     arg->mask &= ~sigmask(sig); | ||
| #endif | ||
| #endif | ||
|     return oldcmd; | ||
| } | ||
| ... | ... | |
| { | ||
|     /* enable interrupt */ | ||
|     pthread_sigmask(SIG_SETMASK, &arg->mask, NULL); | ||
|     trap_last_mask = arg->mask; | ||
|     return 0; | ||
| } | ||
| #endif | ||
| void | ||
| rb_trap_restore_mask(void) | ||
| { | ||
| #if USE_TRAP_MASK | ||
|     pthread_sigmask(SIG_SETMASK, &trap_last_mask, NULL); | ||
| #endif | ||
| } | ||
| /* | ||
|  * call-seq: | ||
|  *   Signal.trap( signal, command ) -> obj | ||
| ... | ... | |
|     } else { | ||
| 	GET_VM()->trap_list[sig].cmd = 0; | ||
|     } | ||
| #if USE_TRAP_MASK | ||
|     sigdelset(&mask, sig); | ||
|     pthread_sigmask(SIG_SETMASK, &mask, NULL); | ||
|     trap_last_mask = mask; | ||
| #endif | ||
| } | ||
| #endif | ||
- « Previous
- 1
- 2
- Next »