hotspot/src/share/vm/memory/filemap.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 37179 4dbcb3a642d2
child 38108 95c7e9d6747c
child 37773 e5b3e9732c3c
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35917
463d67f86eaa 8079408: Reimplement TraceClassLoading, TraceClassUnloading, and TraceClassLoaderData with Unified Logging.
mockner
parents: 35061
diff changeset
     2
 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2131
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2131
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2131
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "classfile/classLoader.hpp"
34659
3a7071043457 8143615: compactHashtable.hpp includes .inline.hpp file
iklam
parents: 33628
diff changeset
    27
#include "classfile/compactHashtable.inline.hpp"
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    28
#include "classfile/sharedClassUtil.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "classfile/symbolTable.hpp"
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    30
#include "classfile/systemDictionaryShared.hpp"
14577
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
    31
#include "classfile/altHashing.hpp"
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
    32
#if INCLUDE_ALL_GCS
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
    33
#include "gc/g1/g1CollectedHeap.hpp"
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
    34
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "memory/filemap.hpp"
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    36
#include "memory/metadataFactory.hpp"
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    37
#include "memory/oopFactory.hpp"
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    38
#include "oops/objArrayOop.hpp"
31332
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
    39
#include "prims/jvmtiExport.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
#include "runtime/os.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    43
#include "runtime/vm_version.hpp"
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13728
diff changeset
    44
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
# include <sys/stat.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
# include <errno.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
#ifndef O_BINARY       // if defined (Win32) use binary files.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
#define O_BINARY 0     // otherwise do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
extern address JVM_FunctionAtStart();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
extern address JVM_FunctionAtEnd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1
diff changeset
    57
