* thread.c (rb_thread_check_trap_pending): added for compatibility.

* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: remove ruby/signal.h
  dependency.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2008-09-04 12:00:24 +00:00
parent 0031967d20
commit 80843ea156
4 changed files with 53 additions and 75 deletions

View File

@ -1,3 +1,10 @@
Thu Sep 4 20:57:54 2008 Koichi Sasada <ko1@atdot.net>
* thread.c (rb_thread_check_trap_pending): added for compatibility.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: remove ruby/signal.h
dependency.
Thu Sep 4 20:30:24 2008 Tanaka Akira <akr@fsij.org>
* transcode_data.h (PType): defined unconditionaly.

View File

@ -8,11 +8,6 @@
#include "ruby.h"
#ifdef HAVE_RUBY_SIGNAL_H
#include "ruby/signal.h"
#else
#include "rubysig.h"
#endif
#ifdef HAVE_RUBY_ENCODING_H
#include "ruby/encoding.h"
#endif
@ -54,6 +49,9 @@
#define TCL_FINAL_RELEASE 2
#endif
static VALUE rb_thread_critical; /* dummy */
int rb_thread_check_trap_pending();
static struct {
int major;
int minor;
@ -1623,6 +1621,28 @@ get_thread_alone_check_flag()
}
#endif
#define TRAP_CHECK() do { \
if (trap_check(check_var) == 0) return 0; \
} while (0)
static int
trap_check(int *check_var)
{
DUMP1("trap check");
if (rb_thread_check_trap_pending()) {
if (check_var != (int*)NULL) {
/* wait command */
return 0;
}
else {
rb_thread_check_ints();
}
}
return 1;
}
static int
lib_eventloop_core(check_root, update_flag, check_var, interp)
int check_root;
@ -1755,28 +1775,12 @@ lib_eventloop_core(check_root, update_flag, check_var, interp)
}
}
DUMP1("trap check");
if (rb_trap_pending) {
run_timer_flag = 0;
if (rb_prohibit_interrupt || check_var != (int*)NULL) {
/* pending or on wait command */
return 0;
} else {
rb_trap_exec();
}
}
TRAP_CHECK();
DUMP1("check Root Widget");
DUMP1("check Root Widget");
if (check_root && tk_stubs_init_p() && Tk_GetNumMainWindows() == 0) {
run_timer_flag = 0;
if (rb_trap_pending) {
if (rb_prohibit_interrupt || check_var != (int*)NULL) {
/* pending or on wait command */
return 0;
} else {
rb_trap_exec();
}
}
TRAP_CHECK();
return 1;
}
@ -1886,16 +1890,7 @@ lib_eventloop_core(check_root, update_flag, check_var, interp)
return 0;
}
DUMP1("trap check");
if (rb_trap_pending) {
run_timer_flag = 0;
if (rb_prohibit_interrupt || check_var != (int*)NULL) {
/* pending or on wait command */
return 0;
} else {
rb_trap_exec();
}
}
TRAP_CHECK();
if (check_var != (int*)NULL
&& !NIL_P(rbtk_pending_exception)) {
@ -1966,28 +1961,12 @@ lib_eventloop_core(check_root, update_flag, check_var, interp)
return 1;
}
DUMP1("trap check");
if (rb_trap_pending) {
run_timer_flag = 0;
if (rb_prohibit_interrupt || check_var != (int*)NULL) {
/* pending or on wait command */
return 0;
} else {
rb_trap_exec();
}
}
TRAP_CHECK();
DUMP1("check Root Widget");
if (check_root && tk_stubs_init_p() && Tk_GetNumMainWindows() == 0) {
run_timer_flag = 0;
if (rb_trap_pending) {
if (rb_prohibit_interrupt || check_var != (int*)NULL) {
/* pending or on wait command */
return 0;
} else {
rb_trap_exec();
}
}
TRAP_CHECK();
return 1;
}
@ -2823,7 +2802,6 @@ tcl_protect(interp, proc, data)
VALUE (*proc)();
VALUE data;
{
int old_trapflag = rb_trap_immediate;
int code;
#ifdef HAVE_NATIVETHREAD
@ -2834,10 +2812,7 @@ tcl_protect(interp, proc, data)
#endif
#endif
rb_trap_immediate = 0;
code = tcl_protect_core(interp, proc, data);
rb_trap_immediate = old_trapflag;
return code;
}
@ -3404,7 +3379,7 @@ ip_rbUpdateCommand(clientData, interp, objc, objv)
}
/* trap check */
if (rb_trap_pending) {
if (rb_thread_check_trap_pending()) {
Tcl_Release(interp);
return TCL_RETURN;
@ -3770,7 +3745,7 @@ ip_rbVwaitCommand(clientData, interp, objc, objv)
}
/* trap check */
if (rb_trap_pending) {
if (rb_thread_check_trap_pending()) {
#if TCL_MAJOR_VERSION >= 8
Tcl_DecrRefCount(objv[1]);
#endif
@ -4059,7 +4034,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
}
/* trap check */
if (rb_trap_pending) {
if (rb_thread_check_trap_pending()) {
Tcl_Release(interp);
return TCL_RETURN;
@ -4119,7 +4094,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
}
/* trap check */
if (rb_trap_pending) {
if (rb_thread_check_trap_pending()) {
#if TCL_MAJOR_VERSION >= 8
Tcl_DecrRefCount(objv[2]);
#endif
@ -4214,7 +4189,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
}
/* trap check */
if (rb_trap_pending) {
if (rb_thread_check_trap_pending()) {
Tcl_Release(interp);
return TCL_RETURN;

View File

@ -11,11 +11,6 @@
#include "ruby.h"
#ifdef HAVE_RUBY_SIGNAL_H
#include "ruby/signal.h"
#else
#include "rubysig.h"
#endif
#ifdef HAVE_RUBY_ST_H
#include "ruby/st.h"
#else
@ -895,15 +890,12 @@ tk_conv_args(argc, argv, self)
{
int idx, size;
volatile VALUE dst;
int thr_crit_bup;
VALUE old_gc;
if (argc < 2) {
rb_raise(rb_eArgError, "too few arguments");
}
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
old_gc = rb_gc_disable();
for(size = 0, idx = 2; idx < argc; idx++) {
@ -928,7 +920,6 @@ tk_conv_args(argc, argv, self)
}
if (old_gc == Qfalse) rb_gc_enable();
rb_thread_critical = thr_crit_bup;
return rb_ary_plus(argv[0], dst);
}
@ -1599,12 +1590,8 @@ cbsubst_scan_args(self, arg_key, val_ary)
unsigned char type_chr;
volatile VALUE dst = rb_ary_new2(vallen);
volatile VALUE proc;
int thr_crit_bup;
VALUE old_gc;
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
old_gc = rb_gc_disable();
Data_Get_Struct(rb_const_get(self, ID_SUBST_INFO),
@ -1632,7 +1619,6 @@ cbsubst_scan_args(self, arg_key, val_ary)
}
if (old_gc == Qfalse) rb_gc_enable();
rb_thread_critical = thr_crit_bup;
return dst;
}

View File

@ -890,6 +890,16 @@ rb_thread_check_ints(void)
RUBY_VM_CHECK_INTS();
}
/*
* Hidden API for tcl/tk wrapper.
* There is no guarantee to perpetuate it.
*/
int
rb_thread_check_trap_pending(void)
{
return GET_THREAD()->exec_signal != 0;
}
struct timeval rb_time_timeval();
void