summaryrefslogtreecommitdiff
path: root/thread_pthread.ci
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-08 11:51:40 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-08 11:51:40 +0000
commitae317b518c4dcbcbf0ed02bb9e6cd7513f0a34fe (patch)
treebea8c1e7d17a5cef63673a71adcc3ca797675bfe /thread_pthread.ci
parent93b2cfbc4a5572f8f00cfda931fff543ab598c4a (diff)
* yarvcore.h, thread.c: fix to use pthread on cygwin.
* yarvcore.h, thread.c: move GVL_UNLOCK_BEGIN() and GVL_UNLOCK_END() from yarvcore.h to thread.c. * thread.c: change GVL_UNLOCK_RANGE() arguments (adding ubf as 2nd argument). * thread.c: fix to use polling in select on cygwin and mswin32. * thread.c, thread_pthread.ci, thread_win32.ci, yarvcore.h: rename: * rb_thread_t#interrupt_function -> unblock_function * rb_interrupt_function_t -> rb_unblock_function * some interrupt function name -> ubf_* * yarv_* -> * git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11662 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_pthread.ci')
-rw-r--r--thread_pthread.ci60
1 files changed, 33 insertions, 27 deletions
diff --git a/thread_pthread.ci b/thread_pthread.ci
index 2adde8a5b2..56abaa7d57 100644
--- a/thread_pthread.ci
+++ b/thread_pthread.ci
@@ -21,14 +21,15 @@
#define native_cleanup_pop pthread_cleanup_pop
#define native_thread_yield() sched_yield()
-static void yarv_add_signal_thread_list(rb_thread_t *th);
-static void yarv_remove_signal_thread_list(rb_thread_t *th);
+static void add_signal_thread_list(rb_thread_t *th);
+static void remove_signal_thread_list(rb_thread_t *th);
static rb_thread_lock_t signal_thread_list_lock;
static void
null_func()
{
+ /* null */
}
static void
@@ -238,22 +239,31 @@ native_thread_apply_priority(rb_thread_t *th)
}
static void
-interrupt_using_pthread_cond_signal(rb_thread_t *th)
+ubf_pthread_cond_signal(rb_thread_t *th)
{
- thread_debug("interrupt_using_pthread_cond_signal (%p)\n", th);
+ thread_debug("ubf_pthread_cond_signal (%p)\n", th);
pthread_cond_signal(&th->native_thread_data.sleep_cond);
}
+#ifndef __CYGWIN__
static void
-native_thread_send_interrupt_signal(rb_thread_t *th)
+ubf_select_each(rb_thread_t *th)
{
- thread_debug("native_thread_send_interrupt_signal (%p)\n", th->thread_id);
+ thread_debug("ubf_select_each (%p)\n", th->thread_id);
if (th) {
pthread_kill(th->thread_id, SIGVTALRM);
}
}
static void
+ubf_select(rb_thread_t *th)
+{
+ add_signal_thread_list(th);
+ ubf_select_each(th);
+}
+#endif
+
+static void
native_sleep(rb_thread_t *th, struct timeval *tv)
{
int prev_status = th->status;
@@ -283,7 +293,7 @@ native_sleep(rb_thread_t *th, struct timeval *tv)
thread_debug("native_sleep: interrupted before sleep\n");
}
else {
- th->interrupt_function = interrupt_using_pthread_cond_signal;
+ th->unblock_function = ubf_pthread_cond_signal;
if (tv == 0) {
thread_debug("native_sleep: pthread_cond_wait start\n");
pthread_cond_wait(&th->native_thread_data.sleep_cond,
@@ -298,7 +308,7 @@ native_sleep(rb_thread_t *th, struct timeval *tv)
&th->interrupt_lock, &ts);
thread_debug("native_sleep: pthread_cond_timedwait end (%d)\n", r);
}
- th->interrupt_function = 0;
+ th->unblock_function = 0;
}
pthread_mutex_unlock(&th->interrupt_lock);
@@ -308,19 +318,13 @@ native_sleep(rb_thread_t *th, struct timeval *tv)
thread_debug("native_sleep done\n");
}
-static void
-native_thread_interrupt(rb_thread_t *th)
-{
- yarv_add_signal_thread_list(th);
-}
-
-struct yarv_signal_thread_list {
+struct signal_thread_list {
rb_thread_t *th;
- struct yarv_signal_thread_list *prev;
- struct yarv_signal_thread_list *next;
+ struct signal_thread_list *prev;
+ struct signal_thread_list *next;
};
-static struct yarv_signal_thread_list signal_thread_list_anchor = {
+static struct signal_thread_list signal_thread_list_anchor = {
0, 0, 0,
};
@@ -336,7 +340,7 @@ static struct yarv_signal_thread_list signal_thread_list_anchor = {
static void
print_signal_list(char *str)
{
- struct yarv_signal_thread_list *list =
+ struct signal_thread_list *list =
signal_thread_list_anchor.next;
thread_debug("list (%s)> ", str);
while(list){
@@ -348,12 +352,12 @@ print_signal_list(char *str)
#endif
static void
-yarv_add_signal_thread_list(rb_thread_t *th)
+add_signal_thread_list(rb_thread_t *th)
{
if (!th->native_thread_data.signal_thread_list) {
FGLOCK(&signal_thread_list_lock, {
- struct yarv_signal_thread_list *list =
- malloc(sizeof(struct yarv_signal_thread_list));
+ struct signal_thread_list *list =
+ malloc(sizeof(struct signal_thread_list));
if (list == 0) {
fprintf(stderr, "[FATAL] failed to allocate memory\n");
@@ -374,12 +378,12 @@ yarv_add_signal_thread_list(rb_thread_t *th)
}
static void
-yarv_remove_signal_thread_list(rb_thread_t *th)
+remove_signal_thread_list(rb_thread_t *th)
{
if (th->native_thread_data.signal_thread_list) {
FGLOCK(&signal_thread_list_lock, {
- struct yarv_signal_thread_list *list =
- (struct yarv_signal_thread_list *)
+ struct signal_thread_list *list =
+ (struct signal_thread_list *)
th->native_thread_data.signal_thread_list;
list->prev->next = list->next;
@@ -414,16 +418,18 @@ thread_timer(void *dummy)
tv.tv_usec = 10000; /* 10 ms */
select(0, NULL, NULL, NULL, &tv);
#endif
+#ifndef __CYGWIN__
if (signal_thread_list_anchor.next) {
FGLOCK(&signal_thread_list_lock, {
- struct yarv_signal_thread_list *list;
+ struct signal_thread_list *list;
list = signal_thread_list_anchor.next;
while (list) {
- native_thread_send_interrupt_signal(list->th);
+ ubf_select_each(list->th);
list = list->next;
}
});
}
+#endif
timer_thread_function();
}
return NULL;