7033779: CodeCache::largest_free_block may need to hold the CodeCache lock
Reviewed-by: kvn
--- a/hotspot/src/share/vm/code/codeCache.cpp Tue Apr 05 02:31:46 2011 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp Tue Apr 05 19:16:52 2011 -0700
@@ -964,3 +964,14 @@
nof_blobs(), nof_nmethods(), nof_adapters(),
unallocated_capacity(), largest_free_block());
}
+
+size_t CodeCache::largest_free_block() {
+ // This is called both with and without CodeCache_lock held so
+ // handle both cases.
+ if (CodeCache_lock->owned_by_self()) {
+ return _heap->largest_free_block();
+ } else {
+ MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ return _heap->largest_free_block();
+ }
+}
--- a/hotspot/src/share/vm/code/codeCache.hpp Tue Apr 05 02:31:46 2011 -0700
+++ b/hotspot/src/share/vm/code/codeCache.hpp Tue Apr 05 19:16:52 2011 -0700
@@ -160,7 +160,7 @@
static size_t capacity() { return _heap->capacity(); }
static size_t max_capacity() { return _heap->max_capacity(); }
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
- static size_t largest_free_block() { return _heap->largest_free_block(); }
+ static size_t largest_free_block();
static bool needs_flushing() { return largest_free_block() < CodeCacheFlushingMinimumFreeSpace; }
static bool needs_cache_clean() { return _needs_cache_clean; }