// Complain and stop. All error conditions occurring during the writing of
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// an archive file should stop the process.  Unrecoverable errors during
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// the reading of the archive file should stop the process.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
static void fail(const char *msg, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  // This occurs very early during initialization: tty is not initialized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  jio_fprintf(defaultStream::error_stream(),
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1
diff changeset
    64
              "An error has occurred while processing the"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
              " shared archive file.\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  jio_vfprintf(defaultStream::error_stream(), msg, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  jio_fprintf(defaultStream::error_stream(), "\n");
19707
fecaabc8e462 8023381: VM fails to initialize in runtime/CDSCompressedKPtrs/XShareAuto.java runtime/SharedArchiveFile/CdsSameObjectAlignment.java
hseigel
parents: 19319
diff changeset
    68
  // Do not change the text of the below message because some tests check for it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  vm_exit_during_initialization("Unable to use shared archive.", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
void FileMapInfo::fail_stop(const char *msg, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
        va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  va_start(ap, msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  fail(msg, ap);        // Never returns.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  va_end(ap);           // for completeness.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
// Complain and continue.  Recoverable errors during the reading of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
// archive file may continue (with sharing disabled).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// If we continue, then disable shared spaces and close the file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
void FileMapInfo::fail_continue(const char *msg, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  va_start(ap, msg);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    89
  MetaspaceShared::set_archive_loading_failed();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    90
  if (PrintSharedArchiveAndExit && _validating_classpath_entry_table) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    91
    // If we are doing PrintSharedArchiveAndExit and some of the classpath entries
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    92
    // do not validate, we can still continue "limping" to validate the remaining
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    93
    // entries. No need to quit.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    94
    tty->print("[");
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    95
    tty->vprint(msg, ap);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    96
    tty->print_cr("]");
23186
9396c6fb571b 8033990: Add message to verbose output to indicate when JVM was unable to use shared archive (with -Xshare:auto)
mseledtsov
parents: 19707
diff changeset
    97
  } else {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    98
    if (RequireSharedSpaces) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
    99
      fail(msg, ap);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   100
    } else {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   101
      if (PrintSharedSpaces) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   102
        tty->print_cr("UseSharedSpaces: %s", msg);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   103
      }
23186
9396c6fb571b 8033990: Add message to verbose output to indicate when JVM was unable to use shared archive (with -Xshare:auto)
mseledtsov
parents: 19707
diff changeset
   104
    }
28017
84009002b566 8066670: PrintSharedArchiveAndExit does not exit the VM when the archive is invalid
iklam
parents: 27880
diff changeset
   105
    UseSharedSpaces = false;
84009002b566 8066670: PrintSharedArchiveAndExit does not exit the VM when the archive is invalid
iklam
parents: 27880
diff changeset
   106
    assert(current_info() != NULL, "singleton must be registered");
84009002b566 8066670: PrintSharedArchiveAndExit does not exit the VM when the archive is invalid
iklam
parents: 27880
diff changeset
   107
    current_info()->close();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
14577
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   112
// Fill in the fileMapInfo structure with data about this VM instance.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
14577
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   114
// This method copies the vm version info into header_version.  If the version is too
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   115
// long then a truncated version, which has a hash code appended to it, is copied.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   116
//
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   117
// Using a template enables this method to verify that header_version is an array of
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   118
// length JVM_IDENT_MAX.  This ensures that the code that writes to the CDS file and
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   119
// the code that reads the CDS file will both use the same size buffer.  Hence, will
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   120
// use identical truncation.  This is necessary for matching of truncated versions.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   121
template <int N> static void get_header_version(char (&header_version) [N]) {
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   122
  assert(N == JVM_IDENT_MAX, "Bad header_version size");
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   123
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   124
  const char *vm_version = VM_Version::internal_vm_info_string();
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   125
  const int version_len = (int)strlen(vm_version);
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   126
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   127
  if (version_len < (JVM_IDENT_MAX-1)) {
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   128
    strcpy(header_version, vm_version);
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   129
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   130
  } else {
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   131
    // Get the hash value.  Use a static seed because the hash needs to return the same
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   132
    // value over multiple jvm invocations.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   133
    unsigned int hash = AltHashing::murmur3_32(8191, (const jbyte*)vm_version, version_len);
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   134
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   135
    // Truncate the ident, saving room for the 8 hex character hash value.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   136
    strncpy(header_version, vm_version, JVM_IDENT_MAX-9);
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   137
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   138
    // Append the hash code as eight hex digits.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   139
    sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash);
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   140
    header_version[JVM_IDENT_MAX-1] = 0;  // Null terminate.
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   141
  }
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   142
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   144
FileMapInfo::FileMapInfo() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   145
  assert(_current_info == NULL, "must be singleton"); // not thread safe
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   146
  _current_info = this;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   147
  memset(this, 0, sizeof(FileMapInfo));
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   148
  _file_offset = 0;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   149
  _file_open = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   150
  _header = SharedClassUtil::allocate_file_map_header();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   151
  _header->_version = _invalid_version;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   152
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   153
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   154
FileMapInfo::~FileMapInfo() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   155
  assert(_current_info == this, "must be singleton"); // not thread safe
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   156
  _current_info = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   157
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   158
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
void FileMapInfo::populate_header(size_t alignment) {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   160
  _header->populate(this, alignment);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   161
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   162
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   163
size_t FileMapInfo::FileMapHeader::data_size() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   164
  return SharedClassUtil::file_map_header_size() - sizeof(FileMapInfo::FileMapHeaderBase);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   165
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   166
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   167
void FileMapInfo::FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   168
  _magic = 0xf00baba2;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   169
  _version = _current_version;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   170
  _alignment = alignment;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   171
  _obj_alignment = ObjectAlignmentInBytes;
33628
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   172
  _compact_strings = CompactStrings;
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   173
  _narrow_oop_mode = Universe::narrow_oop_mode();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   174
  _narrow_oop_shift = Universe::narrow_oop_shift();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   175
  _max_heap_size = MaxHeapSize;
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   176
  _narrow_klass_base = Universe::narrow_klass_base();
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   177
  _narrow_klass_shift = Universe::narrow_klass_shift();
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   178
  _classpath_entry_table_size = mapinfo->_classpath_entry_table_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   179
  _classpath_entry_table = mapinfo->_classpath_entry_table;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   180
  _classpath_entry_size = mapinfo->_classpath_entry_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // The following fields are for sanity checks for whether this archive
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // will function correctly with this JVM and the bootclasspath it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  // invoked with.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // JVM version string ... changes on each build.
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   187
  get_header_version(_jvm_ident);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   188
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   189
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   190
void FileMapInfo::allocate_classpath_entry_table() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   191
  int bytes = 0;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   192
  int count = 0;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   193
  char* strptr = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   194
  char* strptr_max = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   195
  Thread* THREAD = Thread::current();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   197
  ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   198
  size_t entry_size = SharedClassUtil::shared_class_path_entry_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   200
  for (int pass=0; pass<2; pass++) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   201
    ClassPathEntry *cpe = ClassLoader::classpath_entry(0);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   202
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   203
    for (int cur_entry = 0 ; cpe != NULL; cpe = cpe->next(), cur_entry++) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   204
      const char *name = cpe->name();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   205
      int name_bytes = (int)(strlen(name) + 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   207
      if (pass == 0) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   208
        count ++;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   209
        bytes += (int)entry_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   210
        bytes += name_bytes;
36364
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   211
        log_info(classpath)("add main shared path (%s) %s", (cpe->is_jar_file() ? "jar" : "dir"), name);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   212
      } else {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   213
        SharedClassPathEntry* ent = shared_classpath(cur_entry);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   214
        if (cpe->is_jar_file()) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   215
          struct stat st;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   216
          if (os::stat(name, &st) != 0) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   217
            // The file/dir must exist, or it would not have been added
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   218
            // into ClassLoader::classpath_entry().
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   219
            //
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   220
            // If we can't access a jar file in the boot path, then we can't
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   221
            // make assumptions about where classes get loaded from.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   222
            FileMapInfo::fail_stop("Unable to open jar file %s.", name);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   223
          }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   225
          EXCEPTION_MARK; // The following call should never throw, but would exit VM on error.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   226
          SharedClassUtil::update_shared_classpath(cpe, ent, st.st_mtime, st.st_size, THREAD);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   227
        } else {
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27025
diff changeset
   228
          struct stat st;
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   229
          if (os::stat(name, &st) == 0) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   230
            if (cpe->is_jrt()) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   231
              // it's the "modules" jimage
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   232
              ent->_timestamp = st.st_mtime;
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   233
              ent->_filesize = st.st_size;
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   234
            } else if ((st.st_mode & S_IFDIR) == S_IFDIR) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   235
              if (!os::dir_is_empty(name)) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   236
                ClassLoader::exit_with_path_failure(
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   237
                  "Cannot have non-empty directory in archived classpaths", name);
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   238
              }
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   239
              ent->_filesize = -1;
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27025
diff changeset
   240
            }
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   241
          }
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   242
          if (ent->_filesize == 0) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   243
            // unknown
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27025
diff changeset
   244
            ent->_filesize = -2;
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   245
          }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   246
        }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   247
        ent->_name = strptr;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   248
        if (strptr + name_bytes <= strptr_max) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   249
          strncpy(strptr, name, (size_t)name_bytes); // name_bytes includes trailing 0.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   250
          strptr += name_bytes;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   251
        } else {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   252
          assert(0, "miscalculated buffer size");
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   253
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    }
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   256
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   257
    if (pass == 0) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   258
      EXCEPTION_MARK; // The following call should never throw, but would exit VM on error.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   259
      Array<u8>* arr = MetadataFactory::new_array<u8>(loader_data, (bytes + 7)/8, THREAD);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   260
      strptr = (char*)(arr->data());
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   261
      strptr_max = strptr + bytes;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   262
      SharedClassPathEntry* table = (SharedClassPathEntry*)strptr;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   263
      strptr += entry_size * count;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   264
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   265
      _classpath_entry_table_size = count;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   266
      _classpath_entry_table = table;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   267
      _classpath_entry_size = entry_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   268
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   272
bool FileMapInfo::validate_classpath_entry_table() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   273
  _validating_classpath_entry_table = true;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   274
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   275
  int count = _header->_classpath_entry_table_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   276
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   277
  _classpath_entry_table = _header->_classpath_entry_table;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   278
  _classpath_entry_size = _header->_classpath_entry_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   279
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   280
  for (int i=0; i<count; i++) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   281
    SharedClassPathEntry* ent = shared_classpath(i);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   282
    struct stat st;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   283
    const char* name = ent->_name;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   284
    bool ok = true;
