src/hotspot/share/gc/z/zMarkStackAllocator.cpp
author eosterlund
Tue, 12 Nov 2019 20:01:23 +0000
changeset 59039 c60978f87d45
parent 52653 ec92cbf2152b
child 59249 29b0d0b61615
permissions -rw-r--r--
8233797: ZGC: Unify naming convention for functions using atomics Reviewed-by: pliden, stefank
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51395
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     1
/*
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     4
 *
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     8
 *
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    13
 * accompanied this code).
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    14
 *
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    18
 *
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    21
 * questions.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    22
 */
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    23
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    24
#include "precompiled.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    25
#include "gc/z/zLock.inline.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    26
#include "gc/z/zMarkStack.inline.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    27
#include "gc/z/zMarkStackAllocator.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    28
#include "logging/log.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    29
#include "runtime/atomic.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    30
#include "runtime/os.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    31
#include "utilities/debug.hpp"
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    32
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    33
uintptr_t ZMarkStackSpaceStart;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    34
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    35
ZMarkStackSpace::ZMarkStackSpace() :
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    36
    _expand_lock(),
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    37
    _start(0),
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    38
    _top(0),
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    39
    _end(0) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    40
  assert(ZMarkStackSpaceLimit >= ZMarkStackSpaceExpandSize, "ZMarkStackSpaceLimit too small");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    41
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    42
  // Reserve address space
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    43
  const size_t size = ZMarkStackSpaceLimit;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    44
  const size_t alignment = (size_t)os::vm_allocation_granularity();
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    45
  const uintptr_t addr = (uintptr_t)os::reserve_memory(size, NULL, alignment, mtGC);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    46
  if (addr == 0) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    47
    log_error(gc, marking)("Failed to reserve address space for mark stacks");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    48
    return;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    49
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    50
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    51
  // Successfully initialized
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    52
  _start = _top = _end = addr;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    53
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    54
  // Register mark stack space start
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    55
  ZMarkStackSpaceStart = _start;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    56
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    57
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    58
bool ZMarkStackSpace::is_initialized() const {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    59
  return _start != 0;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    60
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    61
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    62
uintptr_t ZMarkStackSpace::alloc_space(size_t size) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    63
  uintptr_t top = Atomic::load(&_top);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    64
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    65
  for (;;) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    66
    const uintptr_t end = Atomic::load(&_end);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    67
    const uintptr_t new_top = top + size;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    68
    if (new_top > end) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    69
      // Not enough space left
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    70
      return 0;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    71
    }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    72
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    73
    const uintptr_t prev_top = Atomic::cmpxchg(new_top, &_top, top);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    74
    if (prev_top == top) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    75
      // Success
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    76
      return top;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    77
    }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    78
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    79
    // Retry
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    80
    top = prev_top;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    81
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    82
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    83
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    84
uintptr_t ZMarkStackSpace::expand_and_alloc_space(size_t size) {
52653
ec92cbf2152b 8212748: ZGC: Add reentrant locking functionality
pliden
parents: 51395
diff changeset
    85
  ZLocker<ZLock> locker(&_expand_lock);
51395
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    86
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    87
  // Retry allocation before expanding
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    88
  uintptr_t addr = alloc_space(size);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    89
  if (addr != 0) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    90
    return addr;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    91
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    92
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    93
  // Check expansion limit
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    94
  const size_t expand_size = ZMarkStackSpaceExpandSize;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    95
  const size_t old_size = _end - _start;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    96
  const size_t new_size = old_size + expand_size;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    97
  if (new_size > ZMarkStackSpaceLimit) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    98
    // Expansion limit reached. This is a fatal error since we
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
    99
    // currently can't recover from running out of mark stack space.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   100
    fatal("Mark stack space exhausted. Use -XX:ZMarkStackSpaceLimit=<size> to increase the "
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   101
          "maximum number of bytes allocated for mark stacks. Current limit is " SIZE_FORMAT "M.",
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   102
          ZMarkStackSpaceLimit / M);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   103
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   104
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   105
  log_debug(gc, marking)("Expanding mark stack space: " SIZE_FORMAT "M->" SIZE_FORMAT "M",
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   106
                         old_size / M, new_size / M);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   107
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   108
  // Expand
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   109
  os::commit_memory_or_exit((char*)_end, expand_size, false /* executable */, "Mark stack space");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   110
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   111
  // Increment top before end to make sure another
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   112
  // thread can't steal out newly expanded space.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   113
  addr = Atomic::add(size, &_top) - size;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   114
  Atomic::add(expand_size, &_end);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   115
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   116
  return addr;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   117
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   118
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   119
uintptr_t ZMarkStackSpace::alloc(size_t size) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   120
  const uintptr_t addr = alloc_space(size);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   121
  if (addr != 0) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   122
    return addr;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   123
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   124
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   125
  return expand_and_alloc_space(size);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   126
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   127
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   128
ZMarkStackAllocator::ZMarkStackAllocator() :
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   129
    _freelist(),
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   130
    _space() {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   131
  guarantee(sizeof(ZMarkStack) == ZMarkStackSize, "Size mismatch");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   132
  guarantee(sizeof(ZMarkStackMagazine) <= ZMarkStackSize, "Size mismatch");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   133
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   134
  // Prime free list to avoid an immediate space
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   135
  // expansion when marking starts.
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   136
  if (_space.is_initialized()) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   137
    prime_freelist();
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   138
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   139
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   140
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   141
bool ZMarkStackAllocator::is_initialized() const {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   142
  return _space.is_initialized();
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   143
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   144
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   145
void ZMarkStackAllocator::prime_freelist() {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   146
  for (size_t size = 0; size < ZMarkStackSpaceExpandSize; size += ZMarkStackMagazineSize) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   147
    const uintptr_t addr = _space.alloc(ZMarkStackMagazineSize);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   148
    ZMarkStackMagazine* const magazine = create_magazine_from_space(addr, ZMarkStackMagazineSize);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   149
    free_magazine(magazine);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   150
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   151
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   152
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   153
ZMarkStackMagazine* ZMarkStackAllocator::create_magazine_from_space(uintptr_t addr, size_t size) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   154
  assert(is_aligned(size, ZMarkStackSize), "Invalid size");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   155
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   156
  // Use first stack as magazine
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   157
  ZMarkStackMagazine* const magazine = new ((void*)addr) ZMarkStackMagazine();
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   158
  for (size_t i = ZMarkStackSize; i < size; i += ZMarkStackSize) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   159
    ZMarkStack* const stack = new ((void*)(addr + i)) ZMarkStack();
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   160
    const bool success = magazine->push(stack);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   161
    assert(success, "Magazine should never get full");
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   162
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   163
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   164
  return magazine;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   165
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   166
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   167
ZMarkStackMagazine* ZMarkStackAllocator::alloc_magazine() {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   168
  // Try allocating from the free list first
59039
c60978f87d45 8233797: ZGC: Unify naming convention for functions using atomics
eosterlund
parents: 52653
diff changeset
   169
  ZMarkStackMagazine* const magazine = _freelist.pop();
51395
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   170
  if (magazine != NULL) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   171
    return magazine;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   172
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   173
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   174
  // Allocate new magazine
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   175
  const uintptr_t addr = _space.alloc(ZMarkStackMagazineSize);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   176
  if (addr == 0) {
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   177
    return NULL;
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   178
  }
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   179
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   180
  return create_magazine_from_space(addr, ZMarkStackMagazineSize);
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   181
}
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   182
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   183
void ZMarkStackAllocator::free_magazine(ZMarkStackMagazine* magazine) {
59039
c60978f87d45 8233797: ZGC: Unify naming convention for functions using atomics
eosterlund
parents: 52653
diff changeset
   184
  _freelist.push(magazine);
51395
f3cf91d5373f 8209376: ZGC: Move ZMarkStackAllocator into a separate file
pliden
parents:
diff changeset
   185
}