Mercurial > hg > truffle
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 { |