10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_MEMORY_GCLOCKER_INLINE_HPP 26 #define SHARE_VM_MEMORY_GCLOCKER_INLINE_HPP 27 28 #include "memory/gcLocker.hpp" 29 30 inline void GC_locker::lock() { 31 // cast away volatile 32 Atomic::inc(&_lock_count); 33 CHECK_UNHANDLED_OOPS_ONLY( 34 if (CheckUnhandledOops) { Thread::current()->_gc_locked_out_count++; }) 35 assert(Universe::heap() == NULL || 36 !Universe::heap()->is_gc_active(), "locking failed"); 37 } 38 39 inline void GC_locker::unlock() { 40 // cast away volatile 41 Atomic::dec(&_lock_count); 42 CHECK_UNHANDLED_OOPS_ONLY( 43 if (CheckUnhandledOops) { Thread::current()->_gc_locked_out_count--; }) 44 } 45 46 inline void GC_locker::lock_critical(JavaThread* thread) { 47 if (!thread->in_critical()) { 48 if (needs_gc()) { 49 // jni_lock call calls enter_critical under the lock so that the 50 // global lock count and per thread count are in agreement. 51 jni_lock(thread); 52 return; 53 } 54 increment_debug_jni_lock_count(); 55 } 56 thread->enter_critical(); 57 } 58 59 inline void GC_locker::unlock_critical(JavaThread* thread) { 60 if (thread->in_last_critical()) { 61 if (needs_gc()) { 62 // jni_unlock call calls exit_critical under the lock so that 63 // the global lock count and per thread count are in agreement. 64 jni_unlock(thread); 65 return; | 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_MEMORY_GCLOCKER_INLINE_HPP 26 #define SHARE_VM_MEMORY_GCLOCKER_INLINE_HPP 27 28 #include "memory/gcLocker.hpp" 29 30 inline void GC_locker::lock_critical(JavaThread* thread) { 31 if (!thread->in_critical()) { 32 if (needs_gc()) { 33 // jni_lock call calls enter_critical under the lock so that the 34 // global lock count and per thread count are in agreement. 35 jni_lock(thread); 36 return; 37 } 38 increment_debug_jni_lock_count(); 39 } 40 thread->enter_critical(); 41 } 42 43 inline void GC_locker::unlock_critical(JavaThread* thread) { 44 if (thread->in_last_critical()) { 45 if (needs_gc()) { 46 // jni_unlock call calls exit_critical under the lock so that 47 // the global lock count and per thread count are in agreement. 48 jni_unlock(thread); 49 return; |