Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

* thread_pthread.c (thread_timer): checks working flags again.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20160 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
commit 641f43de973d51a7d463b067833d4a71706d6c5c 1 parent b2390fb
@nobu nobu authored
Showing with 25 additions and 7 deletions.
  1. +4 −0 ChangeLog
  2. +2 −2 thread.c
  3. +9 −4 thread_pthread.c
  4. +10 −1 thread_win32.c
View
4 ChangeLog
@@ -1,3 +1,7 @@
+Sun Nov 9 00:30:52 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (thread_timer): checks working flags again.
+
Sun Nov 9 00:02:01 2008 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
* lib/cgi/session/pstore.rb: fix indentation.
View
4 thread.c
@@ -75,6 +75,7 @@ void rb_thread_stop_timer_thread(void);
static const VALUE eKillSignal = INT2FIX(0);
static const VALUE eTerminateSignal = INT2FIX(1);
+static volatile int system_working = 1;
inline static void
st_delete_wrap(st_table *table, st_data_t key)
@@ -2355,8 +2356,7 @@ timer_thread_function(void *arg)
void
rb_thread_stop_timer_thread(void)
{
- if (timer_thread_id) {
- native_stop_timer_thread();
+ if (timer_thread_id && native_stop_timer_thread()) {
native_thread_join(timer_thread_id);
timer_thread_id = 0;
}
View
13 thread_pthread.c
@@ -679,9 +679,9 @@ thread_timer(void *dummy)
int err;
native_mutex_lock(&timer_thread_lock);
- native_cond_signal(&timer_thread_cond);
+ native_cond_broadcast(&timer_thread_cond);
#define WAIT_FOR_10MS() native_cond_timedwait(&timer_thread_cond, &timer_thread_lock, get_ts(&ts, PER_NANO/100))
- while ((err = WAIT_FOR_10MS()) != 0 && err != EINTR) {
+ while (system_working > 0 && (err = WAIT_FOR_10MS()) != 0 && err != EINTR) {
if (err != ETIMEDOUT) {
rb_bug("thread_timer/timedwait: %d", err);
}
@@ -729,12 +729,17 @@ rb_thread_create_timer_thread(void)
rb_disable_interrupt(); /* only timer thread recieve signal */
}
-static void
+static int
native_stop_timer_thread(void)
{
+ int stopped;
native_mutex_lock(&timer_thread_lock);
- native_cond_signal(&timer_thread_cond);
+ stopped = --system_working <= 0;
+ if (stopped) {
+ native_cond_signal(&timer_thread_cond);
+ }
native_mutex_unlock(&timer_thread_lock);
+ return stopped;
}
#endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */
View
11 thread_win32.c
@@ -558,6 +558,15 @@ rb_thread_create_timer_thread(void)
}
}
-#define native_stop_timer_thread() (CloseHandle(timer_thread_lock), timer_thread_lock = 0)
+static int
+native_stop_timer_thread(void)
+{
+ int stopped = --system_working <= 0;
+ if (stopped) {
+ CloseHandle(timer_thread_lock);
+ timer_thread_lock = 0;
+ }
+ return stopped;
+}
#endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */
Please sign in to comment.
Something went wrong with that request. Please try again.