summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--eval.c82
-rw-r--r--gc.c7
3 files changed, 76 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 4c68c79883..76926f9b59 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sat Dec 13 18:09:42 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * eval.c (thread_timer): use timer by sub-thread and nanosleep.
+ [ruby-talk:87519]
+
+ * gc.c (Init_stack): no stack adjustment for THREAD_SAFE.
+
Sat Dec 13 17:17:59 2003 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (proc_alloc): cache the created object at first time.
diff --git a/eval.c b/eval.c
index 03715c1851..1a591aea70 100644
--- a/eval.c
+++ b/eval.c
@@ -9486,7 +9486,63 @@ rb_thread_alloc(klass)
return th;
}
-#if defined(HAVE_SETITIMER)
+static int thread_init = 0;
+
+#if defined(HAVE_LIBPTHREAD) && defined(_REENTRANT)
+# define PTHREAD_TIMER
+#endif
+
+#if defined(POSIX_SIGNAL)
+# define ruby_signal(x,y) posix_signal((x), (y))
+#else
+# define ruby_signal(x,y) signal((x), (y))
+#endif
+
+#if defined(PTHREAD_TIMER)
+static pthread_t time_thread;
+
+static void
+catch_timer(sig)
+ int sig;
+{
+#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL)
+ signal(sig, catch_timer);
+#endif
+ rb_thread_schedule();
+}
+
+static void*
+thread_timer(dummy)
+ void *dummy;
+{
+ struct timespec req, rem;
+
+ for (;;) {
+ if (!rb_thread_critical) {
+ if (rb_trap_immediate) {
+ pthread_kill(ruby_thid, SIGVTALRM);
+ }
+ else {
+ rb_thread_pending = 1;
+ }
+ req.tv_sec = 0;
+ req.tv_nsec = 10000000;
+ nanosleep(&req, &rem);
+ }
+ }
+}
+
+void
+rb_thread_start_timer()
+{
+}
+
+void
+rb_thread_stop_timer()
+{
+}
+#elif defined(HAVE_SETITIMER)
+
static void
catch_timer(sig)
int sig;
@@ -9501,12 +9557,6 @@ catch_timer(sig)
else rb_thread_pending = 1;
}
}
-#else
-int rb_thread_tick = THREAD_TICK;
-#endif
-
-#if defined(HAVE_SETITIMER)
-static int thread_init = 0;
void
rb_thread_start_timer()
@@ -9531,6 +9581,8 @@ rb_thread_stop_timer()
tval.it_value = tval.it_interval;
setitimer(ITIMER_VIRTUAL, &tval, NULL);
}
+#else
+int rb_thread_tick = THREAD_TICK;
#endif
static VALUE
@@ -9550,18 +9602,18 @@ rb_thread_start_0(fn, arg, th)
"can't start a new thread (frozen ThreadGroup)");
}
-#if defined(HAVE_SETITIMER)
if (!thread_init) {
-#ifdef POSIX_SIGNAL
- posix_signal(SIGVTALRM, catch_timer);
-#else
- signal(SIGVTALRM, catch_timer);
-#endif
-
thread_init = 1;
+#if defined(HAVE_SETITIMER) || defined(PTHREAD_TIMER)
+ ruby_signal(SIGVTALRM, catch_timer);
+
+#ifdef PTHREAD_TIMER
+ pthread_create(&time_thread, 0, thread_timer, 0);
+#else
rb_thread_start_timer();
- }
#endif
+#endif
+ }
if (THREAD_SAVE_CONTEXT(curr_thread)) {
return thread;
diff --git a/gc.c b/gc.c
index 8aab6cc4f6..8d337cd57a 100644
--- a/gc.c
+++ b/gc.c
@@ -423,11 +423,11 @@ stack_growup_p(addr)
# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
#endif
-#define GC_WARTER_MARK 512
+#define GC_WATER_MARK 512
#define CHECK_STACK(ret) do {\
SET_STACK_END;\
- (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WARTER_MARK);\
+ (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
} while (0)
int
@@ -1393,9 +1393,6 @@ Init_stack(addr)
if (STACK_LEVEL_MAX > IA64_MAGIC_STACK_LIMIT)
STACK_LEVEL_MAX = IA64_MAGIC_STACK_LIMIT;
#endif
-#ifdef _THREAD_SAFE
- STACK_LEVEL_MAX /= 4;
-#endif
#endif
}