src/hotspot/share/memory/guardedMemory.cpp
author coleenp
Wed, 13 Nov 2019 08:23:23 -0500
changeset 59056 15936b142f86
parent 47216 71c04702a3d5
permissions -rw-r--r--
8233913: Remove implicit conversion from Method* to methodHandle Summary: Fix call sites to use existing THREAD local or pass down THREAD local for shallower callsites. Make linkResolver methods return Method* for caller to handleize if needed. Reviewed-by: iklam, thartmann, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     1
/*
42018
921e8769926b 8166563: Convert GuardedMemory_test to Gtest
kzhaldyb
parents: 35529
diff changeset
     2
 * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     4
 *
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     7
 * published by the Free Software Foundation.
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     8
 *
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    13
 * accompanied this code).
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    14
 *
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    18
 *
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    21
 * questions.
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    22
 *
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    23
 */
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    24
#include "precompiled.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    25
#include "memory/allocation.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    26
#include "memory/allocation.inline.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    27
#include "memory/guardedMemory.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    28
#include "runtime/os.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    29
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    30
void* GuardedMemory::wrap_copy(const void* ptr, const size_t len, const void* tag) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    31
  size_t total_sz = GuardedMemory::get_total_size(len);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    32
  void* outerp = os::malloc(total_sz, mtInternal);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    33
  if (outerp != NULL) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    34
    GuardedMemory guarded(outerp, len, tag);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    35
    void* innerp = guarded.get_user_ptr();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    36
    memcpy(innerp, ptr, len);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    37
    return innerp;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    38
  }
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    39
  return NULL; // OOM
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    40
}
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    41
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    42
bool GuardedMemory::free_copy(void* p) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    43
  if (p == NULL) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    44
    return true;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    45
  }
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    46
  GuardedMemory guarded((u_char*)p);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    47
  bool verify_ok = guarded.verify_guards();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    48
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    49
  /* always attempt to free, pass problem on to any nested memchecker */
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    50
  os::free(guarded.release_for_freeing());
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    51
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    52
  return verify_ok;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    53
}
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    54
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    55
void GuardedMemory::print_on(outputStream* st) const {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    56
  if (_base_addr == NULL) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    57
    st->print_cr("GuardedMemory(" PTR_FORMAT ") not associated to any memory", p2i(this));
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    58
    return;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    59
  }
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    60
  st->print_cr("GuardedMemory(" PTR_FORMAT ") base_addr=" PTR_FORMAT
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    61
      " tag=" PTR_FORMAT " user_size=" SIZE_FORMAT " user_data=" PTR_FORMAT,
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    62
      p2i(this), p2i(_base_addr), p2i(get_tag()), get_user_size(), p2i(get_user_ptr()));
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    63
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    64
  Guard* guard = get_head_guard();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    65
  st->print_cr("  Header guard @" PTR_FORMAT " is %s", p2i(guard), (guard->verify() ? "OK" : "BROKEN"));
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    66
  guard = get_tail_guard();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    67
  st->print_cr("  Trailer guard @" PTR_FORMAT " is %s", p2i(guard), (guard->verify() ? "OK" : "BROKEN"));
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    68
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    69
  u_char udata = *get_user_ptr();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    70
  switch (udata) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    71
  case uninitBlockPad:
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    72
    st->print_cr("  User data appears unused");
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    73
    break;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    74
  case freeBlockPad:
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    75
    st->print_cr("  User data appears to have been freed");
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    76
    break;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    77
  default:
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    78
    st->print_cr("  User data appears to be in use");
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    79
    break;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    80
  }
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents:
diff changeset
    81
}