8012915: ReservedSpace::align_reserved_region() broken on Windows

Fri, 26 Apr 2013 09:53:22 +0200

author
brutisso
date
Fri, 26 Apr 2013 09:53:22 +0200
changeset 5019
b294421fa3c5
parent 5018
b06ac540229e
child 5020
2f50bc369470

8012915: ReservedSpace::align_reserved_region() broken on Windows
Summary: remove unused constructors and helper methods for ReservedHeapSpace and ReservedSpace
Reviewed-by: mgerdin, jmasa, johnc, tschatzl

src/share/vm/runtime/virtualspace.cpp file | annotate | diff | comparison | revisions
src/share/vm/runtime/virtualspace.hpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/runtime/virtualspace.cpp	Wed Apr 24 20:13:37 2013 +0200
     1.2 +++ b/src/share/vm/runtime/virtualspace.cpp	Fri Apr 26 09:53:22 2013 +0200
     1.3 @@ -60,72 +60,6 @@
     1.4    initialize(size, alignment, large, NULL, 0, executable);
     1.5  }
     1.6  
     1.7 -char *
     1.8 -ReservedSpace::align_reserved_region(char* addr, const size_t len,
     1.9 -                                     const size_t prefix_size,
    1.10 -                                     const size_t prefix_align,
    1.11 -                                     const size_t suffix_size,
    1.12 -                                     const size_t suffix_align)
    1.13 -{
    1.14 -  assert(addr != NULL, "sanity");
    1.15 -  const size_t required_size = prefix_size + suffix_size;
    1.16 -  assert(len >= required_size, "len too small");
    1.17 -
    1.18 -  const size_t s = size_t(addr);
    1.19 -  const size_t beg_ofs = (s + prefix_size) & (suffix_align - 1);
    1.20 -  const size_t beg_delta = beg_ofs == 0 ? 0 : suffix_align - beg_ofs;
    1.21 -
    1.22 -  if (len < beg_delta + required_size) {
    1.23 -     return NULL; // Cannot do proper alignment.
    1.24 -  }
    1.25 -  const size_t end_delta = len - (beg_delta + required_size);
    1.26 -
    1.27 -  if (beg_delta != 0) {
    1.28 -    os::release_memory(addr, beg_delta);
    1.29 -  }
    1.30 -
    1.31 -  if (end_delta != 0) {
    1.32 -    char* release_addr = (char*) (s + beg_delta + required_size);
    1.33 -    os::release_memory(release_addr, end_delta);
    1.34 -  }
    1.35 -
    1.36 -  return (char*) (s + beg_delta);
    1.37 -}
    1.38 -
    1.39 -char* ReservedSpace::reserve_and_align(const size_t reserve_size,
    1.40 -                                       const size_t prefix_size,
    1.41 -                                       const size_t prefix_align,
    1.42 -                                       const size_t suffix_size,
    1.43 -                                       const size_t suffix_align)
    1.44 -{
    1.45 -  assert(reserve_size > prefix_size + suffix_size, "should not be here");
    1.46 -
    1.47 -  char* raw_addr = os::reserve_memory(reserve_size, NULL, prefix_align);
    1.48 -  if (raw_addr == NULL) return NULL;
    1.49 -
    1.50 -  char* result = align_reserved_region(raw_addr, reserve_size, prefix_size,
    1.51 -                                       prefix_align, suffix_size,
    1.52 -                                       suffix_align);
    1.53 -  if (result == NULL && !os::release_memory(raw_addr, reserve_size)) {
    1.54 -    fatal("os::release_memory failed");
    1.55 -  }
    1.56 -
    1.57 -#ifdef ASSERT
    1.58 -  if (result != NULL) {
    1.59 -    const size_t raw = size_t(raw_addr);
    1.60 -    const size_t res = size_t(result);
    1.61 -    assert(res >= raw, "alignment decreased start addr");
    1.62 -    assert(res + prefix_size + suffix_size <= raw + reserve_size,
    1.63 -           "alignment increased end addr");
    1.64 -    assert((res & (prefix_align - 1)) == 0, "bad alignment of prefix");
    1.65 -    assert(((res + prefix_size) & (suffix_align - 1)) == 0,
    1.66 -           "bad alignment of suffix");
    1.67 -  }
    1.68 -#endif
    1.69 -
    1.70 -  return result;
    1.71 -}
    1.72 -
    1.73  // Helper method.
    1.74  static bool failed_to_reserve_as_requested(char* base, char* requested_address,
    1.75                                             const size_t size, bool special)
    1.76 @@ -155,92 +89,6 @@
    1.77    return true;
    1.78  }
    1.79  
    1.80 -ReservedSpace::ReservedSpace(const size_t suffix_size,
    1.81 -                             const size_t suffix_align,
    1.82 -                             char* requested_address,
    1.83 -                             const size_t noaccess_prefix)
    1.84 -{
    1.85 -  assert(suffix_size != 0, "sanity");
    1.86 -  assert(suffix_align != 0, "sanity");
    1.87 -  assert((suffix_size & (suffix_align - 1)) == 0,
    1.88 -    "suffix_size not divisible by suffix_align");
    1.89 -
    1.90 -  // Assert that if noaccess_prefix is used, it is the same as prefix_align.
    1.91 -  // Add in noaccess_prefix to prefix
    1.92 -  const size_t adjusted_prefix_size = noaccess_prefix;
    1.93 -  const size_t size = adjusted_prefix_size + suffix_size;
    1.94 -
    1.95 -  // On systems where the entire region has to be reserved and committed up
    1.96 -  // front, the compound alignment normally done by this method is unnecessary.
    1.97 -  const bool try_reserve_special = UseLargePages &&
    1.98 -    suffix_align == os::large_page_size();
    1.99 -  if (!os::can_commit_large_page_memory() && try_reserve_special) {
   1.100 -    initialize(size, suffix_align, true, requested_address, noaccess_prefix,
   1.101 -               false);
   1.102 -    return;
   1.103 -  }
   1.104 -
   1.105 -  _base = NULL;
   1.106 -  _size = 0;
   1.107 -  _alignment = 0;
   1.108 -  _special = false;
   1.109 -  _noaccess_prefix = 0;
   1.110 -  _executable = false;
   1.111 -
   1.112 -  // Optimistically try to reserve the exact size needed.
   1.113 -  char* addr;
   1.114 -  if (requested_address != 0) {
   1.115 -    requested_address -= noaccess_prefix; // adjust address
   1.116 -    assert(requested_address != NULL, "huge noaccess prefix?");
   1.117 -    addr = os::attempt_reserve_memory_at(size, requested_address);
   1.118 -    if (failed_to_reserve_as_requested(addr, requested_address, size, false)) {
   1.119 -      // OS ignored requested address. Try different address.
   1.120 -      addr = NULL;
   1.121 -    }
   1.122 -  } else {
   1.123 -    addr = os::reserve_memory(size, NULL, suffix_align);
   1.124 -  }
   1.125 -  if (addr == NULL) return;
   1.126 -
   1.127 -  // Check whether the result has the needed alignment
   1.128 -  const size_t ofs = (size_t(addr) + adjusted_prefix_size) & (suffix_align - 1);
   1.129 -  if (ofs != 0) {
   1.130 -    // Wrong alignment.  Release, allocate more space and do manual alignment.
   1.131 -    //
   1.132 -    // On most operating systems, another allocation with a somewhat larger size
   1.133 -    // will return an address "close to" that of the previous allocation.  The
   1.134 -    // result is often the same address (if the kernel hands out virtual
   1.135 -    // addresses from low to high), or an address that is offset by the increase
   1.136 -    // in size.  Exploit that to minimize the amount of extra space requested.
   1.137 -    if (!os::release_memory(addr, size)) {
   1.138 -      fatal("os::release_memory failed");
   1.139 -    }
   1.140 -
   1.141 -    const size_t extra = MAX2(ofs, suffix_align - ofs);
   1.142 -    addr = reserve_and_align(size + extra, adjusted_prefix_size, suffix_align,
   1.143 -                             suffix_size, suffix_align);
   1.144 -    if (addr == NULL) {
   1.145 -      // Try an even larger region.  If this fails, address space is exhausted.
   1.146 -      addr = reserve_and_align(size + suffix_align, adjusted_prefix_size,
   1.147 -                               suffix_align, suffix_size, suffix_align);
   1.148 -    }
   1.149 -
   1.150 -    if (requested_address != 0 &&
   1.151 -        failed_to_reserve_as_requested(addr, requested_address, size, false)) {
   1.152 -      // As a result of the alignment constraints, the allocated addr differs
   1.153 -      // from the requested address. Return back to the caller who can
   1.154 -      // take remedial action (like try again without a requested address).
   1.155 -      assert(_base == NULL, "should be");
   1.156 -      return;
   1.157 -    }
   1.158 -  }
   1.159 -
   1.160 -  _base = addr;
   1.161 -  _size = size;
   1.162 -  _alignment = suffix_align;
   1.163 -  _noaccess_prefix = noaccess_prefix;
   1.164 -}
   1.165 -
   1.166  void ReservedSpace::initialize(size_t size, size_t alignment, bool large,
   1.167                                 char* requested_address,
   1.168                                 const size_t noaccess_prefix,
   1.169 @@ -476,20 +324,6 @@
   1.170    protect_noaccess_prefix(size);
   1.171  }
   1.172  
   1.173 -ReservedHeapSpace::ReservedHeapSpace(const size_t heap_space_size,
   1.174 -                                     const size_t alignment,
   1.175 -                                     char* requested_address) :
   1.176 -  ReservedSpace(heap_space_size, alignment,
   1.177 -                requested_address,
   1.178 -                (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
   1.179 -                 Universe::narrow_oop_use_implicit_null_checks()) ?
   1.180 -                  lcm(os::vm_page_size(), alignment) : 0) {
   1.181 -  if (base() > 0) {
   1.182 -    MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap);
   1.183 -  }
   1.184 -  protect_noaccess_prefix(heap_space_size);
   1.185 -}
   1.186 -
   1.187  // Reserve space for code segment.  Same as Java heap only we mark this as
   1.188  // executable.
   1.189  ReservedCodeSpace::ReservedCodeSpace(size_t r_size,
     2.1 --- a/src/share/vm/runtime/virtualspace.hpp	Wed Apr 24 20:13:37 2013 +0200
     2.2 +++ b/src/share/vm/runtime/virtualspace.hpp	Fri Apr 26 09:53:22 2013 +0200
     2.3 @@ -47,28 +47,6 @@
     2.4                    const size_t noaccess_prefix,
     2.5                    bool executable);
     2.6  
     2.7 -  // Release parts of an already-reserved memory region [addr, addr + len) to
     2.8 -  // get a new region that has "compound alignment."  Return the start of the
     2.9 -  // resulting region, or NULL on failure.
    2.10 -  //
    2.11 -  // The region is logically divided into a prefix and a suffix.  The prefix
    2.12 -  // starts at the result address, which is aligned to prefix_align.  The suffix
    2.13 -  // starts at result address + prefix_size, which is aligned to suffix_align.
    2.14 -  // The total size of the result region is size prefix_size + suffix_size.
    2.15 -  char* align_reserved_region(char* addr, const size_t len,
    2.16 -                              const size_t prefix_size,
    2.17 -                              const size_t prefix_align,
    2.18 -                              const size_t suffix_size,
    2.19 -                              const size_t suffix_align);
    2.20 -
    2.21 -  // Reserve memory, call align_reserved_region() to alignment it and return the
    2.22 -  // result.
    2.23 -  char* reserve_and_align(const size_t reserve_size,
    2.24 -                          const size_t prefix_size,
    2.25 -                          const size_t prefix_align,
    2.26 -                          const size_t suffix_size,
    2.27 -                          const size_t suffix_align);
    2.28 -
    2.29   protected:
    2.30    // Create protection page at the beginning of the space.
    2.31    void protect_noaccess_prefix(const size_t size);
    2.32 @@ -79,9 +57,6 @@
    2.33    ReservedSpace(size_t size, size_t alignment, bool large,
    2.34                  char* requested_address = NULL,
    2.35                  const size_t noaccess_prefix = 0);
    2.36 -  ReservedSpace(const size_t suffix_size, const size_t suffix_align,
    2.37 -                char* requested_address,
    2.38 -                const size_t noaccess_prefix = 0);
    2.39    ReservedSpace(size_t size, size_t alignment, bool large, bool executable);
    2.40  
    2.41    // Accessors
    2.42 @@ -128,8 +103,6 @@
    2.43    // Constructor
    2.44    ReservedHeapSpace(size_t size, size_t forced_base_alignment,
    2.45                      bool large, char* requested_address);
    2.46 -  ReservedHeapSpace(const size_t prefix_size, const size_t prefix_align,
    2.47 -                    char* requested_address);
    2.48  };
    2.49  
    2.50  // Class encapsulating behavior specific memory space for Code

mercurial