src/hotspot/share/jfr/writers/jfrStorageHost.inline.hpp
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
child 53244 9807daeb47c4
permissions -rw-r--r--
8199712: Flight Recorder Reviewed-by: coleenp, ihse, erikj, dsamersoff, mseledtsov, egahlin, mgronlun Contributed-by: erik.gahlin@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#ifndef SHARE_VM_JFR_WRITERS_JFRSTORAGEHOST_INLINE_HPP
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
#define SHARE_VM_JFR_WRITERS_JFRSTORAGEHOST_INLINE_HPP
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/writers/jfrStorageHost.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
inline void StorageHost<Adapter, AP>::bind() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
  if (is_backed()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
    this->hard_reset();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
    assert(is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
  this->set_start_pos(NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
  this->set_current_pos((const u1*)NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
  this->set_end_pos(NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
inline void StorageHost<Adapter, AP>::soft_reset() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  this->set_start_pos(this->current_pos());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
inline void StorageHost<Adapter, AP>::hard_reset() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  this->set_start_pos(_adapter.pos());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  this->set_current_pos(_adapter.pos());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  this->set_end_pos(_adapter.end());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
inline void StorageHost<Adapter, AP>::cancel() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
  this->set_end_pos(NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
inline bool StorageHost<Adapter, AP>::is_backed() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  return _adapter.storage() != NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
inline bool StorageHost<Adapter, AP>::accommodate(size_t used, size_t requested) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  if (!_adapter.flush(used, requested)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    this->cancel();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  assert(is_backed(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  this->hard_reset();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
  this->set_current_pos(used);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
inline void StorageHost<Adapter, AP>::commit() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
  if (this->is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
    assert(_adapter.pos() == this->start_pos(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
    assert(_adapter.end() == this->end_pos(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
    u1* new_position = this->current_pos();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
    _adapter.commit(new_position);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
    this->set_start_pos(new_position);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
inline void StorageHost<Adapter, AP>::release() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  _adapter.release();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
inline StorageHost<Adapter, AP>::StorageHost(typename Adapter::StorageType* storage, Thread* thread) : Position<AP>(), _adapter(storage, thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  bind();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
inline StorageHost<Adapter, AP>::StorageHost(typename Adapter::StorageType* storage, size_t size) : Position<AP>(), _adapter(storage, size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  bind();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
inline StorageHost<Adapter, AP>::StorageHost(Thread* thread) : Position<AP>(), _adapter(thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
  bind();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
inline bool StorageHost<Adapter, AP>::is_valid() const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
  return this->end_pos() != NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
inline typename Adapter::StorageType* StorageHost<Adapter, AP>::storage() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  return _adapter.storage();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
inline void StorageHost<Adapter, AP>::set_storage(typename Adapter::StorageType* storage) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  _adapter.set_storage(storage);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  bind();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
inline void StorageHost<Adapter, AP>::flush() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  this->accommodate(this->is_valid() ? this->used_size() : 0, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
template <typename Adapter, typename AP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
inline void StorageHost<Adapter, AP>::seek(intptr_t offset) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
  if (this->is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    assert(offset >= 0, "negative offsets not supported");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
    assert(this->start_pos() + offset <= this->end_pos(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    assert(this->start_pos() + offset >= this->start_pos(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
    this->set_current_pos(this->start_pos() + offset);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
#endif // SHARE_VM_JFR_WRITERS_JFRSTORAGEHOST_INLINE_HPP