comparison src/share/vm/memory/gcLocker.cpp @ 12301:2c022e432e10

8024974: Incorrect use of GC_locker::is_active() Summary: SymbolTable and StringTable can make calls to GC_locker::is_active() outside a safepoint. This isn't safe because the GC_locker active state (lock count) is only updated at a safepoint and only remains valid as long as _needs_gc is true. However, outside a safepoint_needs_gc can change to false at any time, which makes it impossible to do a correct call to is_active() in that context. In this case these calls can just be removed since the input argument to basic_add() should never be on the heap and so there's no need to check the GC_locker state. This change also adjusts the assert() in is_active() to makes sure all calls to this function are always done under a safepoint. Reviewed-by: brutisso, dcubed Contributed-by: per.liden@oracle.com
author stefank
date Fri, 20 Sep 2013 10:53:28 +0200
parents 09d00c18e323
children de6a9e811145
comparison
equal deleted inserted replaced
12251:719e886d4f72 12301:2c022e432e10
120 // We're the last thread out. Cause a GC to occur. 120 // We're the last thread out. Cause a GC to occur.
121 // GC will also check is_active, so this check is not 121 // GC will also check is_active, so this check is not
122 // strictly needed. It's added here to make it clear that 122 // strictly needed. It's added here to make it clear that
123 // the GC will NOT be performed if any other caller 123 // the GC will NOT be performed if any other caller
124 // of GC_locker::lock() still needs GC locked. 124 // of GC_locker::lock() still needs GC locked.
125 if (!is_active()) { 125 if (!is_active_internal()) {
126 _doing_gc = true; 126 _doing_gc = true;
127 { 127 {
128 // Must give up the lock while at a safepoint 128 // Must give up the lock while at a safepoint
129 MutexUnlocker munlock(JNICritical_lock); 129 MutexUnlocker munlock(JNICritical_lock);
130 if (PrintJNIGCStalls && PrintGCDetails) { 130 if (PrintJNIGCStalls && PrintGCDetails) {