aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--thread.c14
-rw-r--r--thread_pthread.c1
-rw-r--r--thread_win32.c9
4 files changed, 18 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 4b058a90fc..5f81f1156a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jun 13 23:55:40 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (rb_thread_schedule_rec): call gvl_yield() unconditionally.
+ * thread_pthread.c: remove HAVE_GVL_YIELD macro.
+ * thread_win32.c (gvl_yield): new. this fallback logic was moved from
+ rb_thread_schedule_rec().
+
Mon Jun 13 23:50:25 2011 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/io/console/console.c (console_dev): typo.
diff --git a/thread.c b/thread.c
index 2a6ba6d637..914b686f00 100644
--- a/thread.c
+++ b/thread.c
@@ -1025,18 +1025,8 @@ rb_thread_schedule_rec(int sched_depth, unsigned long limits_us)
RB_GC_SAVE_MACHINE_CONTEXT(th);
-#if HAVE_GVL_YIELD
- {
- if (th->running_time_us >= limits_us)
- gvl_yield(th->vm, th);
- }
-#else
- gvl_release(th->vm);
- {
- native_thread_yield();
- }
- gvl_acquire(th->vm, th);
-#endif
+ if (th->running_time_us >= limits_us)
+ gvl_yield(th->vm, th);
rb_thread_set_current(th);
thread_debug("rb_thread_schedule/switch done\n");
diff --git a/thread_pthread.c b/thread_pthread.c
index cd1e7bc48b..3954fc04c4 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -83,7 +83,6 @@ gvl_release(rb_vm_t *vm)
native_mutex_unlock(&vm->gvl.lock);
}
-#define HAVE_GVL_YIELD 1
static void
gvl_yield(rb_vm_t *vm, rb_thread_t *th)
{
diff --git a/thread_win32.c b/thread_win32.c
index da335e88ff..668d94b6c7 100644
--- a/thread_win32.c
+++ b/thread_win32.c
@@ -106,6 +106,15 @@ gvl_release(rb_vm_t *vm)
}
static void
+gvl_yield(rb_vm_t *vm, rb_thread_t *th)
+{
+ gvl_release(th->vm);
+ native_thread_yield();
+ gvl_acquire(vm, th);
+}
+
+
+static void
gvl_atfork(rb_vm_t *vm)
{
rb_bug("gvl_atfork() is called on win32");