--- a/src/hotspot/share/memory/metaspaceShared.cpp Mon May 07 20:42:36 2018 +0200
+++ b/src/hotspot/share/memory/metaspaceShared.cpp Thu Apr 26 13:40:58 2018 -0700
@@ -29,7 +29,6 @@
#include "classfile/dictionary.hpp"
#include "classfile/loaderConstraints.hpp"
#include "classfile/placeholders.hpp"
-#include "classfile/sharedClassUtil.hpp"
#include "classfile/symbolTable.hpp"
#include "classfile/stringTable.hpp"
#include "classfile/systemDictionary.hpp"
@@ -323,6 +322,46 @@
_shared_rs.size(), p2i(_shared_rs.base()));
}
+// Called by universe_post_init()
+void MetaspaceShared::post_initialize(TRAPS) {
+ if (UseSharedSpaces) {
+ int size = FileMapInfo::get_number_of_shared_paths();
+ if (size > 0) {
+ SystemDictionaryShared::allocate_shared_data_arrays(size, THREAD);
+ FileMapInfo::FileMapHeader* header = FileMapInfo::current_info()->header();
+ ClassLoaderExt::init_paths_start_index(header->_app_class_paths_start_index);
+ ClassLoaderExt::init_app_module_paths_start_index(header->_app_module_paths_start_index);
+ }
+ }
+
+ if (DumpSharedSpaces) {
+ if (SharedArchiveConfigFile) {
+ read_extra_data(SharedArchiveConfigFile, THREAD);
+ }
+ }
+}
+
+void MetaspaceShared::read_extra_data(const char* filename, TRAPS) {
+ HashtableTextDump reader(filename);
+ reader.check_version("VERSION: 1.0");
+
+ while (reader.remain() > 0) {
+ int utf8_length;
+ int prefix_type = reader.scan_prefix(&utf8_length);
+ ResourceMark rm(THREAD);
+ char* utf8_buffer = NEW_RESOURCE_ARRAY(char, utf8_length);
+ reader.get_utf8(utf8_buffer, utf8_length);
+
+ if (prefix_type == HashtableTextDump::SymbolPrefix) {
+ SymbolTable::new_symbol(utf8_buffer, utf8_length, THREAD);
+ } else{
+ assert(prefix_type == HashtableTextDump::StringPrefix, "Sanity");
+ utf8_buffer[utf8_length] = '\0';
+ oop s = StringTable::intern(utf8_buffer, THREAD);
+ }
+ }
+}
+
void MetaspaceShared::commit_shared_space_to(char* newtop) {
assert(DumpSharedSpaces, "dump-time only");
char* base = _shared_rs.base();