< prev index next >
src/hotspot/share/memory/universe.cpp
Print this page
@@ -83,22 +83,28 @@
#include "utilities/hashtable.inline.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
#include "utilities/preserveException.hpp"
+#define PRIMITIVE_MIRRORS_DO(func) \
+ func(_int_mirror) \
+ func(_float_mirror) \
+ func(_double_mirror) \
+ func(_byte_mirror) \
+ func(_bool_mirror) \
+ func(_char_mirror) \
+ func(_long_mirror) \
+ func(_short_mirror) \
+ func(_void_mirror)
+
+#define DEFINE_PRIMITIVE_MIRROR(m) \
+ oop Universe::m = NULL;
+
// Known objects
+PRIMITIVE_MIRRORS_DO(DEFINE_PRIMITIVE_MIRROR)
Klass* Universe::_typeArrayKlassObjs[T_LONG+1] = { NULL /*, NULL...*/ };
Klass* Universe::_objectArrayKlassObj = NULL;
-oop Universe::_int_mirror = NULL;
-oop Universe::_float_mirror = NULL;
-oop Universe::_double_mirror = NULL;
-oop Universe::_byte_mirror = NULL;
-oop Universe::_bool_mirror = NULL;
-oop Universe::_char_mirror = NULL;
-oop Universe::_long_mirror = NULL;
-oop Universe::_short_mirror = NULL;
-oop Universe::_void_mirror = NULL;
oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ };
oop Universe::_main_thread_group = NULL;
oop Universe::_system_thread_group = NULL;
objArrayOop Universe::_the_empty_class_klass_array = NULL;
Array<Klass*>* Universe::_the_array_interfaces_array = NULL;
@@ -165,21 +171,15 @@
for (int i = T_BOOLEAN; i < T_LONG+1; i++) {
closure->do_klass(_typeArrayKlassObjs[i]);
}
}
-void Universe::oops_do(OopClosure* f) {
+#define DO_PRIMITIVE_MIRROR(m) \
+ f->do_oop((oop*) &m);
- f->do_oop((oop*) &_int_mirror);
- f->do_oop((oop*) &_float_mirror);
- f->do_oop((oop*) &_double_mirror);
- f->do_oop((oop*) &_byte_mirror);
- f->do_oop((oop*) &_bool_mirror);
- f->do_oop((oop*) &_char_mirror);
- f->do_oop((oop*) &_long_mirror);
- f->do_oop((oop*) &_short_mirror);
- f->do_oop((oop*) &_void_mirror);
+void Universe::oops_do(OopClosure* f) {
+ PRIMITIVE_MIRRORS_DO(DO_PRIMITIVE_MIRROR);
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
f->do_oop((oop*) &_mirrors[i]);
}
assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
@@ -229,37 +229,31 @@
_throw_illegal_access_error_cache->metaspace_pointers_do(it);
_throw_no_such_method_error_cache->metaspace_pointers_do(it);
_do_stack_walk_cache->metaspace_pointers_do(it);
}
+#define ASSERT_MIRROR_NULL(m) \
+ assert(m == NULL, "archived mirrors should be NULL");
+
+#define SERIALIZE_MIRROR(m) \
+ f->do_oop(&m); \
+ if (m != NULL) { java_lang_Class::update_archived_primitive_mirror_native_pointers(m); }
+
// Serialize metadata and pointers to primitive type mirrors in and out of CDS archive
void Universe::serialize(SerializeClosure* f) {
for (int i = 0; i < T_LONG+1; i++) {
f->do_ptr((void**)&_typeArrayKlassObjs[i]);
}
f->do_ptr((void**)&_objectArrayKlassObj);
+
#if INCLUDE_CDS_JAVA_HEAP
-#ifdef ASSERT
- if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) {
- assert(_int_mirror == NULL && _float_mirror == NULL &&
- _double_mirror == NULL && _byte_mirror == NULL &&
- _bool_mirror == NULL && _char_mirror == NULL &&
- _long_mirror == NULL && _short_mirror == NULL &&
- _void_mirror == NULL, "mirrors should be NULL");
- }
-#endif
- f->do_mirror_oop(&_int_mirror);
- f->do_mirror_oop(&_float_mirror);
- f->do_mirror_oop(&_double_mirror);
- f->do_mirror_oop(&_byte_mirror);
- f->do_mirror_oop(&_bool_mirror);
- f->do_mirror_oop(&_char_mirror);
- f->do_mirror_oop(&_long_mirror);
- f->do_mirror_oop(&_short_mirror);
- f->do_mirror_oop(&_void_mirror);
+ DEBUG_ONLY(if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) {
+ PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NULL);
+ });
+ PRIMITIVE_MIRRORS_DO(SERIALIZE_MIRROR);
#endif
f->do_ptr((void**)&_the_array_interfaces_array);
f->do_ptr((void**)&_the_empty_int_array);
f->do_ptr((void**)&_the_empty_short_array);
@@ -422,22 +416,22 @@
assert(i == _fullgc_alot_dummy_array->length(), "just checking");
}
#endif
}
+#define ASSERT_MIRROR_NOT_NULL(m) \
+ assert(m != NULL, "archived mirrors should not be NULL");
+
void Universe::initialize_basic_type_mirrors(TRAPS) {
#if INCLUDE_CDS_JAVA_HEAP
if (UseSharedSpaces &&
HeapShared::open_archive_heap_region_mapped() &&
_int_mirror != NULL) {
assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity");
- assert(_float_mirror != NULL && _double_mirror != NULL &&
- _byte_mirror != NULL && _byte_mirror != NULL &&
- _bool_mirror != NULL && _char_mirror != NULL &&
- _long_mirror != NULL && _short_mirror != NULL &&
- _void_mirror != NULL, "Sanity");
+ PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NOT_NULL);
} else
+ // _int_mirror could be NULL if archived heap is not mapped.
#endif
{
_int_mirror =
java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK);
_float_mirror =
< prev index next >