ruby-changes:19853
From: nagai <ko1@a...>
Date: Thu, 2 Jun 2011 07:57:43 +0900 (JST)
Subject: [ruby-changes:19853] nagai:r31900 (trunk): * ext/tk/tcltklib.c: reduce CPU power required by an eventloop.
nagai 2011-06-02 07:57:35 +0900 (Thu, 02 Jun 2011) New Revision: 31900 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31900 Log: * ext/tk/tcltklib.c: reduce CPU power required by an eventloop. Modified files: trunk/ChangeLog trunk/ext/tk/tcltklib.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31899) +++ ChangeLog (revision 31900) @@ -1,3 +1,7 @@ +Thu Jun 2 07:56:24 2011 Hidetoshi NAGAI <nagai@a...> + + * ext/tk/tcltklib.c: reduce CPU power required by an eventloop. + Tue May 31 21:28:33 2011 Tanaka Akira <akr@f...> * test/ruby/test_signal.rb (TestSignal#test_signal_requiring): Index: ext/tk/tcltklib.c =================================================================== --- ext/tk/tcltklib.c (revision 31899) +++ ext/tk/tcltklib.c (revision 31900) @@ -505,7 +505,7 @@ #ifdef RUBY_USE_NATIVE_THREAD #define DEFAULT_EVENT_LOOP_MAX 800/*counts*/ #define DEFAULT_NO_EVENT_TICK 10/*counts*/ -#define DEFAULT_NO_EVENT_WAIT 1/*milliseconds ( 1 -- 999 ) */ +#define DEFAULT_NO_EVENT_WAIT 5/*milliseconds ( 1 -- 999 ) */ #define WATCHDOG_INTERVAL 10/*milliseconds ( 1 -- 999 ) */ #define DEFAULT_TIMER_TICK 0/*milliseconds ( 0 -- 999 ) */ #define NO_THREAD_INTERRUPT_TIME 100/*milliseconds ( 1 -- 999 ) */ @@ -1980,7 +1980,22 @@ #endif } +void +rbtk_EventSetupProc(ClientData clientData, int flag) +{ + Tcl_Time tcl_time; + tcl_time.sec = 0; + tcl_time.usec = 1000L * (long)no_event_tick; + Tcl_SetMaxBlockTime(&tcl_time); +} +void +rbtk_EventCheckProc(ClientData clientData, int flag) +{ + rb_thread_schedule(); +} + + #ifdef RUBY_USE_NATIVE_THREAD /* Ruby 1.9+ !!! */ static VALUE #ifdef HAVE_PROTOTYPES @@ -2178,7 +2193,7 @@ if (update_flag) DUMP1("update loop start!!"); t.tv_sec = 0; - t.tv_usec = (long)(no_event_wait*1000.0); + t.tv_usec = 1000 * (long)no_event_wait; Tcl_DeleteTimerHandler(timer_token); run_timer_flag = 0; @@ -2209,7 +2224,8 @@ event_loop_wait_event = 0; if (update_flag) { - event_flag = update_flag | TCL_DONT_WAIT; /* for safety */ + event_flag = update_flag; + /* event_flag = update_flag | TCL_DONT_WAIT; */ /* for safety */ } else { event_flag = TCL_ALL_EVENTS; /* event_flag = TCL_ALL_EVENTS | TCL_DONT_WAIT; */ @@ -2315,9 +2331,11 @@ found_event = 1; if (update_flag) { - event_flag = update_flag | TCL_DONT_WAIT; /* for safety */ + event_flag = update_flag; /* for safety */ + /* event_flag = update_flag | TCL_DONT_WAIT; */ /* for safety */ } else { - event_flag = TCL_ALL_EVENTS | TCL_DONT_WAIT; + event_flag = TCL_ALL_EVENTS; + /* event_flag = TCL_ALL_EVENTS | TCL_DONT_WAIT; */ } timer_tick = req_timer_tick; @@ -2337,6 +2355,7 @@ if (NIL_P(eventloop_thread) || current == eventloop_thread) { int st; int status; + #ifdef RUBY_USE_NATIVE_THREAD if (update_flag) { st = RTEST(rb_protect(call_DoOneEvent, @@ -2430,8 +2449,8 @@ tick_counter += no_event_tick; +#if 0 /* rb_thread_wait_for(t); */ - rb_protect(eventloop_sleep, Qnil, &status); if (status) { @@ -2465,6 +2484,7 @@ } } } +#endif } } else { @@ -2534,6 +2554,8 @@ check_rootwidget_flag = params->check_root; + Tcl_CreateEventSource(rbtk_EventSetupProc, rbtk_EventCheckProc, (ClientData)args); + if (lib_eventloop_core(params->check_root, params->update_flag, params->check_var, @@ -2586,6 +2608,8 @@ struct evloop_params *ptr = (struct evloop_params *)args; volatile VALUE current_evloop = rb_thread_current(); + Tcl_DeleteEventSource(rbtk_EventSetupProc, rbtk_EventCheckProc, (ClientData)args); + DUMP2("eventloop_ensure: current-thread : %lx", current_evloop); DUMP2("eventloop_ensure: eventloop-thread : %lx", eventloop_thread); if (eventloop_thread != current_evloop) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/