--- a/hotspot/src/os/aix/vm/os_aix.cpp Wed May 11 00:40:59 2016 +0000
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed May 11 01:02:28 2016 -0400
@@ -777,7 +777,7 @@
// create new thread
// Thread start routine for all newly created threads
-static void *java_start(Thread *thread) {
+static void *thread_native_entry(Thread *thread) {
// find out my own stack dimensions
{
@@ -838,6 +838,15 @@
log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
os::current_thread_id(), (uintx) kernel_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();
+ }
+
return 0;
}
@@ -902,7 +911,7 @@
pthread_attr_setstacksize(&attr, stack_size);
pthread_t tid;
- int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
+ int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
char buf[64];
@@ -993,11 +1002,14 @@
void os::free_thread(OSThread* osthread) {
assert(osthread != NULL, "osthread not set");
- if (Thread::current()->osthread() == osthread) {
- // Restore caller's signal mask
- sigset_t sigmask = osthread->caller_sigmask();
- pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
- }
+ // 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;
}