62 #include "utilities/growableArray.hpp" |
62 #include "utilities/growableArray.hpp" |
63 #include "utilities/ostream.hpp" |
63 #include "utilities/ostream.hpp" |
64 |
64 |
65 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; |
65 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; |
66 |
66 |
67 ClassLoaderData::ClassLoaderData(Handle h_class_loader) : _class_loader(h_class_loader()), |
67 ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous) : |
68 _metaspace(NULL), _unloading(false), _keep_alive(false), _klasses(NULL), |
68 _class_loader(h_class_loader()), |
|
69 _is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially |
|
70 _metaspace(NULL), _unloading(false), _klasses(NULL), |
69 _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), |
71 _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), |
70 _next(NULL), _dependencies(NULL), |
72 _next(NULL), _dependencies(NULL), |
71 _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) { |
73 _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) { |
72 // empty |
74 // empty |
73 } |
75 } |
394 } |
389 } |
395 |
390 |
396 // These anonymous class loaders are to contain classes used for JSR292 |
391 // These anonymous class loaders are to contain classes used for JSR292 |
397 ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) { |
392 ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) { |
398 // Add a new class loader data to the graph. |
393 // Add a new class loader data to the graph. |
399 ClassLoaderData* cld = ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL); |
394 return ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL); |
400 return cld; |
|
401 } |
395 } |
402 |
396 |
403 const char* ClassLoaderData::loader_name() { |
397 const char* ClassLoaderData::loader_name() { |
404 // Handles null class loader |
398 // Handles null class loader |
405 return SystemDictionary::loader_name(class_loader()); |
399 return SystemDictionary::loader_name(class_loader()); |
473 ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle loader, TRAPS) { |
467 ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle loader, TRAPS) { |
474 // Not assigned a class loader data yet. |
468 // Not assigned a class loader data yet. |
475 // Create one. |
469 // Create one. |
476 ClassLoaderData* *list_head = &_head; |
470 ClassLoaderData* *list_head = &_head; |
477 ClassLoaderData* next = _head; |
471 ClassLoaderData* next = _head; |
478 ClassLoaderData* cld = new ClassLoaderData(loader); |
472 |
|
473 bool is_anonymous = (cld_addr == NULL); |
|
474 ClassLoaderData* cld = new ClassLoaderData(loader, is_anonymous); |
479 |
475 |
480 if (cld_addr != NULL) { |
476 if (cld_addr != NULL) { |
481 // First, Atomically set it |
477 // First, Atomically set it |
482 ClassLoaderData* old = (ClassLoaderData*) Atomic::cmpxchg_ptr(cld, cld_addr, NULL); |
478 ClassLoaderData* old = (ClassLoaderData*) Atomic::cmpxchg_ptr(cld, cld_addr, NULL); |
483 if (old != NULL) { |
479 if (old != NULL) { |
484 delete cld; |
480 delete cld; |
485 // Returns the data. |
481 // Returns the data. |
486 return old; |
482 return old; |
487 } |
483 } |
488 } else { |
|
489 // Disallow unloading for this CLD during initialization if there is no |
|
490 // class_loader oop to link this to. |
|
491 cld->set_keep_alive(true); |
|
492 } |
484 } |
493 |
485 |
494 // We won the race, and therefore the task of adding the data to the list of |
486 // We won the race, and therefore the task of adding the data to the list of |
495 // class loader data |
487 // class loader data |
496 do { |
488 do { |