0
|
1 /*
|
|
2 * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 *
|
|
5 * This code is free software; you can redistribute it and/or modify it
|
|
6 * under the terms of the GNU General Public License version 2 only, as
|
|
7 * published by the Free Software Foundation.
|
|
8 *
|
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 * version 2 for more details (a copy is included in the LICENSE file that
|
|
13 * accompanied this code).
|
|
14 *
|
|
15 * You should have received a copy of the GNU General Public License version
|
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 *
|
|
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
20 * CA 95054 USA or visit www.sun.com if you need additional information or
|
|
21 * have any questions.
|
|
22 *
|
|
23 */
|
|
24
|
|
25 // Layout of the file:
|
|
26 // header: dump of archive instance plus versioning info, datestamp, etc.
|
|
27 // [magic # = 0xF00BABA2]
|
|
28 // ... padding to align on page-boundary
|
|
29 // read-write space from CompactingPermGenGen
|
|
30 // read-only space from CompactingPermGenGen
|
|
31 // misc data (block offset table, string table, symbols, dictionary, etc.)
|
|
32 // tag(666)
|
|
33
|
|
34 static const int JVM_SHARED_JARS_MAX = 128;
|
|
35 static const int JVM_SPACENAME_MAX = 128;
|
|
36 static const int JVM_IDENT_MAX = 256;
|
|
37 static const int JVM_ARCH_MAX = 12;
|
|
38
|
|
39
|
|
40
|
|
41 class FileMapInfo : public CHeapObj {
|
|
42 private:
|
|
43 enum {
|
|
44 _invalid_version = -1,
|
|
45 _current_version = 1
|
|
46 };
|
|
47
|
|
48 bool _file_open;
|
|
49 int _fd;
|
|
50 long _file_offset;
|
|
51
|
|
52 // FileMapHeader describes the shared space data in the file to be
|
|
53 // mapped. This structure gets written to a file. It is not a class, so
|
|
54 // that the compilers don't add any compiler-private data to it.
|
|
55
|
|
56 struct FileMapHeader {
|
|
57 int _magic; // identify file type.
|
|
58 int _version; // (from enum, above.)
|
|
59 size_t _alignment; // how shared archive should be aligned
|
|
60
|
|
61 struct space_info {
|
|
62 int _file_offset; // sizeof(this) rounded to vm page size
|
|
63 char* _base; // copy-on-write base address
|
|
64 size_t _capacity; // for validity checking
|
|
65 size_t _used; // for setting space top on read
|
|
66 bool _read_only; // read only space?
|
|
67 bool _allow_exec; // executable code in space?
|
|
68 } _space[CompactingPermGenGen::n_regions];
|
|
69
|
|
70 // The following fields are all sanity checks for whether this archive
|
|
71 // will function correctly with this JVM and the bootclasspath it's
|
|
72 // invoked with.
|
|
73 char _arch[JVM_ARCH_MAX]; // architecture
|
|
74 char _jvm_ident[JVM_IDENT_MAX]; // identifier for jvm
|
|
75 int _num_jars; // Number of jars in bootclasspath
|
|
76
|
|
77 // Per jar file data: timestamp, size.
|
|
78
|
|
79 struct {
|
|
80 time_t _timestamp; // jar timestamp.
|
|
81 long _filesize; // jar file size.
|
|
82 } _jar[JVM_SHARED_JARS_MAX];
|
|
83 } _header;
|
|
84 const char* _full_path;
|
|
85
|
|
86 static FileMapInfo* _current_info;
|
|
87
|
|
88 bool init_from_file(int fd);
|
|
89 void align_file_position();
|
|
90
|
|
91 public:
|
|
92 FileMapInfo() {
|
|
93 _file_offset = 0;
|
|
94 _file_open = false;
|
|
95 _header._version = _invalid_version;
|
|
96 }
|
|
97
|
|
98 static int current_version() { return _current_version; }
|
|
99 void populate_header(size_t alignment);
|
|
100 bool validate();
|
|
101 void invalidate();
|
|
102 int version() { return _header._version; }
|
|
103 size_t alignment() { return _header._alignment; }
|
|
104 size_t space_capacity(int i) { return _header._space[i]._capacity; }
|
|
105 char* region_base(int i) { return _header._space[i]._base; }
|
|
106 struct FileMapHeader* header() { return &_header; }
|
|
107
|
|
108 static void set_current_info(FileMapInfo* info) { _current_info = info; }
|
|
109 static FileMapInfo* current_info() { return _current_info; }
|
|
110 static void assert_mark(bool check);
|
|
111
|
|
112 // File manipulation.
|
|
113 bool initialize();
|
|
114 bool open_for_read();
|
|
115 void open_for_write();
|
|
116 void write_header();
|
|
117 void write_space(int i, CompactibleSpace* space, bool read_only);
|
|
118 void write_region(int region, char* base, size_t size,
|
|
119 size_t capacity, bool read_only, bool allow_exec);
|
|
120 void write_bytes(const void* buffer, int count);
|
|
121 void write_bytes_aligned(const void* buffer, int count);
|
|
122 bool map_space(int i, ReservedSpace rs, ContiguousSpace *space);
|
|
123 char* map_region(int i, ReservedSpace rs);
|
|
124 char* map_region(int i, bool address_must_match);
|
|
125 void unmap_region(int i);
|
|
126 void close();
|
|
127 bool is_open() { return _file_open; }
|
|
128
|
|
129 // JVM/TI RedefineClasses() support:
|
|
130 // Remap the shared readonly space to shared readwrite, private.
|
|
131 bool remap_shared_readonly_as_readwrite();
|
|
132
|
|
133 // Errors.
|
|
134 static void fail_stop(const char *msg, ...);
|
|
135 void fail_continue(const char *msg, ...);
|
|
136
|
|
137 // Return true if given address is in the mapped shared space.
|
|
138 bool is_in_shared_space(const void* p);
|
|
139 };
|