diff options
Diffstat (limited to 'src/share/vm/classfile/classLoaderData.cpp')
-rw-r--r-- | src/share/vm/classfile/classLoaderData.cpp | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/src/share/vm/classfile/classLoaderData.cpp b/src/share/vm/classfile/classLoaderData.cpp index c4479bfcf..eaf829738 100644 --- a/src/share/vm/classfile/classLoaderData.cpp +++ b/src/share/vm/classfile/classLoaderData.cpp @@ -64,8 +64,10 @@ ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; -ClassLoaderData::ClassLoaderData(Handle h_class_loader) : _class_loader(h_class_loader()), - _metaspace(NULL), _unloading(false), _keep_alive(false), _klasses(NULL), +ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous) : + _class_loader(h_class_loader()), + _is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially + _metaspace(NULL), _unloading(false), _klasses(NULL), _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), _next(NULL), _dependencies(NULL), _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) { @@ -167,16 +169,18 @@ void ClassLoaderData::add_dependency(Handle dependency, TRAPS) { ok = (objArrayOop)ok->obj_at(1); } + // Must handle over GC points + assert (last != NULL, "dependencies should be initialized"); + objArrayHandle last_handle(THREAD, last); + // Create a new dependency node with fields for (class_loader or mirror, next) objArrayOop deps = oopFactory::new_objectArray(2, CHECK); deps->obj_at_put(0, dependency()); - // Must handle over more GC points + // Must handle over GC points objArrayHandle new_dependency(THREAD, deps); // Add the dependency under lock - assert (last != NULL, "dependencies should be initialized"); - objArrayHandle last_handle(THREAD, last); locked_add_dependency(last_handle, new_dependency); } @@ -257,13 +261,6 @@ void ClassLoaderData::remove_class(Klass* scratch_class) { ShouldNotReachHere(); // should have found this class!! } - -bool ClassLoaderData::is_anonymous() const { - Klass* k = _klasses; - return (_keep_alive || (k != NULL && k->oop_is_instance() && - InstanceKlass::cast(k)->is_anonymous())); -} - void ClassLoaderData::unload() { _unloading = true; @@ -396,8 +393,7 @@ void ClassLoaderData::free_deallocate_list() { // These anonymous class loaders are to contain classes used for JSR292 ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) { // Add a new class loader data to the graph. - ClassLoaderData* cld = ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL); - return cld; + return ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL); } const char* ClassLoaderData::loader_name() { @@ -475,7 +471,9 @@ ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle lo // Create one. ClassLoaderData* *list_head = &_head; ClassLoaderData* next = _head; - ClassLoaderData* cld = new ClassLoaderData(loader); + + bool is_anonymous = (cld_addr == NULL); + ClassLoaderData* cld = new ClassLoaderData(loader, is_anonymous); if (cld_addr != NULL) { // First, Atomically set it @@ -485,10 +483,6 @@ ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle lo // Returns the data. return old; } - } else { - // Disallow unloading for this CLD during initialization if there is no - // class_loader oop to link this to. - cld->set_keep_alive(true); } // We won the race, and therefore the task of adding the data to the list of |