36364
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   285
    log_info(classpath)("checking shared classpath entry: %s", name);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   286
    if (os::stat(name, &st) != 0) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   287
      fail_continue("Required classpath entry does not exist: %s", name);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   288
      ok = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   289
    } else if (ent->is_dir()) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   290
      if (!os::dir_is_empty(name)) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   291
        fail_continue("directory is not empty: %s", name);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   292
        ok = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   293
      }
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   294
    } else if (ent->is_jar_or_bootimage()) {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   295
      if (ent->_timestamp != st.st_mtime ||
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   296
          ent->_filesize != st.st_size) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   297
        ok = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   298
        if (PrintSharedArchiveAndExit) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   299
          fail_continue(ent->_timestamp != st.st_mtime ?
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   300
                        "Timestamp mismatch" :
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   301
                        "File size mismatch");
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   302
        } else {
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   303
          fail_continue("A jar/jimage file is not the one used while building"
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   304
                        " the shared archive file: %s", name);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   305
        }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   306
      }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   307
    }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   308
    if (ok) {
36364
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   309
      log_info(classpath)("ok");
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   310
    } else if (!PrintSharedArchiveAndExit) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   311
      _validating_classpath_entry_table = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   312
      return false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   313
    }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   314
  }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   315
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   316
  _classpath_entry_table_size = _header->_classpath_entry_table_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   317
  _validating_classpath_entry_table = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   318
  return true;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   319
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   320
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
// Read the FileMapInfo information from the file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
bool FileMapInfo::init_from_file(int fd) {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   325
  size_t sz = _header->data_size();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   326
  char* addr = _header->data();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   327
  size_t n = os::read(fd, addr, (unsigned int)sz);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   328
  if (n != sz) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    fail_continue("Unable to read the file header.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   332
  if (_header->_version != current_version()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    fail_continue("The shared archive file has the wrong version.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  _file_offset = (long)n;
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   337
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   338
  size_t info_size = _header->_paths_misc_info_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   339
  _paths_misc_info = NEW_C_HEAP_ARRAY_RETURN_NULL(char, info_size, mtClass);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   340
  if (_paths_misc_info == NULL) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   341
    fail_continue("Unable to read the file header.");
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   342
    return false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   343
  }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   344
  n = os::read(fd, _paths_misc_info, (unsigned int)info_size);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   345
  if (n != info_size) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   346
    fail_continue("Unable to read the shared path info header.");
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27025
diff changeset
   347
    FREE_C_HEAP_ARRAY(char, _paths_misc_info);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   348
    _paths_misc_info = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   349
    return false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   350
  }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   351
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   352
  size_t len = lseek(fd, 0, SEEK_END);
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   353
  struct FileMapInfo::FileMapHeader::space_info* si =
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   354
    &_header->_space[MetaspaceShared::mc];
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   355
  if (si->_file_offset >= len || len - si->_file_offset < si->_used) {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   356
    fail_continue("The shared archive file has been truncated.");
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   357
    return false;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   358
  }
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   359
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   360
  _file_offset += (long)n;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
// Read the FileMapInfo information from the file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
bool FileMapInfo::open_for_read() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  _full_path = Arguments::GetSharedArchivePath();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  int fd = open(_full_path, O_RDONLY | O_BINARY, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  if (fd < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    if (errno == ENOENT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
      // Not locating the shared archive is ok.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
      fail_continue("Specified shared archive not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
      fail_continue("Failed to open shared archive file (%s).",
37113
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 36364
diff changeset
   375
                    os::strerror(errno));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  _fd = fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  _file_open = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// Write the FileMapInfo information to the file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
void FileMapInfo::open_for_write() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
 _full_path = Arguments::GetSharedArchivePath();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  if (PrintSharedSpaces) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    tty->print_cr("Dumping shared data to file: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    tty->print_cr("   %s", _full_path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
15461
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   395
#ifdef _WINDOWS  // On Windows, need WRITE permission to remove the file.
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   396
  chmod(_full_path, _S_IREAD | _S_IWRITE);
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   397
#endif
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   398
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   399
  // Use remove() to delete the existing file because, on Unix, this will
e3acbfdabafa 7197672: There are issues with shared data on windows
hseigel
parents: 15101
diff changeset
   400
  // allow processes that have it open continued access to the file.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  remove(_full_path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  if (fd < 0) {
28950
693ae3d5e1ff 8072694: Need errno info when CDS archive creation fails
hseigel
parents: 28023
diff changeset
   404
    fail_stop("Unable to create shared archive file %s: (%s).", _full_path,
37113
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 36364
diff changeset
   405
              os::strerror(errno));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  _fd = fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  _file_offset = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  _file_open = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
// Write the header to the file, seek to the next allocation boundary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
void FileMapInfo::write_header() {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   416
  int info_size = ClassLoader::get_shared_paths_misc_info_size();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   417
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   418
  _header->_paths_misc_info_size = info_size;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   419
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   420
  align_file_position();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   421
  size_t sz = _header->data_size();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   422
  char* addr = _header->data();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   423
  write_bytes(addr, (int)sz); // skip the C++ vtable
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   424
  write_bytes(ClassLoader::get_shared_paths_misc_info(), info_size);
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   425
  align_file_position();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
// Dump shared spaces to file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   431
void FileMapInfo::write_space(int i, Metaspace* space, bool read_only) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  align_file_position();
17109
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 16430
diff changeset
   433
  size_t used = space->used_bytes_slow(Metaspace::NonClassType);
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 16430
diff changeset
   434
  size_t capacity = space->capacity_bytes_slow(Metaspace::NonClassType);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   435
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   436
  write_region(i, (char*)space->bottom(), used, capacity, read_only, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
// Dump region to file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
void FileMapInfo::write_region(int region, char* base, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
                               size_t capacity, bool read_only,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
                               bool allow_exec) {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   445
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[region];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  if (_file_open) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    guarantee(si->_file_offset == _file_offset, "file offset mismatch.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    if (PrintSharedSpaces) {
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   450
      tty->print_cr("Shared file region %d: " SIZE_FORMAT_HEX_W(6) " bytes, addr " INTPTR_FORMAT
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   451
                    " file offset " SIZE_FORMAT_HEX_W(6), region, size, p2i(base), _file_offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    si->_file_offset = _file_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  }
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   456
  if (MetaspaceShared::is_string_region(region)) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   457
    assert((base - (char*)Universe::narrow_oop_base()) % HeapWordSize == 0, "Sanity");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   458
    if (base != NULL) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   459
      si->_addr._offset = (intx)oopDesc::encode_heap_oop_not_null((oop)base);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   460
    } else {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   461
      si->_addr._offset = 0;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   462
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   463
  } else {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   464
    si->_addr._base = base;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   465
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  si->_used = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  si->_capacity = capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  si->_read_only = read_only;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  si->_allow_exec = allow_exec;
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   470
  si->_crc = ClassLoader::crc32(0, base, (jint)size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  write_bytes_aligned(base, (int)size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   474
// Write the string space. The string space contains one or multiple GC(G1) regions.
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   475
// When the total string space size is smaller than one GC region of the dump time,
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   476
// only one string region is used for shared strings.
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   477
//
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   478
// If the total string space size is bigger than one GC region, there would be more
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   479
// than one GC regions allocated for shared strings. The first/bottom GC region might
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   480
// be a partial GC region with the empty portion at the higher address within that region.
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   481
// The non-empty portion of the first region is written into the archive as one string
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   482
// region. The rest are consecutive full GC regions if they exist, which can be written
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   483
// out in one chunk as another string region.
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   484
void FileMapInfo::write_string_regions(GrowableArray<MemRegion> *regions) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   485
  for (int i = MetaspaceShared::first_string;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   486
           i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   487
    char* start = NULL;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   488
    size_t size = 0;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   489
    if (regions->is_nonempty()) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   490
      if (i == MetaspaceShared::first_string) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   491
        MemRegion first = regions->first();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   492
        start = (char*)first.start();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   493
        size = first.byte_size();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   494
      } else {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   495
        int len = regions->length();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   496
        if (len > 1) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   497
          start = (char*)regions->at(1).start();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   498
          size = (char*)regions->at(len - 1).end() - start;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   499
        }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   500
      }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   501
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   502
    write_region(i, start, size, size, false, false);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   503
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   504
}
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   505
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
// Dump bytes to file -- at the current file position.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
void FileMapInfo::write_bytes(const void* buffer, int nbytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  if (_file_open) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    int n = ::write(_fd, buffer, nbytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    if (n != nbytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      // It is dangerous to leave the corrupted shared archive file around,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
      // close and remove the file. See bug 6372906.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
      close();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
      remove(_full_path);
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   517
      fail_stop("Unable to write to shared archive file.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  _file_offset += nbytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
// Align file position to an allocation unit boundary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
void FileMapInfo::align_file_position() {
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   527
  size_t new_file_offset = align_size_up(_file_offset,
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   528
                                         os::vm_allocation_granularity());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  if (new_file_offset != _file_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    _file_offset = new_file_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    if (_file_open) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
      // Seek one byte back from the target and write a byte to insure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
      // that the written file is the correct length.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
      _file_offset -= 1;
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   535
      if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) {
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   536
        fail_stop("Unable to seek.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
      char zero = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
      write_bytes(&zero, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
// Dump bytes to file -- at the current file position.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
void FileMapInfo::write_bytes_aligned(const void* buffer, int nbytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  align_file_position();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  write_bytes(buffer, nbytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  align_file_position();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
// Close the shared archive file.  This does NOT unmap mapped regions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
void FileMapInfo::close() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  if (_file_open) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    if (::close(_fd) < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
      fail_stop("Unable to close the shared archive file.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    _file_open = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    _fd = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
// JVM/TI RedefineClasses() support:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// Remap the shared readonly space to shared readwrite, private.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
bool FileMapInfo::remap_shared_readonly_as_readwrite() {
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   570
  int idx = 0;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   571
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[idx];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  if (!si->_read_only) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    // the space is already readwrite so we are done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  size_t used = si->_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  size_t size = align_size_up(used, os::vm_allocation_granularity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  if (!open_for_read()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  }
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   581
  char *addr = _header->region_addr(idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  char *base = os::remap_memory(_fd, _full_path, si->_file_offset,
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   583
                                addr, size, false /* !read_only */,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
                                si->_allow_exec);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  close();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  if (base == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    fail_continue("Unable to remap shared readonly space (errno=%d).", errno);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  }
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   590
  if (base != addr) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    fail_continue("Unable to remap shared readonly space at required address.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  si->_read_only = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   598
// Map the whole region at once, assumed to be allocated contiguously.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   599
ReservedSpace FileMapInfo::reserve_shared_memory() {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   600
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[0];
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   601
  char* requested_addr = _header->region_addr(0);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   602
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   603
  size_t size = FileMapInfo::shared_spaces_size();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   604
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   605
  // Reserve the space first, then map otherwise map will go right over some
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   606
  // other reserved memory (like the code cache).
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   607
  ReservedSpace rs(size, os::vm_allocation_granularity(), false, requested_addr);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   608
  if (!rs.is_reserved()) {
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   609
    fail_continue("Unable to reserve shared space at required address "
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   610
                  INTPTR_FORMAT, p2i(requested_addr));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   611
    return rs;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   612
  }
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13728
diff changeset
   613
  // the reserved virtual memory is for mapping class data sharing archive
15100
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   614
  MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   615
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   616
  return rs;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   617
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
// Memory map a region in the address space.
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   620
static const char* shared_region_name[] = { "ReadOnly", "ReadWrite", "MiscData", "MiscCode",
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   621
                                            "String1", "String2" };
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   623
char* FileMapInfo::map_region(int i) {
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   624
  assert(!MetaspaceShared::is_string_region(i), "sanity");
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   625
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  size_t used = si->_used;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   627
  size_t alignment = os::vm_allocation_granularity();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   628
  size_t size = align_size_up(used, alignment);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   629
  char *requested_addr = _header->region_addr(i);
31332
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
   630
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
   631
  // If a tool agent is in use (debugging enabled), we must map the address space RW
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
   632
  if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
31375
aa5ecd9a5716 8087153: EXCEPTION_ACCESS_VIOLATION when CDS RO section vanished on win32
cjplummer
parents: 31364
diff changeset
   633
    si->_read_only = false;
31332
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
   634
  }
dc17890f352d 8054386: Allow Java debugging when CDS is enabled
cjplummer
parents: 28950
diff changeset
   635
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   636
  // map the contents of the CDS archive in this memory
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  char *base = os::map_memory(_fd, _full_path, si->_file_offset,
31375
aa5ecd9a5716 8087153: EXCEPTION_ACCESS_VIOLATION when CDS RO section vanished on win32
cjplummer
parents: 31364
diff changeset
   638
                              requested_addr, size, si->_read_only,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
                              si->_allow_exec);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   640
  if (base == NULL || base != requested_addr) {
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   641
    fail_continue("Unable to map %s shared space at required address.", shared_region_name[i]);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  }
15100
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   644
#ifdef _WINDOWS
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   645
  // This call is Windows-only because the memory_type gets recorded for the other platforms
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   646
  // in method FileMapInfo::reserve_shared_memory(), which is not called on Windows.
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   647
  MemTracker::record_virtual_memory_type((address)base, mtClassShared);
0ae85ac7c8b0 8003705: CDS failed on Windows: can not map in the CDS.
hseigel
parents: 14577
diff changeset
   648
#endif
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   649
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  return base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
31360
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   653
static MemRegion *string_ranges = NULL;
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   654
static int num_ranges = 0;
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   655
bool FileMapInfo::map_string_regions() {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   656
#if INCLUDE_ALL_GCS
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   657
  if (UseG1GC && UseCompressedOops && UseCompressedClassPointers) {
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   658
    // Check that all the narrow oop and klass encodings match the archive
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   659
    if (narrow_oop_mode() != Universe::narrow_oop_mode() ||
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   660
        narrow_oop_shift() != Universe::narrow_oop_shift() ||
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   661
        narrow_klass_base() != Universe::narrow_klass_base() ||
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   662
        narrow_klass_shift() != Universe::narrow_klass_shift()) {
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   663
      if (PrintSharedSpaces && _header->_space[MetaspaceShared::first_string]._used > 0) {
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   664
        tty->print_cr("Shared string data from the CDS archive is being ignored. "
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   665
                     "The current CompressedOops/CompressedClassPointers encoding differs from "
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   666
                     "that archived due to heap size change. The archive was dumped using max heap "
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   667
                     "size " UINTX_FORMAT "M.", max_heap_size()/M);
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   668
      }
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   669
    } else {
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   670
      string_ranges = new MemRegion[MetaspaceShared::max_strings];
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   671
      struct FileMapInfo::FileMapHeader::space_info* si;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   672
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   673
      for (int i = MetaspaceShared::first_string;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   674
               i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   675
        si = &_header->_space[i];
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   676
        size_t used = si->_used;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   677
        if (used > 0) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   678
          size_t size = used;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   679
          char* requested_addr = (char*)((void*)oopDesc::decode_heap_oop_not_null(
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   680
                                                 (narrowOop)si->_addr._offset));
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   681
          string_ranges[num_ranges] = MemRegion((HeapWord*)requested_addr, size / HeapWordSize);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   682
          num_ranges ++;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   683
        }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   684
      }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   685
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   686
      if (num_ranges == 0) {
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   687
        StringTable::ignore_shared_strings(true);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   688
        return true; // no shared string data
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   689
      }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   690
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   691
      // Check that ranges are within the java heap
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   692
      if (!G1CollectedHeap::heap()->check_archive_addresses(string_ranges, num_ranges)) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   693
        fail_continue("Unable to allocate shared string space: range is not "
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   694
                      "within java heap.");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   695
        return false;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   696
      }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   697
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   698
      // allocate from java heap
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   699
      if (!G1CollectedHeap::heap()->alloc_archive_regions(string_ranges, num_ranges)) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   700
        fail_continue("Unable to allocate shared string space: range is "
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   701
                      "already in use.");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   702
        return false;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   703
      }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   704
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   705
      // Map the string data. No need to call MemTracker::record_virtual_memory_type()
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   706
      // for mapped string regions as they are part of the reserved java heap, which
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   707
      // is already recorded.
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   708
      for (int i = 0; i < num_ranges; i++) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   709
        si = &_header->_space[MetaspaceShared::first_string + i];
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   710
        char* addr = (char*)string_ranges[i].start();
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   711
        char* base = os::map_memory(_fd, _full_path, si->_file_offset,
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   712
                                    addr, string_ranges[i].byte_size(), si->_read_only,
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   713
                                    si->_allow_exec);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   714
        if (base == NULL || base != addr) {
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   715
          // dealloc the string regions from java heap
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   716
          dealloc_string_regions();
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   717
          fail_continue("Unable to map shared string space at required address.");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   718
          return false;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   719
        }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   720
      }
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   721
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   722
      if (!verify_string_regions()) {
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   723
        // dealloc the string regions from java heap
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   724
        dealloc_string_regions();
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   725
        fail_continue("Shared string regions are corrupt");
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   726
        return false;
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   727
      }
31362
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   728
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   729
      // the shared string data is mapped successfully
8957ccbb5821 8098821: Crash in system dictionary initialization with shared strings
coleenp
parents: 31345
diff changeset
   730
      return true;
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   731
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   732
  } else {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   733
    if (PrintSharedSpaces && _header->_space[MetaspaceShared::first_string]._used > 0) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   734
      tty->print_cr("Shared string data from the CDS archive is being ignored. UseG1GC, "
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   735
                    "UseCompressedOops and UseCompressedClassPointers are required.");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   736
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   737
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   738
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   739
  // if we get here, the shared string data is not mapped
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   740
  assert(string_ranges == NULL && num_ranges == 0, "sanity");
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   741
  StringTable::ignore_shared_strings(true);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   742
#endif
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   743
  return true;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   744
}
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   745
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   746
bool FileMapInfo::verify_string_regions() {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   747
  for (int i = MetaspaceShared::first_string;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   748
           i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   749
    if (!verify_region_checksum(i)) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   750
      return false;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   751
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   752
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   753
  return true;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   754
}
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   755
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   756
void FileMapInfo::fixup_string_regions() {
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   757
#if INCLUDE_ALL_GCS
31360
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   758
  // If any string regions were found, call the fill routine to make them parseable.
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   759
  // Note that string_ranges may be non-NULL even if no ranges were found.
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   760
  if (num_ranges != 0) {
87d3a62c7e35 8098815: Assertion failure in CDS shared string archive support on Windows
iklam
parents: 31345
diff changeset
   761
    assert(string_ranges != NULL, "Null string_ranges array with non-zero count");
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   762
    G1CollectedHeap::heap()->fill_archive_regions(string_ranges, num_ranges);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   763
  }
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   764
#endif
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   765
}
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   766
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   767
bool FileMapInfo::verify_region_checksum(int i) {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   768
  if (!VerifySharedSpaces) {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   769
    return true;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   770
  }
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   771
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   772
  size_t sz = _header->_space[i]._used;
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   773
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   774
  if (sz == 0) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   775
    return true; // no data
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   776
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   777
  if (MetaspaceShared::is_string_region(i) && StringTable::shared_string_ignored()) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   778
    return true; // shared string data are not mapped
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   779
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   780
  const char* buf = _header->region_addr(i);
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   781
  int crc = ClassLoader::crc32(0, buf, (jint)sz);
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   782
  if (crc != _header->_space[i]._crc) {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   783
    fail_continue("Checksum verification failed.");
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   784
    return false;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   785
  }
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   786
  return true;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   787
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
// Unmap a memory region in the address space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
void FileMapInfo::unmap_region(int i) {
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   792
  assert(!MetaspaceShared::is_string_region(i), "sanity");
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   793
  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  size_t used = si->_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  size_t size = align_size_up(used, os::vm_allocation_granularity());
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   796
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   797
  if (used == 0) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   798
    return;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   799
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   800
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   801
  char* addr = _header->region_addr(i);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   802
  if (!os::unmap_memory(addr, size)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    fail_stop("Unable to unmap shared space.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   807
// dealloc the archived string region from java heap
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   808
void FileMapInfo::dealloc_string_regions() {
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   809
#if INCLUDE_ALL_GCS
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   810
  if (num_ranges > 0) {
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   811
    assert(string_ranges != NULL, "Null string_ranges array with non-zero count");
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   812
    G1CollectedHeap::heap()->dealloc_archive_regions(string_ranges, num_ranges);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   813
  }
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   814
#endif
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   815
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
void FileMapInfo::assert_mark(bool check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  if (!check) {
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   819
    fail_stop("Mark mismatch while restoring from shared file.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
FileMapInfo* FileMapInfo::_current_info = NULL;
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   825
SharedClassPathEntry* FileMapInfo::_classpath_entry_table = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   826
int FileMapInfo::_classpath_entry_table_size = 0;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   827
size_t FileMapInfo::_classpath_entry_size = 0x1234baad;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   828
bool FileMapInfo::_validating_classpath_entry_table = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
// Open the shared archive file, read and validate the header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
// information (version, boot classpath, etc.).  If initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
// fails, shared spaces are disabled and the file is closed. [See
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
// fail_continue.]
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   834
//
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   835
// Validation of the archive is done in two steps:
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   836
//
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   837
// [1] validate_header() - done here. This checks the header, including _paths_misc_info.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   838
// [2] validate_classpath_entry_table - this is done later, because the table is in the RW
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   839
//     region of the archive, which is not mapped yet.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
bool FileMapInfo::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  assert(UseSharedSpaces, "UseSharedSpaces expected.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  if (!open_for_read()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  init_from_file(_fd);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   848
  if (!validate_header()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   852
  SharedReadOnlySize =  _header->_space[0]._capacity;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   853
  SharedReadWriteSize = _header->_space[1]._capacity;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   854
  SharedMiscDataSize =  _header->_space[2]._capacity;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   855
  SharedMiscCodeSize =  _header->_space[3]._capacity;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   859
char* FileMapInfo::FileMapHeader::region_addr(int idx) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   860
  if (MetaspaceShared::is_string_region(idx)) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   861
    return (char*)((void*)oopDesc::decode_heap_oop_not_null(
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   862
              (narrowOop)_space[idx]._addr._offset));
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   863
  } else {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   864
    return _space[idx]._addr._base;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   865
  }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   866
}
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   867
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   868
int FileMapInfo::FileMapHeader::compute_crc() {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   869
  char* header = data();
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   870
  // start computing from the field after _crc
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   871
  char* buf = (char*)&_crc + sizeof(int);
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   872
  size_t sz = data_size() - (buf - header);
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   873
  int crc = ClassLoader::crc32(0, buf, (jint)sz);
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   874
  return crc;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   875
}
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   876
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   877
bool FileMapInfo::FileMapHeader::validate() {
27025
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   878
  if (VerifySharedSpaces && compute_crc() != _crc) {
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   879
    fail_continue("Header checksum verification failed.");
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   880
    return false;
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   881
  }
f4805f778f16 8044269: Analysis of archive files.
jiangli
parents: 26296
diff changeset
   882
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   883
  if (Arguments::patch_dirs() != NULL) {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   884
    FileMapInfo::fail_continue("The shared archive file cannot be used with -Xpatch.");
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   885
    return false;
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   886
  }
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36364
diff changeset
   887
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   888
  if (_version != current_version()) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   889
    FileMapInfo::fail_continue("The shared archive file is the wrong version.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  }
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   892
  if (_magic != (int)0xf00baba2) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   893
    FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  }
14577
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   896
  char header_version[JVM_IDENT_MAX];
fd68d810d86b 6924920: Class Data Sharing limit on the java version string can create failures
hseigel
parents: 14120
diff changeset
   897
  get_header_version(header_version);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   898
  if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
36364
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   899
    log_info(classpath)("expected: %s", header_version);
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   900
    log_info(classpath)("actual:   %s", _jvm_ident);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   901
    FileMapInfo::fail_continue("The shared archive file was created by a different"
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   902
                  " version or build of HotSpot");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  }
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   905
  if (_obj_alignment != ObjectAlignmentInBytes) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   906
    FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   907
                  " does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".",
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   908
                  _obj_alignment, ObjectAlignmentInBytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  }
33628
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   911
  if (_compact_strings != CompactStrings) {
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   912
    FileMapInfo::fail_continue("The shared archive file's CompactStrings setting (%s)"
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   913
                  " does not equal the current CompactStrings setting (%s).",
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   914
                  _compact_strings ? "enabled" : "disabled",
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   915
                  CompactStrings   ? "enabled" : "disabled");
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   916
    return false;
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 33148
diff changeset
   917
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   922
bool FileMapInfo::validate_header() {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   923
  bool status = _header->validate();
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   924
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   925
  if (status) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   926
    if (!ClassLoader::check_shared_paths_misc_info(_paths_misc_info, _header->_paths_misc_info_size)) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   927
      if (!PrintSharedArchiveAndExit) {
36364
5971776598e5 8150103: Convert TraceClassPaths to Unified Logging
mockner
parents: 35917
diff changeset
   928
        fail_continue("shared class paths mismatch (hint: enable -Xlog:classpath=info to diagnose the failure)");
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   929
        status = false;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   930
      }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   931
    }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   932
  }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   933
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   934
  if (_paths_misc_info != NULL) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27025
diff changeset
   935
    FREE_C_HEAP_ARRAY(char, _paths_misc_info);
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   936
    _paths_misc_info = NULL;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   937
  }
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   938
  return status;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   939
}
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   940
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
// The following method is provided to see whether a given pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
// falls in the mapped shared space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
// Param:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
// p, The given pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
// Return:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
// True if the p is within the mapped shared space, otherwise, false.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
bool FileMapInfo::is_in_shared_space(const void* p) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7405
diff changeset
   948
  for (int i = 0; i < MetaspaceShared::n_regions; i++) {
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   949
    char *base;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   950
    if (MetaspaceShared::is_string_region(i) && _header->_space[i]._used == 0) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   951
      continue;
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   952
    }
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   953
    base = _header->region_addr(i);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   954
    if (p >= base && p < base + _header->_space[i]._used) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
}
18483
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   961
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   962
// Check if a given address is within one of the shared regions (ro, rw, md, mc)
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   963
bool FileMapInfo::is_in_shared_region(const void* p, int idx) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   964
  assert((idx >= MetaspaceShared::ro) && (idx <= MetaspaceShared::mc), "invalid region index");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   965
  char* base = _header->region_addr(idx);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   966
  if (p >= base && p < base + _header->_space[idx]._used) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   967
    return true;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   968
  }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   969
  return false;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   970
}
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   971
18483
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   972
void FileMapInfo::print_shared_spaces() {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34659
diff changeset
   973
  tty->print_cr("Shared Spaces:");
18483
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   974
  for (int i = 0; i < MetaspaceShared::n_regions; i++) {
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25715
diff changeset
   975
    struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   976
    char *base = _header->region_addr(i);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34659
diff changeset
   977
    tty->print("  %s " INTPTR_FORMAT "-" INTPTR_FORMAT,
18483
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   978
                        shared_region_name[i],
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 32589
diff changeset
   979
                        p2i(base), p2i(base + si->_used));
18483
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   980
  }
c021907fa0a7 8016075: Win32 crash with CDS enabled and small heap size
iklam
parents: 17109
diff changeset
   981
}
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   982
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   983
// Unmap mapped regions of shared space.
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   984
void FileMapInfo::stop_sharing_and_unmap(const char* msg) {
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   985
  FileMapInfo *map_info = FileMapInfo::current_info();
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   986
  if (map_info) {
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   987
    map_info->fail_continue("%s", msg);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   988
    for (int i = 0; i < MetaspaceShared::num_non_strings; i++) {
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   989
      char *addr = map_info->_header->region_addr(i);
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   990
      if (addr != NULL && !MetaspaceShared::is_string_region(i)) {
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   991
        map_info->unmap_region(i);
31345
1bba15125d8d 8015086: add interned strings to the shared archive.
jiangli
parents: 31332
diff changeset
   992
        map_info->_header->_space[i]._addr._base = NULL;
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   993
      }
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   994
    }
32589
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   995
    // Dealloc the string regions only without unmapping. The string regions are part
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   996
    // of the java heap. Unmapping of the heap regions are managed by GC.
f86fb16fcab0 8131734: assert(!is_null(v)) failed: narrow klass value can never be zero with -Xshared:auto
jiangli
parents: 31375
diff changeset
   997
    map_info->dealloc_string_regions();
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
   998
  } else if (DumpSharedSpaces) {
26296
fd6180a0e0ab 8055754: filemap.cpp does not compile with clang
sla
parents: 26135
diff changeset
   999
    fail_stop("%s", msg);
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
  1000
  }
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18483
diff changeset
  1001
}