aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2006-08-21 22:07:30 +0000
committerTom Tromey <tromey@gcc.gnu.org>2006-08-21 22:07:30 +0000
commit7ddf92a8742e02a5873daaafa0b660bf4a4c1a01 (patch)
tree4c9de9e1ba2a27a47f6d8da1bbd87446fe43e48f /libjava
parentaccabadcf398fb27c0e13154b7d2d1d52fc4fdef (diff)
downloadgcc-7ddf92a8742e02a5873daaafa0b660bf4a4c1a01.zip
gcc-7ddf92a8742e02a5873daaafa0b660bf4a4c1a01.tar.gz
gcc-7ddf92a8742e02a5873daaafa0b660bf4a4c1a01.tar.bz2
re PR libgcj/13212 (JNI/CNI AttachCurrentThread does not register thread with garbage collector)
boehm-gc PR libgcj/13212: * configure.ac: Check for pthread_getattr_np(). Remove GC_PTHREAD_SYM_VERSION detection. * include/gc.h (GC_register_my_thread, GC_unregister_my_thread, GC_get_thread_stack_base): New declarations. * pthread_support.c (GC_register_my_thread, GC_unregister_my_thread, GC_get_thread_stack_base): New functions. (GC_delete_thread): Don't try to free the first_thread. * misc.c (GC_init_inner): Use GC_get_thread_stack_base() if possible. (pthread_create_, constr): Removed. (pthread_create): Don't rename. * include/gc_ext_config.h.in: Rebuilt. * include/gc_pthread_redirects.h (pthread_create): Define unconditionally. * include/gc_config.h.in: Rebuilt. * configure: Rebuilt. libjava * java/lang/natThread.cc (_Jv_AttachCurrentThread): Attach thread to GC. (_Jv_DetachCurrentThread): Detach thread from GC. * include/boehm-gc.h (_Jv_GCAttachThread, _Jv_GCDetachThread): Declare. * boehm.cc (_Jv_GCAttachThread): New function. (_Jv_GCDetachThread): Likewise. From-SVN: r116313
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/boehm.cc18
-rw-r--r--libjava/include/boehm-gc.h4
-rw-r--r--libjava/java/lang/natThread.cc6
4 files changed, 37 insertions, 1 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 1e3680f..8c20e8c 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2006-08-21 Bryce McKinlay <mckinlay@redhat.com>
+
+ * java/lang/natThread.cc (_Jv_AttachCurrentThread): Attach thread
+ to GC.
+ (_Jv_DetachCurrentThread): Detach thread from GC.
+ * include/boehm-gc.h (_Jv_GCAttachThread, _Jv_GCDetachThread):
+ Declare.
+ * boehm.cc (_Jv_GCAttachThread): New function.
+ (_Jv_GCDetachThread): Likewise.
+
2006-08-19 Ranjit Mathew <rmathew@gcc.gnu.org>
* sysdep/i386/backtrace.h (fallback_backtrace): Add "0x55 0x8B 0xEC"
diff --git a/libjava/boehm.cc b/libjava/boehm.cc
index 6a5603d..f96128e 100644
--- a/libjava/boehm.cc
+++ b/libjava/boehm.cc
@@ -695,3 +695,21 @@ _Jv_ResumeThread (_Jv_Thread_t *thread)
GC_resume_thread (_Jv_GetPlatformThreadID (thread));
#endif
}
+
+void
+_Jv_GCAttachThread ()
+{
+ // The registration interface is only defined on posixy systems and
+ // only actually works if pthread_getattr_np is defined.
+#ifdef HAVE_PTHREAD_GETATTR_NP
+ GC_register_my_thread ();
+#endif
+}
+
+void
+_Jv_GCDetachThread ()
+{
+#ifdef HAVE_PTHREAD_GETATTR_NP
+ GC_unregister_my_thread ();
+#endif
+}
diff --git a/libjava/include/boehm-gc.h b/libjava/include/boehm-gc.h
index 764b2a1..7e61b8e 100644
--- a/libjava/include/boehm-gc.h
+++ b/libjava/include/boehm-gc.h
@@ -80,6 +80,10 @@ _Jv_AllocPtrFreeObj (jsize size, jclass klass);
#endif /* LIBGCJ_GC_DEBUG */
+void _Jv_GCAttachThread ();
+
+void _Jv_GCDetachThread ();
+
// _Jv_AllocBytes (jsize size) should go here, too. But clients don't
// usually include this header.
diff --git a/libjava/java/lang/natThread.cc b/libjava/java/lang/natThread.cc
index f778510..facce30 100644
--- a/libjava/java/lang/natThread.cc
+++ b/libjava/java/lang/natThread.cc
@@ -410,7 +410,8 @@ _Jv_SetCurrentJNIEnv (JNIEnv *env)
}
// Attach the current native thread to an existing (but unstarted) Thread
-// object. Returns -1 on failure, 0 upon success.
+// object. Does not register thread with the garbage collector.
+// Returns -1 on failure, 0 upon success.
jint
_Jv_AttachCurrentThread(java::lang::Thread* thread)
{
@@ -427,6 +428,8 @@ _Jv_AttachCurrentThread(java::lang::Thread* thread)
java::lang::Thread*
_Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group)
{
+ // Register thread with GC before attempting any allocations.
+ _Jv_GCAttachThread ();
java::lang::Thread *thread = _Jv_ThreadCurrent ();
if (thread != NULL)
return thread;
@@ -461,6 +464,7 @@ _Jv_DetachCurrentThread (void)
return -1;
_Jv_ThreadUnRegister ();
+ _Jv_GCDetachThread ();
// Release the monitors.
t->finish_ ();