1 /* |
1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
93 // Implementation of Safepoint begin/end |
93 // Implementation of Safepoint begin/end |
94 |
94 |
95 SafepointSynchronize::SynchronizeState volatile SafepointSynchronize::_state = SafepointSynchronize::_not_synchronized; |
95 SafepointSynchronize::SynchronizeState volatile SafepointSynchronize::_state = SafepointSynchronize::_not_synchronized; |
96 volatile int SafepointSynchronize::_waiting_to_block = 0; |
96 volatile int SafepointSynchronize::_waiting_to_block = 0; |
97 volatile int SafepointSynchronize::_safepoint_counter = 0; |
97 volatile int SafepointSynchronize::_safepoint_counter = 0; |
|
98 int SafepointSynchronize::_current_jni_active_count = 0; |
98 long SafepointSynchronize::_end_of_last_safepoint = 0; |
99 long SafepointSynchronize::_end_of_last_safepoint = 0; |
99 static volatile int PageArmed = 0 ; // safepoint polling page is RO|RW vs PROT_NONE |
100 static volatile int PageArmed = 0 ; // safepoint polling page is RO|RW vs PROT_NONE |
100 static volatile int TryingToBlock = 0 ; // proximate value -- for advisory use only |
101 static volatile int TryingToBlock = 0 ; // proximate value -- for advisory use only |
101 static bool timeout_error_printed = false; |
102 static bool timeout_error_printed = false; |
102 |
103 |
135 |
136 |
136 RuntimeService::record_safepoint_begin(); |
137 RuntimeService::record_safepoint_begin(); |
137 |
138 |
138 { |
139 { |
139 MutexLocker mu(Safepoint_lock); |
140 MutexLocker mu(Safepoint_lock); |
|
141 |
|
142 // Reset the count of active JNI critical threads |
|
143 _current_jni_active_count = 0; |
140 |
144 |
141 // Set number of threads to wait for, before we initiate the callbacks |
145 // Set number of threads to wait for, before we initiate the callbacks |
142 _waiting_to_block = nof_threads; |
146 _waiting_to_block = nof_threads; |
143 TryingToBlock = 0 ; |
147 TryingToBlock = 0 ; |
144 int still_running = nof_threads; |
148 int still_running = nof_threads; |
373 // Record state |
377 // Record state |
374 _state = _synchronized; |
378 _state = _synchronized; |
375 |
379 |
376 OrderAccess::fence(); |
380 OrderAccess::fence(); |
377 |
381 |
|
382 // Update the count of active JNI critical regions |
|
383 GC_locker::set_jni_lock_count(_current_jni_active_count); |
|
384 |
378 if (TraceSafepoint) { |
385 if (TraceSafepoint) { |
379 VM_Operation *op = VMThread::vm_operation(); |
386 VM_Operation *op = VMThread::vm_operation(); |
380 tty->print_cr("Entering safepoint region: %s", (op != NULL) ? op->name() : "no vm operation"); |
387 tty->print_cr("Entering safepoint region: %s", (op != NULL) ? op->name() : "no vm operation"); |
381 } |
388 } |
382 |
389 |
582 if (is_synchronizing()) { |
589 if (is_synchronizing()) { |
583 // Decrement the number of threads to wait for and signal vm thread |
590 // Decrement the number of threads to wait for and signal vm thread |
584 assert(_waiting_to_block > 0, "sanity check"); |
591 assert(_waiting_to_block > 0, "sanity check"); |
585 _waiting_to_block--; |
592 _waiting_to_block--; |
586 thread->safepoint_state()->set_has_called_back(true); |
593 thread->safepoint_state()->set_has_called_back(true); |
|
594 |
|
595 if (thread->in_critical()) { |
|
596 // Notice that this thread is in a critical section |
|
597 increment_jni_active_count(); |
|
598 } |
587 |
599 |
588 // Consider (_waiting_to_block < 2) to pipeline the wakeup of the VM thread |
600 // Consider (_waiting_to_block < 2) to pipeline the wakeup of the VM thread |
589 if (_waiting_to_block == 0) { |
601 if (_waiting_to_block == 0) { |
590 Safepoint_lock->notify_all(); |
602 Safepoint_lock->notify_all(); |
591 } |
603 } |
859 |
871 |
860 // Some JavaThread states have an initial safepoint state of |
872 // Some JavaThread states have an initial safepoint state of |
861 // running, but are actually at a safepoint. We will happily |
873 // running, but are actually at a safepoint. We will happily |
862 // agree and update the safepoint state here. |
874 // agree and update the safepoint state here. |
863 if (SafepointSynchronize::safepoint_safe(_thread, state)) { |
875 if (SafepointSynchronize::safepoint_safe(_thread, state)) { |
864 roll_forward(_at_safepoint); |
876 roll_forward(_at_safepoint); |
865 return; |
877 if (_thread->in_critical()) { |
|
878 // Notice that this thread is in a critical section |
|
879 SafepointSynchronize::increment_jni_active_count(); |
|
880 } |
|
881 return; |
866 } |
882 } |
867 |
883 |
868 if (state == _thread_in_vm) { |
884 if (state == _thread_in_vm) { |
869 roll_forward(_call_back); |
885 roll_forward(_call_back); |
870 return; |
886 return; |