Mercurial > hg > truffle
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) { |