< prev index next >

src/os/solaris/vm/os_solaris.cpp

Print this page

        

*** 723,734 **** // use debugger to set breakpoint here } static thread_t main_thread; ! // Thread start routine for all new Java threads ! extern "C" void* java_start(void* thread_addr) { // Try to randomize the cache line index of hot stack frames. // This helps when threads of the same stack traces evict each other's // cache lines. The threads can be either from the same JVM instance, or // from different JVM instances. The benefit is especially true for // processors with hyperthreading technology. --- 723,734 ---- // use debugger to set breakpoint here } static thread_t main_thread; ! // Thread start routine for all newly created threads ! extern "C" void* thread_native_entry(void* thread_addr) { // Try to randomize the cache line index of hot stack frames. // This helps when threads of the same stack traces evict each other's // cache lines. The threads can be either from the same JVM instance, or // from different JVM instances. The benefit is especially true for // processors with hyperthreading technology.
*** 794,803 **** --- 794,812 ---- Atomic::dec(&os::Solaris::_os_thread_count); } log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ").", os::current_thread_id()); + // If a thread has not deleted itself ("delete this") as part of its + // termination sequence, we have to ensure thread-local-storage is + // cleared before we actually terminate. No threads should ever be + // deleted asynchronously with respect to their termination. + if (Thread::current_or_null_safe() != NULL) { + assert(Thread::current_or_null_safe() == thread, "current thread is wrong"); + thread->clear_thread_current(); + } + if (UseDetachedThreads) { thr_exit(NULL); ShouldNotReachHere(); } return NULL;
*** 1007,1017 **** // Mark that we don't have an lwp or thread id yet. // In case we attempt to set the priority before the thread starts. osthread->set_lwp_id(-1); osthread->set_thread_id(-1); ! status = thr_create(NULL, stack_size, java_start, thread, flags, &tid); char buf[64]; if (status == 0) { log_info(os, thread)("Thread started (tid: " UINTX_FORMAT ", attributes: %s). ", (uintx) tid, describe_thr_create_attributes(buf, sizeof(buf), stack_size, flags)); --- 1016,1026 ---- // Mark that we don't have an lwp or thread id yet. // In case we attempt to set the priority before the thread starts. osthread->set_lwp_id(-1); osthread->set_thread_id(-1); ! status = thr_create(NULL, stack_size, thread_native_entry, thread, flags, &tid); char buf[64]; if (status == 0) { log_info(os, thread)("Thread started (tid: " UINTX_FORMAT ", attributes: %s). ", (uintx) tid, describe_thr_create_attributes(buf, sizeof(buf), stack_size, flags));
*** 1219,1240 **** // Free Solaris resources related to the OSThread void os::free_thread(OSThread* osthread) { assert(osthread != NULL, "os::free_thread but osthread not set"); - // We are told to free resources of the argument thread, // but we can only really operate on the current thread. ! // The main thread must take the VMThread down synchronously ! // before the main thread exits and frees up CodeHeap ! guarantee((Thread::current()->osthread() == osthread ! || (osthread == VMThread::vm_thread()->osthread())), "os::free_thread but not current thread"); ! if (Thread::current()->osthread() == osthread) { // Restore caller's signal mask sigset_t sigmask = osthread->caller_sigmask(); pthread_sigmask(SIG_SETMASK, &sigmask, NULL); ! } delete osthread; } void os::pd_start_thread(Thread* thread) { int status = thr_continue(thread->osthread()->thread_id()); --- 1228,1246 ---- // Free Solaris resources related to the OSThread void os::free_thread(OSThread* osthread) { assert(osthread != NULL, "os::free_thread but osthread not set"); // We are told to free resources of the argument thread, // but we can only really operate on the current thread. ! assert(Thread::current()->osthread() == osthread, ! "os::free_thread but not current thread"); ! // Restore caller's signal mask sigset_t sigmask = osthread->caller_sigmask(); pthread_sigmask(SIG_SETMASK, &sigmask, NULL); ! delete osthread; } void os::pd_start_thread(Thread* thread) { int status = thr_continue(thread->osthread()->thread_id());
< prev index next >