hotspot/src/share/vm/classfile/classLoaderData.cpp
changeset 42639 762117d57d05
parent 41727 f1658e76a682
child 43410 8c70a25642c4
child 46271 979ebd346ecf
equal deleted inserted replaced
42638:793e65ba88aa 42639:762117d57d05
    95   _modules(NULL), _packages(NULL),
    95   _modules(NULL), _packages(NULL),
    96   _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
    96   _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
    97   _next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1),
    97   _next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1),
    98   _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true,
    98   _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true,
    99                             Monitor::_safepoint_check_never)) {
    99                             Monitor::_safepoint_check_never)) {
   100     // empty
   100   TRACE_INIT_ID(this);
   101 }
   101 }
   102 
   102 
   103 void ClassLoaderData::init_dependencies(TRAPS) {
   103 void ClassLoaderData::init_dependencies(TRAPS) {
   104   assert(!Universe::is_fully_initialized(), "should only be called when initializing");
   104   assert(!Universe::is_fully_initialized(), "should only be called when initializing");
   105   assert(is_the_null_class_loader_data(), "should only call this for the null class loader");
   105   assert(is_the_null_class_loader_data(), "should only call this for the null class loader");
   165     assert(k != k->next_link(), "no loops!");
   165     assert(k != k->next_link(), "no loops!");
   166   }
   166   }
   167 }
   167 }
   168 
   168 
   169 void ClassLoaderData::classes_do(void f(Klass * const)) {
   169 void ClassLoaderData::classes_do(void f(Klass * const)) {
   170   assert_locked_or_safepoint(_metaspace_lock);
   170   // Lock-free access requires load_ptr_acquire
   171   for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
   171   for (Klass* k = load_ptr_acquire(&_klasses); k != NULL; k = k->next_link()) {
   172     f(k);
   172     f(k);
       
   173     assert(k != k->next_link(), "no loops!");
   173   }
   174   }
   174 }
   175 }
   175 
   176 
   176 void ClassLoaderData::methods_do(void f(Method*)) {
   177 void ClassLoaderData::methods_do(void f(Method*)) {
   177   // Lock-free access requires load_ptr_acquire
   178   // Lock-free access requires load_ptr_acquire
   810   for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) {
   811   for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) {
   811     cl->do_cld(cld);
   812     cl->do_cld(cld);
   812   }
   813   }
   813 }
   814 }
   814 
   815 
       
   816 void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
       
   817   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
       
   818   // Only walk the head until any clds not purged from prior unloading
       
   819   // (CMS doesn't purge right away).
       
   820   for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) {
       
   821     assert(cld->is_unloading(), "invariant");
       
   822     cl->do_cld(cld);
       
   823   }
       
   824 }
       
   825 
   815 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
   826 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
   816   for (ClassLoaderData* cld = _head;  cld != NULL; cld = cld->_next) {
   827   for (ClassLoaderData* cld = _head;  cld != NULL; cld = cld->_next) {
   817     CLDClosure* closure = cld->keep_alive() ? strong : weak;
   828     CLDClosure* closure = cld->keep_alive() ? strong : weak;
   818     if (closure != NULL) {
   829     if (closure != NULL) {
   819       closure->do_cld(cld);
   830       closure->do_cld(cld);
  1040     Metaspace::purge();
  1051     Metaspace::purge();
  1041     set_metaspace_oom(false);
  1052     set_metaspace_oom(false);
  1042   }
  1053   }
  1043 }
  1054 }
  1044 
  1055 
  1045 void ClassLoaderDataGraph::post_class_unload_events(void) {
  1056 void ClassLoaderDataGraph::post_class_unload_events() {
  1046 #if INCLUDE_TRACE
  1057 #if INCLUDE_TRACE
  1047   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
  1058   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
  1048   if (Tracing::enabled()) {
  1059   if (Tracing::enabled()) {
  1049     if (Tracing::is_event_enabled(TraceClassUnloadEvent)) {
  1060     if (Tracing::is_event_enabled(TraceClassUnloadEvent)) {
  1050       assert(_unloading != NULL, "need class loader data unload list!");
  1061       assert(_unloading != NULL, "need class loader data unload list!");
  1189 
  1200 
  1190   // post class unload event
  1201   // post class unload event
  1191   EventClassUnload event(UNTIMED);
  1202   EventClassUnload event(UNTIMED);
  1192   event.set_endtime(_class_unload_time);
  1203   event.set_endtime(_class_unload_time);
  1193   event.set_unloadedClass(k);
  1204   event.set_unloadedClass(k);
  1194   oop defining_class_loader = k->class_loader();
  1205   event.set_definingClassLoader(k->class_loader_data());
  1195   event.set_definingClassLoader(defining_class_loader != NULL ?
       
  1196                                 defining_class_loader->klass() : (Klass*)NULL);
       
  1197   event.commit();
  1206   event.commit();
  1198 }
  1207 }
  1199 
  1208 
  1200 #endif // INCLUDE_TRACE
  1209 #endif // INCLUDE_TRACE