summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--configure.in88
-rw-r--r--eval.c58
-rw-r--r--gc.c5
-rw-r--r--ruby.h15
5 files changed, 93 insertions, 83 deletions
diff --git a/ChangeLog b/ChangeLog
index b6813db5e8..0e42d19407 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Thu Nov 20 12:42:47 2003 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
+
+ * configure.in: always check existence of the pthread library
+
+ * ruby.h: define macros for ruby's native thread check
+
+ * eval.c: add ruby's native thread check
+
+ * gc.c: ditto
+
Wed Nov 19 14:45:18 2003 Minero Aoki <aamine@loveruby.net>
* lib/net/http.rb (to_ary): print more friendly warning message.
diff --git a/configure.in b/configure.in
index c662e3fee4..07f34b76c5 100644
--- a/configure.in
+++ b/configure.in
@@ -662,52 +662,58 @@ int main()
], rb_cv_stack_grow_dir=-1, rb_cv_stack_grow_dir=+1, rb_cv_stack_grow_dir=0)])
AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $rb_cv_stack_grow_dir)
-dnl default value for $KANJI
-DEFAULT_KCODE="KCODE_NONE"
-
-AC_ARG_WITH(pthread-ext,
- [ --with-pthread-ext use pthread library on external modules ],
- [AC_DEFINE(USE_PTHREAD_EXTLIB)
- AC_CHECK_LIB(pthread, pthread_mutex_init,
- rb_use_pthread_ext=yes, rb_use_pthread_ext=no)
- if test "$rb_use_pthread_ext" = "no"; then
- AC_CHECK_LIB(pthread, __pthread_mutex_init,
- rb_use_pthread_ext=yes, rb_use_pthread_ext=no)
- fi
- if test "$rb_use_pthread_ext" = "yes"; then
- LIBS="-lpthread $LIBS"
- AC_DEFINE(_REENTRANT)
- AC_DEFINE(_THREAD_SAFE)
- AC_DEFINE(HAVE_LIBPTHREAD)
- else
- AC_CHECK_LIB(pthreads, pthread_mutex_init,
- rb_use_pthread_ext=yes, rb_use_pthread_ext=no)
- if test "$rb_use_pthread_ext" = "yes"; then
- LIBS="-lpthreads $LIBS"
+AC_CHECK_LIB(pthread, pthread_mutex_init,
+ rb_with_pthread=yes, rb_with_pthread=no)
+if test "$rb_with_pthread" = "no"; then
+ AC_CHECK_LIB(pthread, __pthread_mutex_init,
+ rb_with_pthread=yes, rb_with_pthread=no)
+fi
+if test "$rb_with_pthread" = "yes"; then
+ LIBS="-lpthread $LIBS"
+ AC_DEFINE(_REENTRANT)
+ AC_DEFINE(_THREAD_SAFE)
+ AC_DEFINE(HAVE_LIBPTHREAD)
+else
+ AC_CHECK_LIB(pthreads, pthread_mutex_init,
+ rb_with_pthread=yes, rb_with_pthread=no)
+ if test "$rb_with_pthread" = "yes"; then
+ LIBS="-lpthreads $LIBS"
+ AC_DEFINE(_REENTRANT)
+ AC_DEFINE(_THREAD_SAFE)
+ AC_DEFINE(HAVE_LIBPTHREAD)
+ else
+ AC_CHECK_LIB(c, pthread_mutex_init,
+ rb_with_pthread=yes, rb_with_pthread=no)
+ if test "$rb_with_pthread" = "yes"; then
+ AC_DEFINE(_REENTRANT)
+ AC_DEFINE(_THREAD_SAFE)
+ AC_DEFINE(HAVE_LIBPTHREAD)
+ else
+ AC_CHECK_LIB(c_r, pthread_mutex_init,
+ rb_with_pthread=yes, rb_with_pthread=no)
+ if test "$rb_with_pthread" = "yes"; then
+ if test "$with_libc_r" = "yes"; then
+ if test "$rb_cv_supplementary_lib_c_r" = "yes"; then
+ AC_DEFINE(_REENTRANT)
+ AC_DEFINE(_THREAD_SAFE)
+ AC_DEFINE(HAVE_LIBPTHREAD)
+ MAINLIBS="-pthread $MAINLIBS"
+ fi
+ else
+ MAINLIBS="-pthread $MAINLIBS"
AC_DEFINE(_REENTRANT)
AC_DEFINE(_THREAD_SAFE)
AC_DEFINE(HAVE_LIBPTHREAD)
- else
- AC_CHECK_LIB(c_r, pthread_mutex_init,
- rb_use_pthread_ext=yes, rb_use_pthread_ext=no)
- if test "$rb_use_pthread_ext" = "yes"; then
- if test "$with_libc_r" = "yes"; then
- if test "$rb_cv_supplementary_lib_c_r" = "yes"; then
- AC_DEFINE(_REENTRANT)
- AC_DEFINE(_THREAD_SAFE)
- AC_DEFINE(HAVE_LIBPTHREAD)
- MAINLIBS="-pthread $MAINLIBS"
- fi
- else
- MAINLIBS="-pthread $MAINLIBS"
- AC_DEFINE(_REENTRANT)
- AC_DEFINE(_THREAD_SAFE)
- AC_DEFINE(HAVE_LIBPTHREAD)
- fi
- fi
fi
+ else
+ AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled")
fi
- ])
+ fi
+ fi
+fi
+
+dnl default value for $KANJI
+DEFAULT_KCODE="KCODE_NONE"
AC_ARG_WITH(default-kcode,
[ --with-default-kcode=CODE specify default value for \$KCODE (utf8|euc|sjis|none)],
diff --git a/eval.c b/eval.c
index 31c1033e7e..ecb1725cc1 100644
--- a/eval.c
+++ b/eval.c
@@ -33,10 +33,6 @@
#include "st.h"
#include "dln.h"
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
-#include <pthread.h>
-#endif
-
#ifdef __APPLE__
#include <crt_externs.h>
#endif
@@ -1161,6 +1157,14 @@ void Init_stack _((void*));
void Init_heap _((void));
void Init_ext _((void));
+#ifdef HAVE_NATIVETHREAD
+static rb_nativethread_t ruby_thid;
+int
+is_ruby_native_thread() {
+ return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
+}
+#endif
+
void
ruby_init()
{
@@ -1172,6 +1176,9 @@ ruby_init()
if (initialized)
return;
initialized = 1;
+#ifdef HAVE_NATIVETHREAD
+ ruby_thid = NATIVETHREAD_CURRENT();
+#endif
ruby_frame = top_frame = &frame;
ruby_iter = &iter;
@@ -8647,11 +8654,6 @@ find_bad_fds(dst, src, max)
return test;
}
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
-static pthread_t thid;
-static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
void
rb_thread_schedule()
{
@@ -8668,10 +8670,12 @@ rb_thread_schedule()
int n, max;
int need_select = 0;
int select_timeout = 0;
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- int st;
-#endif
+#ifdef HAVE_NATIVETHREAD
+ if (!is_ruby_native_thread()) {
+ rb_bug("cross-thread violation on rb_thread_schedule()");
+ }
+#endif
rb_thread_pending = 0;
if (curr_thread == curr_thread->next
&& curr_thread->status == THREAD_RUNNABLE)
@@ -8680,16 +8684,6 @@ rb_thread_schedule()
next = 0;
curr = curr_thread; /* starting thread */
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- if ((st = pthread_mutex_trylock(&mtx)) == EBUSY) {
- if (pthread_self() != thid) {
- return;
- }
- } else {
- thid = pthread_self();
- }
-#endif
-
while (curr->status == THREAD_KILLED) {
curr = curr->prev;
}
@@ -8887,22 +8881,12 @@ rb_thread_schedule()
}
next->wait_for = 0;
if (next->status == THREAD_RUNNABLE && next == curr_thread) {
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- if (st != EBUSY) {
- pthread_mutex_unlock(& mtx);
- }
-#endif
return;
}
/* context switch */
if (curr == curr_thread) {
if (THREAD_SAVE_CONTEXT(curr)) {
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- if (st != EBUSY) {
- pthread_mutex_unlock(& mtx);
- }
-#endif
return;
}
}
@@ -8912,19 +8896,9 @@ rb_thread_schedule()
if (!(next->flags & THREAD_TERMINATING)) {
next->flags |= THREAD_TERMINATING;
/* terminate; execute ensure-clause if any */
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- if (st != EBUSY) {
- pthread_mutex_unlock(& mtx);
- }
-#endif
rb_thread_restore_context(next, RESTORE_FATAL);
}
}
-#if defined(HAVE_LIBPTHREAD) && defined(USE_PTHREAD_EXTLIB)
- if (st != EBUSY) {
- pthread_mutex_unlock(& mtx);
- }
-#endif
rb_thread_restore_context(next, RESTORE_NORMAL);
}
diff --git a/gc.c b/gc.c
index 4bbcf09a94..0fa9fd33b8 100644
--- a/gc.c
+++ b/gc.c
@@ -1216,6 +1216,11 @@ rb_gc()
jmp_buf save_regs_gc_mark;
SET_STACK_END;
+#ifdef HAVE_NATIVETHREAD
+ if (!is_ruby_native_thread()) {
+ rb_bug("cross-thread violation on rb_gc()");
+ }
+#endif
if (dont_gc || during_gc) {
if (!freelist) {
add_heap();
diff --git a/ruby.h b/ruby.h
index 0bd05b5c3d..7bac5db499 100644
--- a/ruby.h
+++ b/ruby.h
@@ -671,6 +671,21 @@ rb_special_const_p(obj)
static char *dln_libs_to_be_linked[] = { EXTLIB, 0 };
#endif
+#if defined(HAVE_LIBPTHREAD)
+typedef pthread_t rb_nativethread_t;
+# define NATIVETHREAD_CURRENT() pthread_self()
+# define NATIVETHREAD_EQUAL(t1,t2) pthread_equal((t1),(t2))
+# define HAVE_NATIVETHREAD
+#elif defined(_WIN32) || defined(_WIN32_WCE) || defined(__CYGWIN__)
+typedef DWORD rb_nativethread_t;
+# define NATIVETHREAD_CURRENT() GetCurrentThreadId()
+# define NATIVETHREAD_EQUAL(t1,t2) ((t1) == (t2))
+# define HAVE_NATIVETHREAD
+#endif
+#ifdef HAVE_NATIVETHREAD
+RUBY_EXTERN int is_ruby_native_thread();
+#endif
+
#if defined(__cplusplus)
} /* extern "C" { */
#endif