--- old/src/share/vm/prims/whitebox.cpp 2015-03-25 14:48:04.958957143 +0100 +++ new/src/share/vm/prims/whitebox.cpp 2015-03-25 14:48:04.874957147 +0100 @@ -815,26 +815,59 @@ } JavaThread* WhiteBox::create_sweeper_thread(TRAPS) { - // create sweeper thread w/ custom entry -- one iteration instead of loop - CodeCacheSweeperThread* sweeper_thread = new CodeCacheSweeperThread(); - sweeper_thread->set_entry_point(&WhiteBox::sweeper_thread_entry); + Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, THREAD); + instanceKlassHandle klass(THREAD, k); + instanceHandle thread_oop = klass->allocate_instance_handle(THREAD); - // create j.l.Thread object and associate it w/ sweeper thread - { - // inherit deamon property from current thread - bool is_daemon = java_lang_Thread::is_daemon(JavaThread::current()->threadObj()); + Handle name = java_lang_String::create_from_str("WB Sweeper thread", THREAD); - HandleMark hm(THREAD); - Handle thread_group(THREAD, Universe::system_thread_group()); - const char* name = "WB Sweeper thread"; - sweeper_thread->allocate_threadObj(thread_group, name, is_daemon, THREAD); - } + // Initialize thread_oop to put it into the system threadGroup + Handle thread_group(THREAD, Universe::system_thread_group()); + JavaValue result(T_VOID); + JavaCalls::call_special(&result, + thread_oop, + klass, + vmSymbols::object_initializer_name(), + vmSymbols::threadgroup_string_void_signature(), + thread_group, + name, + THREAD); + + KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass()); + JavaCalls::call_special(&result, + thread_group, + group, + vmSymbols::add_method_name(), + vmSymbols::thread_void_signature(), + thread_oop, // ARG 1 + THREAD); { - MutexLocker mu(Threads_lock, THREAD); + MutexLocker mu(Threads_lock); + + // create sweeper thread w/ custom entry -- one iteration instead of loop + CodeCacheSweeperThread* sweeper_thread = new CodeCacheSweeperThread(); + sweeper_thread->set_entry_point(&WhiteBox::sweeper_thread_entry); + + // check that thread and osthread were created + if (sweeper_thread == NULL || sweeper_thread->osthread() == NULL) { + vm_exit_during_initialization("java.lang.OutOfMemoryError", + os::native_thread_creation_failed_msg()); + } + + java_lang_Thread::set_thread(thread_oop(), sweeper_thread); + // inherit daemon property from current thread + if (java_lang_Thread::is_daemon(JavaThread::current()->threadObj())) { + java_lang_Thread::set_daemon(thread_oop()); + } + + // Make sure that both the thread_oop is set and the thread is added to + // the threads list before a safepoint can happen. Otherwise, a GC may + // move the thread object without updating the oop. + sweeper_thread->set_threadObj(thread_oop()); Threads::add(sweeper_thread); + return sweeper_thread; } - return sweeper_thread; } WB_ENTRY(jobject, WB_ForceNMethodSweep(JNIEnv* env, jobject o))