changeset 2532:527977d4f740

7033779: CodeCache::largest_free_block may need to hold the CodeCache lock Reviewed-by: kvn
author never
date Tue, 05 Apr 2011 19:16:52 -0700
parents 8e77e1f26188
children 98c560260039
files src/share/vm/code/codeCache.cpp src/share/vm/code/codeCache.hpp
diffstat 2 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/code/codeCache.cpp	Tue Apr 05 02:31:46 2011 -0700
+++ b/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/src/share/vm/code/codeCache.hpp	Tue Apr 05 02:31:46 2011 -0700
+++ b/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; }