[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]