< prev index next >

src/hotspot/share/oops/weakHandle.cpp

Print this page
rev 50534 : [mq]: rename_RootAccess


  31 #include "oops/weakHandle.inline.hpp"
  32 #include "utilities/debug.hpp"
  33 #include "utilities/ostream.hpp"
  34 
  35 template <> OopStorage* WeakHandle<vm_class_loader_data>::get_storage() {
  36   return SystemDictionary::vm_weak_oop_storage();
  37 }
  38 
  39 template <> OopStorage* WeakHandle<vm_string_table_data>::get_storage() {
  40   return StringTable::weak_storage();
  41 }
  42 
  43 template <WeakHandleType T>
  44 WeakHandle<T> WeakHandle<T>::create(Handle obj) {
  45   assert(obj() != NULL, "no need to create weak null oop");
  46   oop* oop_addr = get_storage()->allocate();
  47   if (oop_addr == NULL) {
  48     vm_exit_out_of_memory(sizeof(oop*), OOM_MALLOC_ERROR, "Unable to create new weak oop handle in OopStorage");
  49   }
  50   // Create WeakHandle with address returned and store oop into it.
  51   RootAccess<ON_PHANTOM_OOP_REF>::oop_store(oop_addr, obj());
  52   return WeakHandle(oop_addr);
  53 }
  54 
  55 template <WeakHandleType T>
  56 void WeakHandle<T>::release() const {
  57   // Only release if the pointer to the object has been created.
  58   if (_obj != NULL) {
  59     // Clear the WeakHandle.  For race in creating ClassLoaderData, we can release this
  60     // WeakHandle before it is cleared by GC.
  61     RootAccess<ON_PHANTOM_OOP_REF>::oop_store(_obj, (oop)NULL);
  62     get_storage()->release(_obj);
  63   }
  64 }
  65 
  66 template <WeakHandleType T>
  67 void WeakHandle<T>::print() const { print_on(tty); }
  68 
  69 template <WeakHandleType T>
  70 void WeakHandle<T>::print_on(outputStream* st) const {
  71   st->print("WeakHandle: " PTR_FORMAT, p2i(peek()));
  72 }
  73 
  74 // Provide instantiation.
  75 template class WeakHandle<vm_class_loader_data>;
  76 template class WeakHandle<vm_string_table_data>;
  77 


  31 #include "oops/weakHandle.inline.hpp"
  32 #include "utilities/debug.hpp"
  33 #include "utilities/ostream.hpp"
  34 
  35 template <> OopStorage* WeakHandle<vm_class_loader_data>::get_storage() {
  36   return SystemDictionary::vm_weak_oop_storage();
  37 }
  38 
  39 template <> OopStorage* WeakHandle<vm_string_table_data>::get_storage() {
  40   return StringTable::weak_storage();
  41 }
  42 
  43 template <WeakHandleType T>
  44 WeakHandle<T> WeakHandle<T>::create(Handle obj) {
  45   assert(obj() != NULL, "no need to create weak null oop");
  46   oop* oop_addr = get_storage()->allocate();
  47   if (oop_addr == NULL) {
  48     vm_exit_out_of_memory(sizeof(oop*), OOM_MALLOC_ERROR, "Unable to create new weak oop handle in OopStorage");
  49   }
  50   // Create WeakHandle with address returned and store oop into it.
  51   NativeAccess<ON_PHANTOM_OOP_REF>::oop_store(oop_addr, obj());
  52   return WeakHandle(oop_addr);
  53 }
  54 
  55 template <WeakHandleType T>
  56 void WeakHandle<T>::release() const {
  57   // Only release if the pointer to the object has been created.
  58   if (_obj != NULL) {
  59     // Clear the WeakHandle.  For race in creating ClassLoaderData, we can release this
  60     // WeakHandle before it is cleared by GC.
  61     NativeAccess<ON_PHANTOM_OOP_REF>::oop_store(_obj, (oop)NULL);
  62     get_storage()->release(_obj);
  63   }
  64 }
  65 
  66 template <WeakHandleType T>
  67 void WeakHandle<T>::print() const { print_on(tty); }
  68 
  69 template <WeakHandleType T>
  70 void WeakHandle<T>::print_on(outputStream* st) const {
  71   st->print("WeakHandle: " PTR_FORMAT, p2i(peek()));
  72 }
  73 
  74 // Provide instantiation.
  75 template class WeakHandle<vm_class_loader_data>;
  76 template class WeakHandle<vm_string_table_data>;
  77 
< prev index next >