src/share/vm/memory/universe.inline.hpp

Print this page

        

@@ -24,10 +24,11 @@
 
 #ifndef SHARE_VM_MEMORY_UNIVERSE_INLINE_HPP
 #define SHARE_VM_MEMORY_UNIVERSE_INLINE_HPP
 
 #include "memory/universe.hpp"
+#include "runtime/atomic.hpp"
 
 // Check whether an element of a typeArrayOop with the given type must be
 // aligned 0 mod 8.  The typeArrayOop itself must be aligned at least this
 // strongly.
 

@@ -39,6 +40,49 @@
 
 inline bool Universe::field_type_should_be_aligned(BasicType type) {
   return type == T_DOUBLE || type == T_LONG;
 }
 
+
+// Helper methods to cache the first user class loader
+
+inline oop Universe::get_cached_loader() { 
+  return _primordial_loader_cache;
+}
+
+inline bool Universe::check_or_set_cached_loader(oop loader) {
+  // System loader is null or cache is already invalidated stop here
+  if (loader == NULL || (_primordial_loader_cache == (void*) -1)) {
+    return false;
+  }
+
+  // atomically set _primordial_loader_cache
+  void* old = Atomic::cmpxchg_ptr((void *)loader, (void*)&_primordial_loader_cache, (void *)NULL);
+  if (old != NULL) {
+    // loader must have already been set, is it the same loader on another thread?
+    if (loader == old) {
+      // Yes it's the same loader
+#ifdef ASSERT      
+      tty->print("FOUND SAME IN LDR CACHE was " INTPTR_FORMAT "\n", old);
+#endif
+      return false;
+    } else if (old != (void*) -1) {
+      // No, we must have more than 1 user class loader, so shut off the cache
+      Atomic::store_ptr((void*) -1, (void*)&_primordial_loader_cache);
+#ifdef ASSERT      
+      tty->print("CLEARED LDR CACHE was " INTPTR_FORMAT " curr " INTPTR_FORMAT"\n", old, loader);
+#endif
+      return false;
+    } else {
+      // Already cleared
+      return false;
+    }
+  }
+  
+  // We won to set the cache
+#ifdef ASSERT      
+  tty->print("SET LDR CACHE to " INTPTR_FORMAT"\n", loader);
+#endif
+  return true;
+}
+
 #endif // SHARE_VM_MEMORY_UNIVERSE_INLINE_HPP