src/hotspot/share/jfr/recorder/storage/jfrMemorySpace.inline.hpp
author mgronlun
Sat, 24 Aug 2019 14:30:27 +0200
branchJEP-349-branch
changeset 57870 00860d9caf4d
parent 57360 5d043a159d5c
child 58154 060d9d139109
permissions -rw-r--r--
New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50113
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50113
diff changeset
    25
#ifndef SHARE_JFR_RECORDER_STORAGE_JFRMEMORYSPACE_INLINE_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50113
diff changeset
    26
#define SHARE_JFR_RECORDER_STORAGE_JFRMEMORYSPACE_INLINE_HPP
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/recorder/storage/jfrMemorySpace.hpp"
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    29
#include "runtime/os.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
JfrMemorySpace<T, RetrievalType, Callback>::
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
JfrMemorySpace(size_t min_elem_size, size_t limit_size, size_t cache_count, Callback* callback) :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
  _free(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
  _full(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
  _min_elem_size(min_elem_size),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
  _limit_size(limit_size),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
  _cache_count(cache_count),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
  _callback(callback) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
JfrMemorySpace<T, RetrievalType, Callback>::~JfrMemorySpace() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
  Iterator full_iter(_full);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  while (full_iter.has_next()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
    Type* t = full_iter.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
    _full.remove(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  Iterator free_iter(_free);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  while (free_iter.has_next()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
    Type* t = free_iter.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
    _free.remove(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
bool JfrMemorySpace<T, RetrievalType, Callback>::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  assert(_min_elem_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  assert(_limit_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  // pre-allocate cache elements
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
  for (size_t i = 0; i < _cache_count; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
    Type* const t = allocate(_min_elem_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    if (t == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    insert_free_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
  assert(_free.count() == _cache_count, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    73
// allocations are even multiples of the mspace min size
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    74
static inline size_t align_allocation_size(size_t requested_size, size_t min_elem_size) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    75
  assert((int)min_elem_size % os::vm_page_size() == 0, "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    76
  u8 alloc_size_bytes = min_elem_size;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    77
  while (requested_size > alloc_size_bytes) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    78
    alloc_size_bytes <<= 1;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    79
  }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    80
  assert((int)alloc_size_bytes % os::vm_page_size() == 0, "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    81
  return (size_t)alloc_size_bytes;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    82
}
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    83
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    84
template <typename T, template <typename> class RetrievalType, typename Callback>
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    85
inline T* JfrMemorySpace<T, RetrievalType, Callback>::allocate(size_t size) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    86
  const size_t aligned_size_bytes = align_allocation_size(size, _min_elem_size);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    87
  void* const allocation = JfrCHeapObj::new_array<u1>(aligned_size_bytes + sizeof(T));
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    88
  if (allocation == NULL) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    89
    return NULL;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    90
  }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    91
  T* const t = new (allocation) T;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    92
  assert(t != NULL, "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    93
  if (!t->initialize(sizeof(T), aligned_size_bytes)) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    94
    JfrCHeapObj::free(t, aligned_size_bytes + sizeof(T));
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    95
    return NULL;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    96
  }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    97
  return t;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    98
}
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    99
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   100
template <typename T, template <typename> class RetrievalType, typename Callback>
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   101
inline void JfrMemorySpace<T, RetrievalType, Callback>::deallocate(T* t) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   102
  assert(t != NULL, "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   103
  assert(!_free.in_list(t), "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   104
  assert(!_full.in_list(t), "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   105
  assert(t != NULL, "invariant");
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   106
  JfrCHeapObj::free(t, t->total_size());
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   107
}
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   108
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
inline void JfrMemorySpace<T, RetrievalType, Callback>::release_full(T* t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
  assert(is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
  assert(t != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  assert(_full.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  remove_full(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
  assert(!_full.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
  if (t->transient()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  assert(t->empty(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  assert(!t->retired(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
  assert(t->identity() == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
  if (should_populate_cache()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    assert(!_free.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    insert_free_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
  } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
inline void JfrMemorySpace<T, RetrievalType, Callback>::release_free(T* t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  assert(is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  assert(t != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  assert(_free.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  if (t->transient()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
    remove_free(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
    assert(!_free.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  assert(t->empty(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  assert(!t->retired(), "invariant");
57360
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   144
  assert(!t->excluded(), "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  assert(t->identity() == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  if (!should_populate_cache()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
    remove_free(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
    assert(!_free.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
    deallocate(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
template <typename T, template <typename> class RetrievalType, typename Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
template <typename IteratorCallback, typename IteratorType>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
inline void JfrMemorySpace<T, RetrievalType, Callback>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
::iterate(IteratorCallback& callback, bool full, jfr_iter_direction direction) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  IteratorType iterator(full ? _full : _free, direction);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  while (iterator.has_next()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
    callback.process(iterator.next());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   163
template <typename Mspace, typename Callback>
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   164
static inline Mspace* create_mspace(size_t buffer_size, size_t limit, size_t cache_count, Callback* cb) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   165
  Mspace* const mspace = new Mspace(buffer_size, limit, cache_count, cb);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   166
  if (mspace != NULL) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   167
    mspace->initialize();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   168
  }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   169
  return mspace;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   170
}
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   171
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
inline size_t size_adjustment(size_t size, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
  assert(mspace != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
  static const size_t min_elem_size = mspace->min_elem_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
  if (size < min_elem_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
    size = min_elem_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  return size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
inline typename Mspace::Type* mspace_allocate(size_t size, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
  return mspace->allocate(size_adjustment(size, mspace));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
inline typename Mspace::Type* mspace_allocate_acquired(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
  typename Mspace::Type* const t = mspace_allocate(size, mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
  t->acquire(thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
inline typename Mspace::Type* mspace_allocate_transient(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  typename Mspace::Type* const t = mspace_allocate_acquired(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
  assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
  t->set_transient();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
inline typename Mspace::Type* mspace_allocate_transient_lease(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  typename Mspace::Type* const t = mspace_allocate_transient(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  assert(t->transient(), "invaiant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  t->set_lease();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
inline typename Mspace::Type* mspace_allocate_to_full(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
  assert(mspace->is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
  typename Mspace::Type* const t = mspace_allocate_acquired(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
  mspace->insert_full_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
template <typename Mspace>
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   224
class MspaceLock {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   225
 private:
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   226
  Mspace* _mspace;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   227
 public:
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   228
  MspaceLock(Mspace* mspace) : _mspace(mspace) { _mspace->lock(); }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   229
  ~MspaceLock() { _mspace->unlock(); }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   230
};
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   231
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   232
template <typename Mspace>
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
inline typename Mspace::Type* mspace_allocate_transient_to_full(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
  typename Mspace::Type* const t = mspace_allocate_transient(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
  mspace->insert_full_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
inline typename Mspace::Type* mspace_allocate_transient_lease_to_full(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  typename Mspace::Type* const t = mspace_allocate_transient_lease(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
  assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
  assert(t->transient(), "invaiant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
  assert(t->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
  mspace->insert_full_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
inline typename Mspace::Type* mspace_allocate_transient_lease_to_free(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
  typename Mspace::Type* const t = mspace_allocate_transient_lease(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
  if (t == NULL) return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
  assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
  assert(t->transient(), "invaiant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
  assert(t->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
  mspace->insert_free_head(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
inline typename Mspace::Type* mspace_get_free(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
  return mspace->get(size, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
inline typename Mspace::Type* mspace_get_free_with_retry(size_t size, Mspace* mspace, size_t retry_count, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
  assert(size <= mspace->min_elem_size(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  for (size_t i = 0; i < retry_count; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
    typename Mspace::Type* const t = mspace_get_free(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
    if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
      return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
  return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
inline typename Mspace::Type* mspace_get_free_with_detach(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
  typename Mspace::Type* t = mspace_get_free(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
  if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
    mspace->remove_free(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
inline typename Mspace::Type* mspace_get_free_to_full(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
  assert(size <= mspace->min_elem_size(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
  assert(mspace->is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
  typename Mspace::Type* t = mspace_get_free(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
  if (t == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
  assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
  move_to_head(t, mspace->free(), mspace->full());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
inline typename Mspace::Type* mspace_get_to_full(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
  size = size_adjustment(size, mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
  if (size <= mspace->min_elem_size()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
    typename Mspace::Type* const t = mspace_get_free_to_full(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
    if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
      return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
  return mspace_allocate_to_full(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
inline typename Mspace::Type* mspace_get_free_lease_with_retry(size_t size, Mspace* mspace, size_t retry_count, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
  typename Mspace::Type* t = mspace_get_free_with_retry(size, mspace, retry_count, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
  if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
    t->set_lease();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
inline typename Mspace::Type* mspace_get_lease(size_t size, Mspace* mspace, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
  typename Mspace::Type* t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
  t = mspace_get_free_lease(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
  if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
    assert(t->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
    assert(t->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
    return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
  t = mspace_allocate_transient_to_full(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
  if (t != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
    t->set_lease();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
  return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
inline void mspace_release_full(typename Mspace::Type* t, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
  assert(t != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
  assert(t->unflushed_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
  assert(mspace != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
  assert(mspace->is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
  mspace->release_full(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
inline void mspace_release_free(typename Mspace::Type* t, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
  assert(t != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
  assert(t->unflushed_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
  assert(mspace != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
  assert(mspace->is_locked(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
  mspace->release_free(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
inline void mspace_release_full_critical(typename Mspace::Type* t, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
  mspace_release_full(t, mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
template <typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
inline void mspace_release_free_critical(typename Mspace::Type* t, Mspace* mspace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
  MspaceLock<Mspace> lock(mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
  mspace_release_free(t, mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
template <typename List>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
inline void move_to_head(typename List::Node* t, List& from, List& to) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
  assert(from.in_list(t), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
  to.prepend(from.remove(t));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
template <typename Processor, typename Mspace, typename Iterator>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
inline void process_free_list_iterator_control(Processor& processor, Mspace* mspace, jfr_iter_direction direction = forward) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
  mspace->template iterate<Processor, Iterator>(processor, false, direction);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
template <typename Processor, typename Mspace, typename Iterator>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
inline void process_full_list_iterator_control(Processor& processor, Mspace* mspace, jfr_iter_direction direction = forward) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
  mspace->template iterate<Processor, Iterator>(processor, true, direction);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
template <typename Processor, typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
inline void process_full_list(Processor& processor, Mspace* mspace, jfr_iter_direction direction = forward) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
  assert(mspace != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
  if (mspace->is_full_empty()) return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
  process_full_list_iterator_control<Processor, Mspace, typename Mspace::Iterator>(processor, mspace, direction);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
template <typename Processor, typename Mspace>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
inline void process_free_list(Processor& processor, Mspace* mspace, jfr_iter_direction direction = forward) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
  assert(mspace != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
  assert(mspace->has_free(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
  process_free_list_iterator_control<Processor, Mspace, typename Mspace::Iterator>(processor, mspace, direction);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
template <typename Mspace>
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   403
class ReleaseOp : public StackObj {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   404
 private:
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   405
  Mspace* _mspace;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   406
  Thread* _thread;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   407
  bool _release_full;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   408
 public:
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   409
  typedef typename Mspace::Type Type;
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   410
  ReleaseOp(Mspace* mspace, Thread* thread, bool release_full = true) :
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   411
    _mspace(mspace), _thread(thread), _release_full(release_full) {}
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   412
  bool process(Type* t);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   413
  size_t processed() const { return 0; }
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   414
};
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   415
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   416
template <typename Mspace>
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
inline bool ReleaseOp<Mspace>::process(typename Mspace::Type* t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
  assert(t != NULL, "invariant");
57360
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   419
  // assumes some means of exclusive access to t
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   420
  if (t->transient()) {
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   421
    if (_release_full) {
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   422
      mspace_release_full_critical(t, _mspace);
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   423
    } else {
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   424
      mspace_release_free_critical(t, _mspace);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
    }
57360
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   426
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
  }
57360
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   428
  t->reinitialize();
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   429
  assert(t->empty(), "invariant");
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   430
  assert(!t->retired(), "invariant");
5d043a159d5c Preview
egahlin
parents: 53244
diff changeset
   431
  t->release(); // publish
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
template <typename T>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
inline void assert_migration_state(const T* old, const T* new_buffer, size_t used, size_t requested) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   438
  assert(old != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   439
  assert(new_buffer != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   440
  assert(old->pos() >= old->start(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   441
  assert(old->pos() + used <= old->end(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   442
  assert(new_buffer->free_size() >= (used + requested), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   443
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   444
#endif // ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
template <typename T>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
inline void migrate_outstanding_writes(const T* old, T* new_buffer, size_t used, size_t requested) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   448
  DEBUG_ONLY(assert_migration_state(old, new_buffer, used, requested);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   449
  if (used > 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
    memcpy(new_buffer->pos(), old->pos(), used);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   452
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50113
diff changeset
   454
#endif // SHARE_JFR_RECORDER_STORAGE_JFRMEMORYSPACE_INLINE_HPP