[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:289

From: ko1 atdot.net
Date: 20 Feb 2006 11:52:36 -0000
Subject: [yarv-diff:289] r453 - trunk

Author: ko1
Date: 2006-02-20 20:52:35 +0900 (Mon, 20 Feb 2006)
New Revision: 453

Modified:
   trunk/
   trunk/ChangeLog
   trunk/thread.c
Log:
 r692@lermite:  ko1 | 2006-02-20 20:44:01 +0900
 	* thread.c : fix to synchronize signal_thread_list access
 	and fix typo
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:690
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:692

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-20 09:18:40 UTC (rev 452)
+++ trunk/ChangeLog	2006-02-20 11:52:35 UTC (rev 453)
@@ -4,6 +4,12 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-20(Mon) 20:41:07 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* thread.c : fix to synchronize signal_thread_list access
+	and fix typo
+
+
 2006-02-20(Mon) 17:54:58 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval_proc.c : remove unused Binding functions and

Modified: trunk/thread.c
===================================================================
--- trunk/thread.c	2006-02-20 09:18:40 UTC (rev 452)
+++ trunk/thread.c	2006-02-20 11:52:35 UTC (rev 453)
@@ -478,13 +478,13 @@
 }
 
 void
-yarv_thraed_schedule()
+yarv_thread_schedule()
 {
-    thread_debug("yarv_thraed_schedule\n");
+    thread_debug("yarv_thread_schedule\n");
     if (!rb_thread_alone()) {
 	yarv_thread_t *th = GET_THREAD();
 
-	thread_debug("yarv_thraed_schedule/switch start\n");
+	thread_debug("yarv_thread_schedule/switch start\n");
 	yarv_save_machine_context(th);
 	native_mutex_unlock(&GET_VM()->global_interpreter_lock);
 	{
@@ -492,7 +492,7 @@
 	}
 	native_mutex_lock(&GET_VM()->global_interpreter_lock);
 	yarv_set_current_running_thread(th);
-	thread_debug("yarv_thraed_schedule/switch done (thid: %p)\n",
+	thread_debug("yarv_thread_schedule/switch done (thid: %p)\n",
 		     th->thread_id);
     }
 }
@@ -527,7 +527,7 @@
 static VALUE
 yarv_thread_s_pass(VALUE klass)
 {
-    yarv_thraed_schedule();
+    yarv_thread_schedule();
     return Qnil;
 }
 
@@ -573,7 +573,7 @@
 
 	th->status = status;
 	/* thread pass */
-	yarv_thraed_schedule();
+	yarv_thread_schedule();
     }
 }
 
@@ -1506,46 +1506,56 @@
     0, 0, 0, 0,
 };
 
+static yarv_thread_lock_t signal_thread_list_lock;
+
+#define FGLOCK(lock, body) do { \
+    native_mutex_lock(lock); \
+    { \
+	body; \
+    } \
+    native_mutex_unlock(lock); \
+} while (0)
+
 static void
 yarv_add_signal_thread_list(yarv_thread_t *th)
 {
-    // LOCK
     if (!th->signal_thread_list) {
-	struct yarv_signal_thread_list *list =
-	    xmalloc(sizeof(struct yarv_signal_thread_list));
-	list->th = th;
+	FGLOCK(&signal_thread_list_lock, {
+	    struct yarv_signal_thread_list *list =
+	      xmalloc(sizeof(struct yarv_signal_thread_list));
+	    list->th = th;
 
-	list->prev = &signal_thread_list_anchor;
-	list->next = signal_thread_list_anchor.next;
-	if (list->next) {
-	    list->next->prev = list;
-	}
-	signal_thread_list_anchor.next = list;
-	th->signal_thread_list = list;
+	    list->prev = &signal_thread_list_anchor;
+	    list->next = signal_thread_list_anchor.next;
+	    if (list->next) {
+		list->next->prev = list;
+	    }
+	    signal_thread_list_anchor.next = list;
+	    th->signal_thread_list = list;
+	});
     }
-    // UNLOCK
 }
 
 static void
 yarv_remove_signal_thread_list(yarv_thread_t *th)
 {
-    // LOCK
     if (th->signal_thread_list) {
-	struct yarv_signal_thread_list *list =
-	    (struct yarv_signal_thread_list *)th->signal_thread_list;
+	FGLOCK(&signal_thread_list_lock, {
+	    struct yarv_signal_thread_list *list =
+	      (struct yarv_signal_thread_list *)th->signal_thread_list;
 
-	list->prev->next = list->next;
-	if (list->next) {
-	    list->next->prev = list->prev;
-	}
-	th->signal_thread_list = 0;
-	list->th = 0;
-	xfree(list);
+	    list->prev->next = list->next;
+	    if (list->next) {
+		list->next->prev = list->prev;
+	    }
+	    th->signal_thread_list = 0;
+	    list->th = 0;
+	    xfree(list);
+	});
     }
     else {
 	/* */
     }
-    // UNLOCK
 }
 
 static void
@@ -1556,13 +1566,15 @@
     GET_VM()->running_thread->interrupt_flag = 1;
 
 #ifndef _WIN32
-    {
-	struct yarv_signal_thread_list *list;
-	list = signal_thread_list_anchor.next;
-	while (list) {
-	    native_thread_send_interrupt_signal(list->th);
-	    list = list->next;
-	}
+    if (signal_thread_list_anchor.next) {
+	FGLOCK(&signal_thread_list_lock, {
+	    struct yarv_signal_thread_list *list;
+	    list = signal_thread_list_anchor.next;
+	    while (list) {
+		native_thread_send_interrupt_signal(list->th);
+		list = list->next;
+	    }
+	});
     }
 #endif
 }
@@ -1974,4 +1986,7 @@
 	    native_mutex_lock(lp);
 	}
     }
+    
+    native_mutex_initialize(&signal_thread_list_lock);
 }
+


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]