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