diff -r caf5eb7dd4a7 -r 882756847a04 hotspot/src/share/vm/memory/filemap.cpp --- a/hotspot/src/share/vm/memory/filemap.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/hotspot/src/share/vm/memory/filemap.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -205,11 +205,12 @@ // Dump shared spaces to file. -void FileMapInfo::write_space(int i, CompactibleSpace* space, bool read_only) { +void FileMapInfo::write_space(int i, Metaspace* space, bool read_only) { align_file_position(); + size_t used = space->used_words(Metaspace::NonClassType) * BytesPerWord; + size_t capacity = space->capacity_words(Metaspace::NonClassType) * BytesPerWord; struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[i]; - write_region(i, (char*)space->bottom(), space->used(), - space->capacity(), read_only, false); + write_region(i, (char*)space->bottom(), used, capacity, read_only, false); } @@ -223,8 +224,8 @@ if (_file_open) { guarantee(si->_file_offset == _file_offset, "file offset mismatch."); if (PrintSharedSpaces) { - tty->print_cr("Shared file region %d: 0x%x bytes, addr 0x%x," - " file offset 0x%x", region, size, base, _file_offset); + tty->print_cr("Shared file region %d: 0x%6x bytes, addr " INTPTR_FORMAT + " file offset 0x%6x", region, size, base, _file_offset); } } else { si->_file_offset = _file_offset; @@ -297,26 +298,6 @@ } -// Memory map a shared space from the archive file. - -bool FileMapInfo::map_space(int i, ReservedSpace rs, ContiguousSpace* space) { - struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[i]; - if (space != NULL) { - if (si->_base != (char*)space->bottom() || - si->_capacity != space->capacity()) { - fail_continue("Shared space base address does not match."); - return false; - } - } - bool result = (map_region(i, rs) != NULL); - if (space != NULL && result) { - space->set_top((HeapWord*)(si->_base + si->_used)); - space->set_saved_mark(); - } - return result; -} - - // JVM/TI RedefineClasses() support: // Remap the shared readonly space to shared readwrite, private. bool FileMapInfo::remap_shared_readonly_as_readwrite() { @@ -346,6 +327,25 @@ return true; } +// Map the whole region at once, assumed to be allocated contiguously. +ReservedSpace FileMapInfo::reserve_shared_memory() { + struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[0]; + char* requested_addr = si->_base; + size_t alignment = os::vm_allocation_granularity(); + + size_t size = align_size_up(SharedReadOnlySize + SharedReadWriteSize + + SharedMiscDataSize + SharedMiscCodeSize, + alignment); + + // Reserve the space first, then map otherwise map will go right over some + // other reserved memory (like the code cache). + ReservedSpace rs(size, alignment, false, requested_addr); + if (!rs.is_reserved()) { + fail_continue(err_msg("Unable to reserved shared space at required address " INTPTR_FORMAT, requested_addr)); + return rs; + } + return rs; +} // Memory map a region in the address space. @@ -358,35 +358,28 @@ ReservedSpace unmapped_rs = rs.last_part(size); mapped_rs.release(); - return map_region(i, true); + return map_region(i); } // Memory map a region in the address space. +static const char* shared_region_name[] = { "ReadOnly", "ReadWrite", "MiscData", "MiscCode"}; -char* FileMapInfo::map_region(int i, bool address_must_match) { +char* FileMapInfo::map_region(int i) { struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[i]; size_t used = si->_used; - size_t size = align_size_up(used, os::vm_allocation_granularity()); - char *requested_addr = 0; - if (address_must_match) { - requested_addr = si->_base; - } + size_t alignment = os::vm_allocation_granularity(); + size_t size = align_size_up(used, alignment); + char *requested_addr = si->_base; + + // map the contents of the CDS archive in this memory char *base = os::map_memory(_fd, _full_path, si->_file_offset, requested_addr, size, si->_read_only, si->_allow_exec); - if (base == NULL) { - fail_continue("Unable to map shared space."); + if (base == NULL || base != si->_base) { + fail_continue(err_msg("Unable to map %s shared space at required address.", shared_region_name[i])); return NULL; } - if (address_must_match) { - if (base != si->_base) { - fail_continue("Unable to map shared space at required address."); - return NULL; - } - } else { - si->_base = base; // save mapped address for unmapping. - } return base; } @@ -417,8 +410,6 @@ // information (version, boot classpath, etc.). If initialization // fails, shared spaces are disabled and the file is closed. [See // fail_continue.] - - bool FileMapInfo::initialize() { assert(UseSharedSpaces, "UseSharedSpaces expected."); @@ -518,7 +509,7 @@ // Return: // True if the p is within the mapped shared space, otherwise, false. bool FileMapInfo::is_in_shared_space(const void* p) { - for (int i = 0; i < CompactingPermGenGen::n_regions; i++) { + for (int i = 0; i < MetaspaceShared::n_regions; i++) { if (p >= _header._space[i]._base && p < _header._space[i]._base + _header._space[i]._used) { return true;