comparison src/share/vm/classfile/systemDictionary.hpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 1d7922586cf6
children f6b0eb4e44cf
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
34 #include "utilities/hashtable.hpp" 34 #include "utilities/hashtable.hpp"
35 #include "utilities/hashtable.inline.hpp" 35 #include "utilities/hashtable.inline.hpp"
36 36
37 // The system dictionary stores all loaded classes and maps: 37 // The system dictionary stores all loaded classes and maps:
38 // 38 //
39 // [class name,class loader] -> class i.e. [Symbol*,oop] -> klassOop 39 // [class name,class loader] -> class i.e. [Symbol*,oop] -> Klass*
40 // 40 //
41 // Classes are loaded lazily. The default VM class loader is 41 // Classes are loaded lazily. The default VM class loader is
42 // represented as NULL. 42 // represented as NULL.
43 43
44 // The underlying data structure is an open hash table with a fixed number 44 // The underlying data structure is an open hash table with a fixed number
182 /*end*/ 182 /*end*/
183 183
184 184
185 class SystemDictionary : AllStatic { 185 class SystemDictionary : AllStatic {
186 friend class VMStructs; 186 friend class VMStructs;
187 friend class CompactingPermGenGen;
188 friend class SystemDictionaryHandles; 187 friend class SystemDictionaryHandles;
189 NOT_PRODUCT(friend class instanceKlassKlass;)
190 188
191 public: 189 public:
192 enum WKID { 190 enum WKID {
193 NO_WKID = 0, 191 NO_WKID = 0,
194 192
221 // class if needed. If not found a NoClassDefFoundError or a 219 // class if needed. If not found a NoClassDefFoundError or a
222 // ClassNotFoundException is thrown, depending on the value on the 220 // ClassNotFoundException is thrown, depending on the value on the
223 // throw_error flag. For most uses the throw_error argument should be set 221 // throw_error flag. For most uses the throw_error argument should be set
224 // to true. 222 // to true.
225 223
226 static klassOop resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS); 224 static Klass* resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS);
227 // Convenient call for null loader and protection domain. 225 // Convenient call for null loader and protection domain.
228 static klassOop resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS); 226 static Klass* resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS);
229 private: 227 private:
230 // handle error translation for resolve_or_null results 228 // handle error translation for resolve_or_null results
231 static klassOop handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS); 229 static Klass* handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS);
232 230
233 public: 231 public:
234 232
235 // Returns a class with a given class name and class loader. 233 // Returns a class with a given class name and class loader.
236 // Loads the class if needed. If not found NULL is returned. 234 // Loads the class if needed. If not found NULL is returned.
237 static klassOop resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 235 static Klass* resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
238 // Version with null loader and protection domain 236 // Version with null loader and protection domain
239 static klassOop resolve_or_null(Symbol* class_name, TRAPS); 237 static Klass* resolve_or_null(Symbol* class_name, TRAPS);
240 238
241 // Resolve a superclass or superinterface. Called from ClassFileParser, 239 // Resolve a superclass or superinterface. Called from ClassFileParser,
242 // parse_interfaces, resolve_instance_class_or_null, load_shared_class 240 // parse_interfaces, resolve_instance_class_or_null, load_shared_class
243 // "child_name" is the class whose super class or interface is being resolved. 241 // "child_name" is the class whose super class or interface is being resolved.
244 static klassOop resolve_super_or_fail(Symbol* child_name, 242 static Klass* resolve_super_or_fail(Symbol* child_name,
245 Symbol* class_name, 243 Symbol* class_name,
246 Handle class_loader, 244 Handle class_loader,
247 Handle protection_domain, 245 Handle protection_domain,
248 bool is_superclass, 246 bool is_superclass,
249 TRAPS); 247 TRAPS);
250 248
251 // Parse new stream. This won't update the system dictionary or 249 // Parse new stream. This won't update the system dictionary or
252 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses. 250 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses.
253 static klassOop parse_stream(Symbol* class_name, 251 static Klass* parse_stream(Symbol* class_name,
254 Handle class_loader, 252 Handle class_loader,
255 Handle protection_domain, 253 Handle protection_domain,
256 ClassFileStream* st, 254 ClassFileStream* st,
257 TRAPS) { 255 TRAPS) {
258 KlassHandle nullHandle; 256 KlassHandle nullHandle;
259 return parse_stream(class_name, class_loader, protection_domain, st, nullHandle, NULL, THREAD); 257 return parse_stream(class_name, class_loader, protection_domain, st, nullHandle, NULL, THREAD);
260 } 258 }
261 static klassOop parse_stream(Symbol* class_name, 259 static Klass* parse_stream(Symbol* class_name,
262 Handle class_loader, 260 Handle class_loader,
263 Handle protection_domain, 261 Handle protection_domain,
264 ClassFileStream* st, 262 ClassFileStream* st,
265 KlassHandle host_klass, 263 KlassHandle host_klass,
266 GrowableArray<Handle>* cp_patches, 264 GrowableArray<Handle>* cp_patches,
267 TRAPS); 265 TRAPS);
268 266
269 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) 267 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
270 static klassOop resolve_from_stream(Symbol* class_name, Handle class_loader, 268 static Klass* resolve_from_stream(Symbol* class_name, Handle class_loader,
271 Handle protection_domain, 269 Handle protection_domain,
272 ClassFileStream* st, bool verify, TRAPS); 270 ClassFileStream* st, bool verify, TRAPS);
273 271
274 // Lookup an already loaded class. If not found NULL is returned. 272 // Lookup an already loaded class. If not found NULL is returned.
275 static klassOop find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 273 static Klass* find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
276 274
277 // Lookup an already loaded instance or array class. 275 // Lookup an already loaded instance or array class.
278 // Do not make any queries to class loaders; consult only the cache. 276 // Do not make any queries to class loaders; consult only the cache.
279 // If not found NULL is returned. 277 // If not found NULL is returned.
280 static klassOop find_instance_or_array_klass(Symbol* class_name, 278 static Klass* find_instance_or_array_klass(Symbol* class_name,
281 Handle class_loader, 279 Handle class_loader,
282 Handle protection_domain, 280 Handle protection_domain,
283 TRAPS); 281 TRAPS);
284 282
285 // If the given name is known to vmSymbols, return the well-know klass: 283 // If the given name is known to vmSymbols, return the well-know klass:
286 static klassOop find_well_known_klass(Symbol* class_name); 284 static Klass* find_well_known_klass(Symbol* class_name);
287 285
288 // Lookup an instance or array class that has already been loaded 286 // Lookup an instance or array class that has already been loaded
289 // either into the given class loader, or else into another class 287 // either into the given class loader, or else into another class
290 // loader that is constrained (via loader constraints) to produce 288 // loader that is constrained (via loader constraints) to produce
291 // a consistent class. Do not take protection domains into account. 289 // a consistent class. Do not take protection domains into account.
304 // 4. Loading was attempted, but there was a linkage error of some sort. 302 // 4. Loading was attempted, but there was a linkage error of some sort.
305 // In all of these cases, the loader constraints on this type are 303 // In all of these cases, the loader constraints on this type are
306 // satisfied, and it is safe for classes in the given class loader 304 // satisfied, and it is safe for classes in the given class loader
307 // to manipulate strongly-typed values of the found class, subject 305 // to manipulate strongly-typed values of the found class, subject
308 // to local linkage and access checks. 306 // to local linkage and access checks.
309 static klassOop find_constrained_instance_or_array_klass(Symbol* class_name, 307 static Klass* find_constrained_instance_or_array_klass(Symbol* class_name,
310 Handle class_loader, 308 Handle class_loader,
311 TRAPS); 309 TRAPS);
312 310
313 // Iterate over all klasses in dictionary 311 // Iterate over all klasses in dictionary
314 // Just the classes from defining class loaders 312 // Just the classes from defining class loaders
315 static void classes_do(void f(klassOop)); 313 static void classes_do(void f(Klass*));
316 // Added for initialize_itable_for_klass to handle exceptions 314 // Added for initialize_itable_for_klass to handle exceptions
317 static void classes_do(void f(klassOop, TRAPS), TRAPS); 315 static void classes_do(void f(Klass*, TRAPS), TRAPS);
318 // All classes, and their class loaders 316 // All classes, and their class loaders
319 static void classes_do(void f(klassOop, oop)); 317 static void classes_do(void f(Klass*, ClassLoaderData*));
320 // All classes, and their class loaders 318 // All classes, and their class loaders
321 // (added for helpers that use HandleMarks and ResourceMarks) 319 // (added for helpers that use HandleMarks and ResourceMarks)
322 static void classes_do(void f(klassOop, oop, TRAPS), TRAPS); 320 static void classes_do(void f(Klass*, ClassLoaderData*, TRAPS), TRAPS);
323 // All entries in the placeholder table and their class loaders 321 // All entries in the placeholder table and their class loaders
324 static void placeholders_do(void f(Symbol*, oop)); 322 static void placeholders_do(void f(Symbol*));
325 323
326 // Iterate over all methods in all klasses in dictionary 324 // Iterate over all methods in all klasses in dictionary
327 static void methods_do(void f(methodOop)); 325 static void methods_do(void f(Method*));
328 326
329 // Garbage collection support 327 // Garbage collection support
330 328
331 // This method applies "blk->do_oop" to all the pointers to "system" 329 // This method applies "blk->do_oop" to all the pointers to "system"
332 // classes and loaders. 330 // classes and loaders.
333 static void always_strong_oops_do(OopClosure* blk); 331 static void always_strong_oops_do(OopClosure* blk);
334 static void always_strong_classes_do(OopClosure* blk); 332 static void always_strong_classes_do(KlassClosure* closure);
335 // This method applies "blk->do_oop" to all the placeholders.
336 static void placeholders_do(OopClosure* blk);
337 333
338 // Unload (that is, break root links to) all unmarked classes and 334 // Unload (that is, break root links to) all unmarked classes and
339 // loaders. Returns "true" iff something was unloaded. 335 // loaders. Returns "true" iff something was unloaded.
340 static bool do_unloading(BoolObjectClosure* is_alive); 336 static bool do_unloading(BoolObjectClosure* is_alive);
341 337
346 342
347 // System loader lock 343 // System loader lock
348 static oop system_loader_lock() { return _system_loader_lock_obj; } 344 static oop system_loader_lock() { return _system_loader_lock_obj; }
349 345
350 private: 346 private:
351 // Traverses preloaded oops: various system classes. These are 347 // Extended Redefine classes support (tbi)
352 // guaranteed to be in the perm gen. 348 static void preloaded_classes_do(KlassClosure* f);
353 static void preloaded_oops_do(OopClosure* f); 349 static void lazily_loaded_classes_do(KlassClosure* f);
354 static void lazily_loaded_oops_do(OopClosure* f);
355
356 public: 350 public:
357 // Sharing support. 351 // Sharing support.
358 static void reorder_dictionary(); 352 static void reorder_dictionary();
359 static void copy_buckets(char** top, char* end); 353 static void copy_buckets(char** top, char* end);
360 static void copy_table(char** top, char* end); 354 static void copy_table(char** top, char* end);
384 #ifdef ASSERT 378 #ifdef ASSERT
385 static bool is_internal_format(Symbol* class_name); 379 static bool is_internal_format(Symbol* class_name);
386 #endif 380 #endif
387 381
388 // Verify class is in dictionary 382 // Verify class is in dictionary
389 static void verify_obj_klass_present(Handle obj, 383 static void verify_obj_klass_present(Symbol* class_name,
390 Symbol* class_name, 384 ClassLoaderData* loader_data);
391 Handle class_loader);
392 385
393 // Initialization 386 // Initialization
394 static void initialize(TRAPS); 387 static void initialize(TRAPS);
395 388
396 // Fast access to commonly used classes (preloaded) 389 // Fast access to commonly used classes (preloaded)
397 static klassOop check_klass(klassOop k) { 390 static Klass* check_klass(Klass* k) {
398 assert(k != NULL, "preloaded klass not initialized"); 391 assert(k != NULL, "preloaded klass not initialized");
399 return k; 392 return k;
400 } 393 }
401 394
402 static klassOop check_klass_Pre(klassOop k) { return check_klass(k); } 395 static Klass* check_klass_Pre(Klass* k) { return check_klass(k); }
403 static klassOop check_klass_Pre_JSR292(klassOop k) { return EnableInvokeDynamic ? check_klass(k) : k; } 396 static Klass* check_klass_Pre_JSR292(Klass* k) { return EnableInvokeDynamic ? check_klass(k) : k; }
404 static klassOop check_klass_Opt(klassOop k) { return k; } 397 static Klass* check_klass_Opt(Klass* k) { return k; }
405 static klassOop check_klass_Opt_Kernel(klassOop k) { return k; } //== Opt 398 static Klass* check_klass_Opt_Kernel(Klass* k) { return k; } //== Opt
406 static klassOop check_klass_Opt_Only_JDK15(klassOop k) { 399 static Klass* check_klass_Opt_Only_JDK15(Klass* k) {
407 assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only"); 400 assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only");
408 return k; 401 return k;
409 } 402 }
410 static klassOop check_klass_Opt_Only_JDK14NewRef(klassOop k) { 403 static Klass* check_klass_Opt_Only_JDK14NewRef(Klass* k) {
411 assert(JDK_Version::is_gte_jdk14x_version() && UseNewReflection, "JDK 1.4 only"); 404 assert(JDK_Version::is_gte_jdk14x_version() && UseNewReflection, "JDK 1.4 only");
412 // despite the optional loading, if you use this it must be present: 405 // despite the optional loading, if you use this it must be present:
413 return check_klass(k); 406 return check_klass(k);
414 } 407 }
415 408
420 initialize_wk_klasses_until((WKID) limit, start_id, THREAD); 413 initialize_wk_klasses_until((WKID) limit, start_id, THREAD);
421 } 414 }
422 415
423 public: 416 public:
424 #define WK_KLASS_DECLARE(name, symbol, option) \ 417 #define WK_KLASS_DECLARE(name, symbol, option) \
425 static klassOop name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } 418 static Klass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
419 static Klass** name##_addr() { \
420 return &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \
421 }
426 WK_KLASSES_DO(WK_KLASS_DECLARE); 422 WK_KLASSES_DO(WK_KLASS_DECLARE);
427 #undef WK_KLASS_DECLARE 423 #undef WK_KLASS_DECLARE
428 424
429 static klassOop well_known_klass(WKID id) { 425 static Klass* well_known_klass(WKID id) {
430 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); 426 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
431 return _well_known_klasses[id]; 427 return _well_known_klasses[id];
432 } 428 }
433 429
430 static Klass** well_known_klass_addr(WKID id) {
431 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
432 return &_well_known_klasses[id];
433 }
434
434 // Local definition for direct access to the private array: 435 // Local definition for direct access to the private array:
435 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] 436 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
436 437
437 static klassOop box_klass(BasicType t) { 438 static Klass* box_klass(BasicType t) {
438 assert((uint)t < T_VOID+1, "range check"); 439 assert((uint)t < T_VOID+1, "range check");
439 return check_klass(_box_klasses[t]); 440 return check_klass(_box_klasses[t]);
440 } 441 }
441 static BasicType box_klass_type(klassOop k); // inverse of box_klass 442 static BasicType box_klass_type(Klass* k); // inverse of box_klass
442 443
443 // methods returning lazily loaded klasses 444 // methods returning lazily loaded klasses
444 // The corresponding method to load the class must be called before calling them. 445 // The corresponding method to load the class must be called before calling them.
445 static klassOop abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); } 446 static Klass* abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); }
446 447
447 static void load_abstract_ownable_synchronizer_klass(TRAPS); 448 static void load_abstract_ownable_synchronizer_klass(TRAPS);
448 449
449 private: 450 private:
450 // Tells whether ClassLoader.loadClassInternal is present 451 // Tells whether ClassLoader.loadClassInternal is present
451 static bool has_loadClassInternal() { return _has_loadClassInternal; } 452 static bool has_loadClassInternal() { return _has_loadClassInternal; }
452 453
454 // Returns the class loader data to be used when looking up/updating the
455 // system dictionary.
456 static ClassLoaderData *class_loader_data(Handle class_loader) {
457 return ClassLoaderData::class_loader_data(class_loader());
458 }
459
453 public: 460 public:
454 // Tells whether ClassLoader.checkPackageAccess is present 461 // Tells whether ClassLoader.checkPackageAccess is present
455 static bool has_checkPackageAccess() { return _has_checkPackageAccess; } 462 static bool has_checkPackageAccess() { return _has_checkPackageAccess; }
456 463
457 static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; } 464 static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; }
458 static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; } 465 static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; }
466 static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; }
467 static bool ClassLoader_klass_loaded() { return WK_KLASS(ClassLoader_klass) != NULL; }
459 468
460 // Returns default system loader 469 // Returns default system loader
461 static oop java_system_loader(); 470 static oop java_system_loader();
462 471
463 // Compute the default system loader 472 // Compute the default system loader
464 static void compute_java_system_loader(TRAPS); 473 static void compute_java_system_loader(TRAPS);
465 474
475 // Register a new class loader
476 static ClassLoaderData* register_loader(Handle class_loader);
466 private: 477 private:
467 // Mirrors for primitive classes (created eagerly) 478 // Mirrors for primitive classes (created eagerly)
468 static oop check_mirror(oop m) { 479 static oop check_mirror(oop m) {
469 assert(m != NULL, "mirror not initialized"); 480 assert(m != NULL, "mirror not initialized");
470 return m; 481 return m;
515 TRAPS); 526 TRAPS);
516 527
517 // Utility for printing loader "name" as part of tracing constraints 528 // Utility for printing loader "name" as part of tracing constraints
518 static const char* loader_name(oop loader) { 529 static const char* loader_name(oop loader) {
519 return ((loader) == NULL ? "<bootloader>" : 530 return ((loader) == NULL ? "<bootloader>" :
520 instanceKlass::cast((loader)->klass())->name()->as_C_string() ); 531 InstanceKlass::cast((loader)->klass())->name()->as_C_string() );
532 }
533 static const char* loader_name(ClassLoaderData* loader_data) {
534 return (loader_data->is_the_null_class_loader_data() ? "<bootloader>" :
535 InstanceKlass::cast((loader_data->class_loader())->klass())->name()->as_C_string() );
521 } 536 }
522 537
523 // Record the error when the first attempt to resolve a reference from a constant 538 // Record the error when the first attempt to resolve a reference from a constant
524 // pool entry to a class fails. 539 // pool entry to a class fails.
525 static void add_resolution_error(constantPoolHandle pool, int which, Symbol* error); 540 static void add_resolution_error(constantPoolHandle pool, int which, Symbol* error);
541 static void delete_resolution_error(ConstantPool* pool);
526 static Symbol* find_resolution_error(constantPoolHandle pool, int which); 542 static Symbol* find_resolution_error(constantPoolHandle pool, int which);
527 543
528 private: 544 private:
529 545
530 enum Constants { 546 enum Constants {
572 static SymbolPropertyTable* _invoke_method_table; 588 static SymbolPropertyTable* _invoke_method_table;
573 589
574 public: 590 public:
575 // for VM_CounterDecay iteration support 591 // for VM_CounterDecay iteration support
576 friend class CounterDecay; 592 friend class CounterDecay;
577 static klassOop try_get_next_class(); 593 static Klass* try_get_next_class();
578 594
579 private: 595 private:
580 static void validate_protection_domain(instanceKlassHandle klass, 596 static void validate_protection_domain(instanceKlassHandle klass,
581 Handle class_loader, 597 Handle class_loader,
582 Handle protection_domain, TRAPS); 598 Handle protection_domain, TRAPS);
589 static LoaderConstraintTable* constraints() { return _loader_constraints; } 605 static LoaderConstraintTable* constraints() { return _loader_constraints; }
590 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } 606 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; }
591 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; } 607 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; }
592 608
593 // Basic loading operations 609 // Basic loading operations
594 static klassOop resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 610 static Klass* resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
595 static klassOop resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 611 static Klass* resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
596 static instanceKlassHandle handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); 612 static instanceKlassHandle handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);
597 // Wait on SystemDictionary_lock; unlocks lockObject before 613 // Wait on SystemDictionary_lock; unlocks lockObject before
598 // waiting; relocks lockObject with correct recursion count 614 // waiting; relocks lockObject with correct recursion count
599 // after waiting, but before reentering SystemDictionary_lock 615 // after waiting, but before reentering SystemDictionary_lock
600 // to preserve lock order semantics. 616 // to preserve lock order semantics.
611 static Handle compute_loader_lock_object(Handle class_loader, TRAPS); 627 static Handle compute_loader_lock_object(Handle class_loader, TRAPS);
612 static void check_loader_lock_contention(Handle loader_lock, TRAPS); 628 static void check_loader_lock_contention(Handle loader_lock, TRAPS);
613 static bool is_parallelCapable(Handle class_loader); 629 static bool is_parallelCapable(Handle class_loader);
614 static bool is_parallelDefine(Handle class_loader); 630 static bool is_parallelDefine(Handle class_loader);
615 631
616 static klassOop find_shared_class(Symbol* class_name); 632 static Klass* find_shared_class(Symbol* class_name);
617 633
618 // Setup link to hierarchy 634 // Setup link to hierarchy
619 static void add_to_hierarchy(instanceKlassHandle k, TRAPS); 635 static void add_to_hierarchy(instanceKlassHandle k, TRAPS);
620 636
621 private: 637 private:
622 // We pass in the hashtable index so we can calculate it outside of 638 // We pass in the hashtable index so we can calculate it outside of
623 // the SystemDictionary_lock. 639 // the SystemDictionary_lock.
624 640
625 // Basic find on loaded classes 641 // Basic find on loaded classes
626 static klassOop find_class(int index, unsigned int hash, 642 static Klass* find_class(int index, unsigned int hash,
627 Symbol* name, Handle loader); 643 Symbol* name, ClassLoaderData* loader_data);
628 static klassOop find_class(Symbol* class_name, Handle class_loader); 644 static Klass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
629 645
630 // Basic find on classes in the midst of being loaded 646 // Basic find on classes in the midst of being loaded
631 static Symbol* find_placeholder(Symbol* name, Handle loader); 647 static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data);
632 648
633 // Updating entry in dictionary 649 // Updating entry in dictionary
634 // Add a completely loaded class 650 // Add a completely loaded class
635 static void add_klass(int index, Symbol* class_name, 651 static void add_klass(int index, Symbol* class_name,
636 Handle class_loader, KlassHandle obj); 652 ClassLoaderData* loader_data, KlassHandle obj);
637 653
638 // Add a placeholder for a class being loaded 654 // Add a placeholder for a class being loaded
639 static void add_placeholder(int index, 655 static void add_placeholder(int index,
640 Symbol* class_name, 656 Symbol* class_name,
641 Handle class_loader); 657 ClassLoaderData* loader_data);
642 static void remove_placeholder(int index, 658 static void remove_placeholder(int index,
643 Symbol* class_name, 659 Symbol* class_name,
644 Handle class_loader); 660 ClassLoaderData* loader_data);
645 661
646 // Performs cleanups after resolve_super_or_fail. This typically needs 662 // Performs cleanups after resolve_super_or_fail. This typically needs
647 // to be called on failure. 663 // to be called on failure.
648 // Won't throw, but can block. 664 // Won't throw, but can block.
649 static void resolution_cleanups(Symbol* class_name, 665 static void resolution_cleanups(Symbol* class_name,
650 Handle class_loader, 666 ClassLoaderData* loader_data,
651 TRAPS); 667 TRAPS);
652 668
653 // Initialization 669 // Initialization
654 static void initialize_preloaded_classes(TRAPS); 670 static void initialize_preloaded_classes(TRAPS);
655 671
657 static void check_constraints(int index, unsigned int hash, 673 static void check_constraints(int index, unsigned int hash,
658 instanceKlassHandle k, Handle loader, 674 instanceKlassHandle k, Handle loader,
659 bool defining, TRAPS); 675 bool defining, TRAPS);
660 static void update_dictionary(int d_index, unsigned int d_hash, 676 static void update_dictionary(int d_index, unsigned int d_hash,
661 int p_index, unsigned int p_hash, 677 int p_index, unsigned int p_hash,
662 instanceKlassHandle k, Handle loader, TRAPS); 678 instanceKlassHandle k, Handle loader,
679 TRAPS);
663 680
664 // Variables holding commonly used klasses (preloaded) 681 // Variables holding commonly used klasses (preloaded)
665 static klassOop _well_known_klasses[]; 682 static Klass* _well_known_klasses[];
666 683
667 // Lazily loaded klasses 684 // Lazily loaded klasses
668 static volatile klassOop _abstract_ownable_synchronizer_klass; 685 static Klass* volatile _abstract_ownable_synchronizer_klass;
669 686
670 // table of box klasses (int_klass, etc.) 687 // table of box klasses (int_klass, etc.)
671 static klassOop _box_klasses[T_VOID+1]; 688 static Klass* _box_klasses[T_VOID+1];
672 689
673 static oop _java_system_loader; 690 static oop _java_system_loader;
674 691
675 static bool _has_loadClassInternal; 692 static bool _has_loadClassInternal;
676 static bool _has_checkPackageAccess; 693 static bool _has_checkPackageAccess;
677 }; 694 };
678 695
679 class SystemDictionaryHandles : AllStatic {
680 public:
681 #define WK_KLASS_HANDLE_DECLARE(name, ignore_symbol, option) \
682 static KlassHandle name() { \
683 SystemDictionary::name(); \
684 klassOop* loc = &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \
685 return KlassHandle(loc, true); \
686 }
687 WK_KLASSES_DO(WK_KLASS_HANDLE_DECLARE);
688 #undef WK_KLASS_HANDLE_DECLARE
689
690 static KlassHandle box_klass(BasicType t);
691 };
692
693 #endif // SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP 696 #endif // SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP