X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fthreads%2Fposix%2Fthread-posix.cpp;h=820d7260ee470ec645ce03c82945bd3a3a9bae93;hb=49618ea5747b5d87c9360b7bd1e75d276b47fde0;hp=8e855c90bed103e4784f7f862137f0f72a42b5f5;hpb=a2e005342bc2739e615bcf836a4d67778502e901;p=cacao.git diff --git a/src/threads/posix/thread-posix.cpp b/src/threads/posix/thread-posix.cpp index 8e855c90b..820d7260e 100644 --- a/src/threads/posix/thread-posix.cpp +++ b/src/threads/posix/thread-posix.cpp @@ -1,6 +1,6 @@ /* src/threads/posix/thread-posix.cpp - POSIX thread functions - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -98,6 +98,8 @@ typedef struct { # define GC_IRIX_THREADS #elif defined(__DARWIN__) # define GC_DARWIN_THREADS +#elif defined(__SOLARIS__) +# define GC_SOLARIS_THREADS #endif #if defined(ENABLE_GC_BOEHM) @@ -531,47 +533,6 @@ void threads_impl_thread_reuse(threadobject *t) } -/* threads_impl_thread_free **************************************************** - - Cleanup thread stuff. - - IN: - t....the threadobject - -*******************************************************************************/ - -#if 0 -/* never used */ -void threads_impl_thread_free(threadobject *t) -{ - int result; - - /* Destroy the mutex and the condition. */ - - delete t->flc_lock; - - result = pthread_cond_destroy(&(t->flc_cond)); - - if (result != 0) - os::abort_errnum(result, "threads_impl_thread_free: pthread_cond_destroy failed"); - - delete t->waitmutex; - - result = pthread_cond_destroy(&(t->waitcond)); - - if (result != 0) - os::abort_errnum(result, "threads_impl_thread_free: pthread_cond_destroy failed"); - - delete t->suspendmutex; - - result = pthread_cond_destroy(&(t->suspendcond)); - - if (result != 0) - os::abort_errnum(result, "threads_impl_thread_free: pthread_cond_destroy failed"); -} -#endif - - /* threads_impl_preinit ******************************************************** Do some early initialization of stuff required. @@ -583,8 +544,6 @@ void threads_impl_thread_free(threadobject *t) void threads_impl_preinit(void) { - int result; - stopworldlock = new Mutex(); /* initialize exit mutex and condition (on exit we join all @@ -601,7 +560,7 @@ void threads_impl_preinit(void) #endif #if !defined(HAVE___THREAD) - result = pthread_key_create(&thread_current_key, NULL); + int result = pthread_key_create(&thread_current_key, NULL); if (result != 0) os::abort_errnum(result, "threads_impl_preinit: pthread_key_create failed"); #endif @@ -808,36 +767,14 @@ static void *threads_startup_thread(void *arg) /* find and run the Thread.run()V method if no other function was passed */ if (function == NULL) { -#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) - /* We need to start the run method of - java.lang.VMThread. Since this is a final class, we can use - the class object directly. */ - - c = class_java_lang_VMThread; -#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) || defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1) - LLNI_class_get(object, c); -#else -# error unknown classpath configuration -#endif + c = ThreadRuntime::get_thread_class_from_object(object); m = class_resolveclassmethod(c, utf_run, utf_void__void, c, true); if (m == NULL) vm_abort("threads_startup_thread: run() method not found in class"); -#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) - - // We need to start the run method of java.lang.VMThread. - java_lang_VMThread jlvmt(jlt.get_vmThread()); - java_handle_t* h = jlvmt.get_handle(); - -#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) || defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1) - - java_handle_t* h = jlt.get_handle(); - -#else -# error unknown classpath configuration -#endif + java_handle_t *h = ThreadRuntime::get_vmthread_handle(jlt); /* Run the thread. */ @@ -1000,15 +937,7 @@ bool thread_detach_current_thread(void) to build the java_lang_Thread_UncaughtExceptionHandler header file with cacaoh. */ -# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) - - java_handle_t* handler = jlt.get_exceptionHandler(); - -# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) - - java_handle_t* handler = jlt.get_uncaughtExceptionHandler(); - -# endif + java_handle_t *handler = ThreadRuntime::get_thread_exception_handler(jlt); classinfo* c; java_handle_t* h; @@ -1045,21 +974,7 @@ bool thread_detach_current_thread(void) classinfo* c; LLNI_class_get(group, c); -# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) - methodinfo* m = class_resolveclassmethod(c, - utf_removeThread, - utf_java_lang_Thread__V, - class_java_lang_ThreadGroup, - true); -# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) - methodinfo* m = class_resolveclassmethod(c, - utf_remove, - utf_java_lang_Thread__V, - class_java_lang_ThreadGroup, - true); -# else -# error unknown classpath configuration -# endif + methodinfo *m = ThreadRuntime::get_threadgroup_remove_method(c); if (m == NULL) return false; @@ -1090,6 +1005,10 @@ bool thread_detach_current_thread(void) /* XXX Care about exceptions? */ (void) lock_monitor_exit(jlt.get_handle()); + t->waitmutex->lock(); + t->tid = 0; + t->waitmutex->unlock(); + /* Enter the join-mutex before calling thread_free, so threads_join_all_threads gets the correct number of non-daemon threads. */ @@ -1105,6 +1024,9 @@ bool thread_detach_current_thread(void) cond_join->signal(); threads_mutex_join_unlock(); + t->suspendmutex->lock(); + t->suspendmutex->unlock(); + return true; } @@ -1189,6 +1111,8 @@ bool threads_suspend_thread(threadobject *thread, int32_t reason) } else { // Send the suspend signal to the other thread. + if (!thread->tid) + return false; if (pthread_kill(thread->tid, SIGUSR1) != 0) os::abort_errno("threads_suspend_thread: pthread_kill failed"); @@ -1486,7 +1410,8 @@ void threads_thread_interrupt(threadobject *t) /* Interrupt blocking system call using a signal. */ - pthread_kill(t->tid, Signal_INTERRUPT_SYSTEM_CALL); + if (t->tid) + pthread_kill(t->tid, Signal_INTERRUPT_SYSTEM_CALL); t->waitcond->signal();