comparison src/share/vm/classfile/classLoaderData.cpp @ 7409:30866cd626b0

8004883: NPG: clean up anonymous class fix Summary: Add klass_holder() to return either mirror or class_loader depending on if the class is anonymous or not. Reviewed-by: stefank, jrose
author coleenp
date Wed, 12 Dec 2012 11:39:29 -0500
parents 90273fc0a981
children c52660592f37
comparison
equal deleted inserted replaced
7396:4a2ed49abd51 7409:30866cd626b0
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 }
253 return; 255 return;
254 } 256 }
255 prev = k; 257 prev = k;
256 } 258 }
257 ShouldNotReachHere(); // should have found this class!! 259 ShouldNotReachHere(); // should have found this class!!
258 }
259
260
261 bool ClassLoaderData::is_anonymous() const {
262 Klass* k = _klasses;
263 return (_keep_alive || (k != NULL && k->oop_is_instance() &&
264 InstanceKlass::cast(k)->is_anonymous()));
265 } 260 }
266 261
267 void ClassLoaderData::unload() { 262 void ClassLoaderData::unload() {
268 _unloading = true; 263 _unloading = true;
269 264
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 {