comparison src/share/vm/runtime/thread.cpp @ 1681:126ea7725993

6953477: Increase portability and flexibility of building Hotspot Summary: A collection of portability improvements including shared code support for PPC, ARM platforms, software floating point, cross compilation support and improvements in error crash detail. Reviewed-by: phh, never, coleenp, dholmes
author bobv
date Tue, 03 Aug 2010 08:13:38 -0400
parents 2389669474a6
children f4f596978298 ab3fd720516c
comparison
equal deleted inserted replaced
1680:a64438a2b7e8 1681:126ea7725993
1018 // The watcher thread exists to simulate timer interrupts. It should 1018 // The watcher thread exists to simulate timer interrupts. It should
1019 // be replaced by an abstraction over whatever native support for 1019 // be replaced by an abstraction over whatever native support for
1020 // timer interrupts exists on the platform. 1020 // timer interrupts exists on the platform.
1021 1021
1022 WatcherThread* WatcherThread::_watcher_thread = NULL; 1022 WatcherThread* WatcherThread::_watcher_thread = NULL;
1023 bool WatcherThread::_should_terminate = false; 1023 volatile bool WatcherThread::_should_terminate = false;
1024 1024
1025 WatcherThread::WatcherThread() : Thread() { 1025 WatcherThread::WatcherThread() : Thread() {
1026 assert(watcher_thread() == NULL, "we can only allocate one WatcherThread"); 1026 assert(watcher_thread() == NULL, "we can only allocate one WatcherThread");
1027 if (os::create_thread(this, os::watcher_thread)) { 1027 if (os::create_thread(this, os::watcher_thread)) {
1028 _watcher_thread = this; 1028 _watcher_thread = this;
1050 assert(watcher_thread() == Thread::current(), "thread consistency check"); 1050 assert(watcher_thread() == Thread::current(), "thread consistency check");
1051 assert(watcher_thread() == this, "thread consistency check"); 1051 assert(watcher_thread() == this, "thread consistency check");
1052 1052
1053 // Calculate how long it'll be until the next PeriodicTask work 1053 // Calculate how long it'll be until the next PeriodicTask work
1054 // should be done, and sleep that amount of time. 1054 // should be done, and sleep that amount of time.
1055 const size_t time_to_wait = PeriodicTask::time_to_wait(); 1055 size_t time_to_wait = PeriodicTask::time_to_wait();
1056 os::sleep(this, time_to_wait, false); 1056
1057 // we expect this to timeout - we only ever get unparked when
1058 // we should terminate
1059 {
1060 OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */);
1061
1062 jlong prev_time = os::javaTimeNanos();
1063 for (;;) {
1064 int res= _SleepEvent->park(time_to_wait);
1065 if (res == OS_TIMEOUT || _should_terminate)
1066 break;
1067 // spurious wakeup of some kind
1068 jlong now = os::javaTimeNanos();
1069 time_to_wait -= (now - prev_time) / 1000000;
1070 if (time_to_wait <= 0)
1071 break;
1072 prev_time = now;
1073 }
1074 }
1057 1075
1058 if (is_error_reported()) { 1076 if (is_error_reported()) {
1059 // A fatal error has happened, the error handler(VMError::report_and_die) 1077 // A fatal error has happened, the error handler(VMError::report_and_die)
1060 // should abort JVM after creating an error log file. However in some 1078 // should abort JVM after creating an error log file. However in some
1061 // rare cases, the error handler itself might deadlock. Here we try to 1079 // rare cases, the error handler itself might deadlock. Here we try to
1113 1131
1114 void WatcherThread::stop() { 1132 void WatcherThread::stop() {
1115 // it is ok to take late safepoints here, if needed 1133 // it is ok to take late safepoints here, if needed
1116 MutexLocker mu(Terminator_lock); 1134 MutexLocker mu(Terminator_lock);
1117 _should_terminate = true; 1135 _should_terminate = true;
1136 OrderAccess::fence(); // ensure WatcherThread sees update in main loop
1137
1138 Thread* watcher = watcher_thread();
1139 if (watcher != NULL)
1140 watcher->_SleepEvent->unpark();
1141
1118 while(watcher_thread() != NULL) { 1142 while(watcher_thread() != NULL) {
1119 // This wait should make safepoint checks, wait without a timeout, 1143 // This wait should make safepoint checks, wait without a timeout,
1120 // and wait as a suspend-equivalent condition. 1144 // and wait as a suspend-equivalent condition.
1121 // 1145 //
1122 // Note: If the FlatProfiler is running, then this thread is waiting 1146 // Note: If the FlatProfiler is running, then this thread is waiting
1361 1385
1362 // Initialize thread local storage; set before calling MutexLocker 1386 // Initialize thread local storage; set before calling MutexLocker
1363 this->initialize_thread_local_storage(); 1387 this->initialize_thread_local_storage();
1364 1388
1365 this->create_stack_guard_pages(); 1389 this->create_stack_guard_pages();
1390
1391 this->cache_global_variables();
1366 1392
1367 // Thread is now sufficient initialized to be handled by the safepoint code as being 1393 // Thread is now sufficient initialized to be handled by the safepoint code as being
1368 // in the VM. Change thread state from _thread_new to _thread_in_vm 1394 // in the VM. Change thread state from _thread_new to _thread_in_vm
1369 ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm); 1395 ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm);
1370 1396
2953 delete main_thread; 2979 delete main_thread;
2954 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again 2980 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
2955 return status; 2981 return status;
2956 } 2982 }
2957 2983
2984 // Should be done after the heap is fully created
2985 main_thread->cache_global_variables();
2986
2958 HandleMark hm; 2987 HandleMark hm;
2959 2988
2960 { MutexLocker mu(Threads_lock); 2989 { MutexLocker mu(Threads_lock);
2961 Threads::add(main_thread); 2990 Threads::add(main_thread);
2962 } 2991 }
3227 // aren't, late joiners might appear to start slowly (we might 3256 // aren't, late joiners might appear to start slowly (we might
3228 // take a while to process their first tick). 3257 // take a while to process their first tick).
3229 if (PeriodicTask::num_tasks() > 0) { 3258 if (PeriodicTask::num_tasks() > 0) {
3230 WatcherThread::start(); 3259 WatcherThread::start();
3231 } 3260 }
3261
3262 // Give os specific code one last chance to start
3263 os::init_3();
3232 3264
3233 create_vm_timer.end(); 3265 create_vm_timer.end();
3234 return JNI_OK; 3266 return JNI_OK;
3235 } 3267 }
3236 3268