hotspot/src/share/vm/runtime/os.cpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 19697 d55ba95422d7
child 20006 9dc2add3103b
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
     2
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    26
#include "classfile/classLoader.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    27
#include "classfile/javaClasses.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    28
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    29
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    30
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "code/vtableStubs.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    32
#include "gc_implementation/shared/vmGCOperations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    33
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    34
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    35
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    36
#include "prims/jvm.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    37
#include "prims/jvm_misc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    38
#include "prims/privilegedStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    39
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    40
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    41
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    42
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    43
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    44
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    45
#include "runtime/os.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    46
#include "runtime/stubRoutines.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14490
diff changeset
    47
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    48
#include "services/attachListener.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
    49
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    50
#include "services/threadService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    51
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    52
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    53
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    54
# include "os_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    55
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    56
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    57
# include "os_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    58
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    59
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    60
# include "os_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    61
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
    62
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
    63
# include "os_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
    64
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
# include <signal.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
OSThread*         os::_starting_thread    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
address           os::_polling_page       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
volatile int32_t* os::_mem_serialize_page = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
uintptr_t         os::_serialize_page_mask = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
long              os::_rand_seed          = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
int               os::_processor_count    = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
size_t            os::_page_sizes[os::page_sizes_max];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
#ifndef PRODUCT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    77
julong os::num_mallocs = 0;         // # of calls to malloc/realloc
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    78
julong os::alloc_bytes = 0;         // # of bytes allocated
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    79
julong os::num_frees = 0;           // # of calls to free
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    80
julong os::free_bytes = 0;          // # of bytes freed
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
    83
static juint cur_malloc_words = 0;  // current size for MallocMaxTestWords
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
    84
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    85
void os_init_globals() {
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    86
  // Called from init_globals().
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    87
  // See Threads::create_vm() in thread.cpp, and init.cpp.
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    88
  os::init_globals();
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    89
}
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    90
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
// Fill in buffer with current local time as an ISO-8601 string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
// E.g., yyyy-mm-ddThh:mm:ss-zzzz.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
// Returns buffer, or NULL if it failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// This would mostly be a call to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
//     strftime(...., "%Y-%m-%d" "T" "%H:%M:%S" "%z", ....)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// except that on Windows the %z behaves badly, so we do it ourselves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
// Also, people wanted milliseconds on there,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// and strftime doesn't do milliseconds.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
char* os::iso8601_time(char* buffer, size_t buffer_length) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // Output will be of the form "YYYY-MM-DDThh:mm:ss.mmm+zzzz\0"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  //                                      1         2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  //                             12345678901234567890123456789
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  static const char* iso8601_format =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    "%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d%02d";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  static const size_t needed_buffer = 29;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // Sanity check the arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  if (buffer == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
    assert(false, "NULL buffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  if (buffer_length < needed_buffer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    assert(false, "buffer_length too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // Get the current time
234
4da9c1bbc810 6667833: Remove CacheTimeMillis
sbohne
parents: 228
diff changeset
   117
  jlong milliseconds_since_19700101 = javaTimeMillis();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  const int milliseconds_per_microsecond = 1000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  const time_t seconds_since_19700101 =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    milliseconds_since_19700101 / milliseconds_per_microsecond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  const int milliseconds_after_second =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    milliseconds_since_19700101 % milliseconds_per_microsecond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // Convert the time value to a tm and timezone variable
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   124
  struct tm time_struct;
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   125
  if (localtime_pd(&seconds_since_19700101, &time_struct) == NULL) {
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   126
    assert(false, "Failed localtime_pd");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   129
#if defined(_ALLBSD_SOURCE)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   130
  const time_t zone = (time_t) time_struct.tm_gmtoff;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   131
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  const time_t zone = timezone;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   133
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  // If daylight savings time is in effect,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  // we are 1 hour East of our time zone
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  const time_t seconds_per_minute = 60;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  const time_t minutes_per_hour = 60;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  time_t UTC_to_local = zone;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  if (time_struct.tm_isdst > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    UTC_to_local = UTC_to_local - seconds_per_hour;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // Compute the time zone offset.
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   145
  //    localtime_pd() sets timezone to the difference (in seconds)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  //    between UTC and and local time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  //    ISO 8601 says we need the difference between local time and UTC,
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   148
  //    we change the sign of the localtime_pd() result.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  const time_t local_to_UTC = -(UTC_to_local);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // Then we have to figure out if if we are ahead (+) or behind (-) UTC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  char sign_local_to_UTC = '+';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  time_t abs_local_to_UTC = local_to_UTC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  if (local_to_UTC < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    sign_local_to_UTC = '-';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    abs_local_to_UTC = -(abs_local_to_UTC);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // Convert time zone offset seconds to hours and minutes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  const time_t zone_hours = (abs_local_to_UTC / seconds_per_hour);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  const time_t zone_min =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    ((abs_local_to_UTC % seconds_per_hour) / seconds_per_minute);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // Print an ISO 8601 date and time stamp into the buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  const int year = 1900 + time_struct.tm_year;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  const int month = 1 + time_struct.tm_mon;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  const int printed = jio_snprintf(buffer, buffer_length, iso8601_format,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
                                   year,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
                                   month,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
                                   time_struct.tm_mday,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
                                   time_struct.tm_hour,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
                                   time_struct.tm_min,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
                                   time_struct.tm_sec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
                                   milliseconds_after_second,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
                                   sign_local_to_UTC,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
                                   zone_hours,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
                                   zone_min);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  if (printed == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    assert(false, "Failed jio_printf");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  return buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
OSReturn os::set_priority(Thread* thread, ThreadPriority p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  if (!(!thread->is_Java_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
         Thread::current() == thread  ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
         Threads_lock->owned_by_self()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
         || thread->is_Compiler_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
        )) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    assert(false, "possibility of dangling Thread pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  if (p >= MinPriority && p <= MaxPriority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    int priority = java_to_os_priority[p];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    return set_native_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    assert(false, "Should not happen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    return OS_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   203
// The mapping from OS priority back to Java priority may be inexact because
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   204
// Java priorities can map M:1 with native priorities. If you want the definite
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   205
// Java priority then use JavaThread::java_priority()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
OSReturn os::get_priority(const Thread* const thread, ThreadPriority& priority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  int p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  int os_prio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  OSReturn ret = get_native_priority(thread, &os_prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  if (ret != OS_OK) return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   212
  if (java_to_os_priority[MaxPriority] > java_to_os_priority[MinPriority]) {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   213
    for (p = MaxPriority; p > MinPriority && java_to_os_priority[p] > os_prio; p--) ;
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   214
  } else {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   215
    // niceness values are in reverse order
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   216
    for (p = MaxPriority; p > MinPriority && java_to_os_priority[p] < os_prio; p--) ;
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   217
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  priority = (ThreadPriority)p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  return OS_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
// --------------------- sun.misc.Signal (optional) ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
// SIGBREAK is sent by the keyboard to query the VM state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
#ifndef SIGBREAK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
#define SIGBREAK SIGQUIT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
// sigexitnum_pd is a platform-specific special signal used for terminating the Signal thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
static void signal_thread_entry(JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  os::set_priority(thread, NearMaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    int sig;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
      // FIXME : Currently we have not decieded what should be the status
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
      //         for this java thread blocked here. Once we decide about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      //         that we should fix this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      sig = os::signal_wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    if (sig == os::sigexitnum_pd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
       // Terminate the signal thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
       return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    switch (sig) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
      case SIGBREAK: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
        // Check if the signal is a trigger to start the Attach Listener - in that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
        // case don't print stack traces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
        if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
        // Print stack traces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
        // Any SIGBREAK operations added here should make sure to flush
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
        // the output stream (e.g. tty->flush()) after output.  See 4803766.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
        // Each module also prints an extra carriage return after its output.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
        VM_PrintThreads op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
        VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
        VM_PrintJNI jni_op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
        VMThread::execute(&jni_op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
        VM_FindDeadlocks op1(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
        VMThread::execute(&op1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
        Universe::print_heap_at_SIGBREAK();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
        if (PrintClassHistogram) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   268
          VM_GC_HeapInspection op1(gclog_or_tty, true /* force full GC before heap inspection */);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
          VMThread::execute(&op1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
        if (JvmtiExport::should_post_data_dump()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
          JvmtiExport::post_data_dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
      default: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
        // Dispatch the signal to java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
        HandleMark hm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   279
        Klass* k = SystemDictionary::resolve_or_null(vmSymbols::sun_misc_Signal(), THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
        KlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
        if (klass.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
          JavaCallArguments args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
          args.push_int(sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
          JavaCalls::call_static(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
            &result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   288
            vmSymbols::dispatch_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   289
            vmSymbols::int_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
            &args,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
            THREAD
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
          );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
        if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
          // tty is initialized early so we don't expect it to be null, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
          // if it is we can't risk doing an initialization that might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
          // trigger additional out-of-memory conditions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
          if (tty != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
            char klass_name[256];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
            char tmp_sig_name[16];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
            const char* sig_name = "UNKNOWN";
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   302
            InstanceKlass::cast(PENDING_EXCEPTION->klass())->
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
              name()->as_klass_external_name(klass_name, 256);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
            if (os::exception_name(sig, tmp_sig_name, 16) != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
              sig_name = tmp_sig_name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
            warning("Exception %s occurred dispatching signal %s to handler"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
                    "- the VM may need to be forcibly terminated",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
                    klass_name, sig_name );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
          CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   317
void os::init_before_ergo() {
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   318
  // We need to initialize large page support here because ergonomics takes some
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   319
  // decisions depending on large page support and the calculated large page size.
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   320
  large_page_init();
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   321
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
void os::signal_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  if (!ReduceSignalUsage) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    // Setup JavaThread for processing signals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    EXCEPTION_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   327
    Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    const char thread_name[] = "Signal Dispatcher";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    Handle string = java_lang_String::create_from_str(thread_name, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    // Initialize thread_oop to put it into the system threadGroup
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    Handle thread_group (THREAD, Universe::system_thread_group());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    JavaCalls::call_special(&result, thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
                           klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   339
                           vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   340
                           vmSymbols::threadgroup_string_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
                           thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
                           string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
                           CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 2358
diff changeset
   345
    KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
                            thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
                            group,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   349
                            vmSymbols::add_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   350
                            vmSymbols::thread_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
                            thread_oop,         // ARG 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
                            CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    os::signal_init_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
      JavaThread* signal_thread = new JavaThread(&signal_thread_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
      // At this point it may be possible that no osthread was created for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
      // JavaThread due to lack of memory. We would have to throw an exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
      // in that case. However, since this must work and we do not allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
      // exceptions anyway, check and abort if this fails.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
      if (signal_thread == NULL || signal_thread->osthread() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
        vm_exit_during_initialization("java.lang.OutOfMemoryError",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
                                      "unable to create new native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
      java_lang_Thread::set_thread(thread_oop(), signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
      java_lang_Thread::set_priority(thread_oop(), NearMaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
      java_lang_Thread::set_daemon(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
      signal_thread->set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
      Threads::add(signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
      Thread::start(signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    // Handle ^BREAK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    os::signal(SIGBREAK, os::user_handler());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
void os::terminate_signal_thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  if (!ReduceSignalUsage)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    signal_notify(sigexitnum_pd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
// --------------------- loading libraries ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
typedef jint (JNICALL *JNI_OnLoad_t)(JavaVM *, void *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
static void* _native_java_library = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
void* os::native_java_library() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  if (_native_java_library == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    char buffer[JVM_MAXPATHLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    char ebuf[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   400
    // Try to load verify dll first. In 1.3 java dll depends on it and is not
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   401
    // always able to find it when the loading executable is outside the JDK.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    // In order to keep working with 1.2 we ignore any loading errors.
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   403
    if (dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   404
                       "verify")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   405
      dll_load(buffer, ebuf, sizeof(ebuf));
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   406
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    // Load java dll
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   409
    if (dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   410
                       "java")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   411
      _native_java_library = dll_load(buffer, ebuf, sizeof(ebuf));
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   412
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    if (_native_java_library == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      vm_exit_during_initialization("Unable to load native library", ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   416
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   417
#if defined(__OpenBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   418
    // Work-around OpenBSD's lack of $ORIGIN support by pre-loading libnet.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   419
    // ignore errors
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   420
    if (dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   421
                       "net")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   422
      dll_load(buffer, ebuf, sizeof(ebuf));
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   423
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   424
#endif
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   425
  }
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   426
  static jboolean onLoaded = JNI_FALSE;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   427
  if (onLoaded) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   428
    // We may have to wait to fire OnLoad until TLS is initialized.
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   429
    if (ThreadLocalStorage::is_initialized()) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   430
      // The JNI_OnLoad handling is normally done by method load in
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   431
      // java.lang.ClassLoader$NativeLibrary, but the VM loads the base library
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   432
      // explicitly so we have to check for JNI_OnLoad as well
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   433
      const char *onLoadSymbols[] = JNI_ONLOAD_SYMBOLS;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   434
      JNI_OnLoad_t JNI_OnLoad = CAST_TO_FN_PTR(
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   435
          JNI_OnLoad_t, dll_lookup(_native_java_library, onLoadSymbols[0]));
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   436
      if (JNI_OnLoad != NULL) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   437
        JavaThread* thread = JavaThread::current();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   438
        ThreadToNativeFromVM ttn(thread);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   439
        HandleMark hm(thread);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   440
        jint ver = (*JNI_OnLoad)(&main_vm, NULL);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   441
        onLoaded = JNI_TRUE;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   442
        if (!Threads::is_supported_jni_version_including_1_1(ver)) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   443
          vm_exit_during_initialization("Unsupported JNI version");
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   444
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  return _native_java_library;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   451
/*
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   452
 * Support for finding Agent_On(Un)Load/Attach<_lib_name> if it exists.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   453
 * If check_lib == true then we are looking for an
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   454
 * Agent_OnLoad_lib_name or Agent_OnAttach_lib_name function to determine if
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   455
 * this library is statically linked into the image.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   456
 * If check_lib == false then we will look for the appropriate symbol in the
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   457
 * executable if agent_lib->is_static_lib() == true or in the shared library
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   458
 * referenced by 'handle'.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   459
 */
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   460
void* os::find_agent_function(AgentLibrary *agent_lib, bool check_lib,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   461
                              const char *syms[], size_t syms_len) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   462
  const char *lib_name;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   463
  void *handle = agent_lib->os_lib();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   464
  void *entryName = NULL;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   465
  char *agent_function_name;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   466
  size_t i;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   467
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   468
  // If checking then use the agent name otherwise test is_static_lib() to
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   469
  // see how to process this lookup
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   470
  lib_name = ((check_lib || agent_lib->is_static_lib()) ? agent_lib->name() : NULL);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   471
  for (i = 0; i < syms_len; i++) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   472
    agent_function_name = build_agent_function_name(syms[i], lib_name, agent_lib->is_absolute_path());
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   473
    if (agent_function_name == NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   474
      break;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   475
    }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   476
    entryName = dll_lookup(handle, agent_function_name);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   477
    FREE_C_HEAP_ARRAY(char, agent_function_name, mtThread);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   478
    if (entryName != NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   479
      break;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   480
    }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   481
  }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   482
  return entryName;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   483
}
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   484
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   485
// See if the passed in agent is statically linked into the VM image.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   486
bool os::find_builtin_agent(AgentLibrary *agent_lib, const char *syms[],
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   487
                            size_t syms_len) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   488
  void *ret;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   489
  void *proc_handle;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   490
  void *save_handle;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   491
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   492
  if (agent_lib->name() == NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   493
    return false;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   494
  }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   495
  proc_handle = get_default_process_handle();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   496
  // Check for Agent_OnLoad/Attach_lib_name function
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   497
  save_handle = agent_lib->os_lib();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   498
  // We want to look in this process' symbol table.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   499
  agent_lib->set_os_lib(proc_handle);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   500
  ret = find_agent_function(agent_lib, true, syms, syms_len);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   501
  agent_lib->set_os_lib(save_handle);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   502
  if (ret != NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   503
    // Found an entry point like Agent_OnLoad_lib_name so we have a static agent
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   504
    agent_lib->set_os_lib(proc_handle);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   505
    agent_lib->set_valid();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   506
    agent_lib->set_static_lib(true);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   507
    return true;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   508
  }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   509
  return false;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   510
}
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   511
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
// --------------------- heap allocation utilities ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   514
char *os::strdup(const char *str, MEMFLAGS flags) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  size_t size = strlen(str);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   516
  char *dup_str = (char *)malloc(size + 1, flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  if (dup_str == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  strcpy(dup_str, str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  return dup_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
#define space_before             (MallocCushion + sizeof(double))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
#define space_after              MallocCushion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
#define size_addr_from_base(p)   (size_t*)(p + space_before - sizeof(size_t))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
#define size_addr_from_obj(p)    ((size_t*)p - 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
// MallocCushion: size of extra cushion allocated around objects with +UseMallocOnly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
// NB: cannot be debug variable, because these aren't set from the command line until
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
// *after* the first few allocs already happened
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
#define MallocCushion            16
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
#define space_before             0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
#define space_after              0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
#define size_addr_from_base(p)   should not use w/o ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
#define size_addr_from_obj(p)    should not use w/o ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
#define MallocCushion            0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
#define paranoid                 0  /* only set to 1 if you suspect checking code has bug */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
inline size_t get_size(void* obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  size_t size = *size_addr_from_obj(obj);
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4571
diff changeset
   545
  if (size < 0) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4571
diff changeset
   546
    fatal(err_msg("free: size field of object #" PTR_FORMAT " was overwritten ("
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4571
diff changeset
   547
                  SIZE_FORMAT ")", obj, size));
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4571
diff changeset
   548
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  return size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
u_char* find_cushion_backwards(u_char* start) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  u_char* p = start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  while (p[ 0] != badResourceValue || p[-1] != badResourceValue ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
         p[-2] != badResourceValue || p[-3] != badResourceValue) p--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  // ok, we have four consecutive marker bytes; find start
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  u_char* q = p - 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  while (*q == badResourceValue) q--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  return q + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
u_char* find_cushion_forwards(u_char* start) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  u_char* p = start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  while (p[0] != badResourceValue || p[1] != badResourceValue ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
         p[2] != badResourceValue || p[3] != badResourceValue) p++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // ok, we have four consecutive marker bytes; find end of cushion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  u_char* q = p + 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  while (*q == badResourceValue) q++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  return q - MallocCushion;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
void print_neighbor_blocks(void* ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  // find block allocated before ptr (not entirely crash-proof)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  if (MallocCushion < 4) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
    tty->print_cr("### cannot find previous block (MallocCushion < 4)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  u_char* start_of_this_block = (u_char*)ptr - space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  u_char* end_of_prev_block_data = start_of_this_block - space_after -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  // look for cushion in front of prev. block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  u_char* start_of_prev_block = find_cushion_backwards(end_of_prev_block_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  ptrdiff_t size = *size_addr_from_base(start_of_prev_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  u_char* obj = start_of_prev_block + space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  if (size <= 0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    // start is bad; mayhave been confused by OS data inbetween objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    // search one more backwards
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    start_of_prev_block = find_cushion_backwards(start_of_prev_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    size = *size_addr_from_base(start_of_prev_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    obj = start_of_prev_block + space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  if (start_of_prev_block + space_before + size + space_after == start_of_this_block) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   593
    tty->print_cr("### previous object: " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", obj, size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  } else {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   595
    tty->print_cr("### previous object (not sure if correct): " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", obj, size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  // now find successor block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  u_char* start_of_next_block = (u_char*)ptr + *size_addr_from_obj(ptr) + space_after;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  start_of_next_block = find_cushion_forwards(start_of_next_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  u_char* next_obj = start_of_next_block + space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  ptrdiff_t next_size = *size_addr_from_base(start_of_next_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  if (start_of_next_block[0] == badResourceValue &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
      start_of_next_block[1] == badResourceValue &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
      start_of_next_block[2] == badResourceValue &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
      start_of_next_block[3] == badResourceValue) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   607
    tty->print_cr("### next object: " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", next_obj, next_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  } else {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   609
    tty->print_cr("### next object (not sure if correct): " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", next_obj, next_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
void report_heap_error(void* memblock, void* bad, const char* where) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   615
  tty->print_cr("## nof_mallocs = " UINT64_FORMAT ", nof_frees = " UINT64_FORMAT, os::num_mallocs, os::num_frees);
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   616
  tty->print_cr("## memory stomp: byte at " PTR_FORMAT " %s object " PTR_FORMAT, bad, where, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  print_neighbor_blocks(memblock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  fatal("memory stomping error");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
void verify_block(void* memblock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  size_t size = get_size(memblock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  if (MallocCushion) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    u_char* ptr = (u_char*)memblock - space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    for (int i = 0; i < MallocCushion; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
      if (ptr[i] != badResourceValue) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
        report_heap_error(memblock, ptr+i, "in front of");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    u_char* end = (u_char*)memblock + size + space_after;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    for (int j = -MallocCushion; j < 0; j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      if (end[j] != badResourceValue) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
        report_heap_error(memblock, end+j, "after");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   640
//
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   641
// This function supports testing of the malloc out of memory
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   642
// condition without really running the system out of memory.
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   643
//
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   644
static u_char* testMalloc(size_t alloc_size) {
16434
67b70a1edf27 8010396: checking MallocMaxTestWords in testMalloc() function is redundant
rdurbin
parents: 16428
diff changeset
   645
  assert(MallocMaxTestWords > 0, "sanity check");
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   646
16434
67b70a1edf27 8010396: checking MallocMaxTestWords in testMalloc() function is redundant
rdurbin
parents: 16428
diff changeset
   647
  if ((cur_malloc_words + (alloc_size / BytesPerWord)) > MallocMaxTestWords) {
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   648
    return NULL;
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   649
  }
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   650
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   651
  u_char* ptr = (u_char*)::malloc(alloc_size);
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   652
16434
67b70a1edf27 8010396: checking MallocMaxTestWords in testMalloc() function is redundant
rdurbin
parents: 16428
diff changeset
   653
  if (ptr != NULL) {
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   654
    Atomic::add(((jint) (alloc_size / BytesPerWord)),
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   655
                (volatile jint *) &cur_malloc_words);
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   656
  }
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   657
  return ptr;
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   658
}
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   659
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   660
void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   661
  NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   662
  NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   664
#ifdef ASSERT
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   665
  // checking for the WatcherThread and crash_protection first
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   666
  // since os::malloc can be called when the libjvm.{dll,so} is
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   667
  // first loaded and we don't have a thread yet.
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   668
  // try to find the thread after we see that the watcher thread
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   669
  // exists and has crash protection.
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   670
  WatcherThread *wt = WatcherThread::watcher_thread();
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   671
  if (wt != NULL && wt->has_crash_protection()) {
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   672
    Thread* thread = ThreadLocalStorage::get_thread_slow();
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   673
    if (thread == wt) {
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   674
      assert(!wt->has_crash_protection(),
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   675
          "Can't malloc with crash protection from WatcherThread");
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   676
    }
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   677
  }
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   678
#endif
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   679
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
    // return a valid pointer if size is zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
    // if NULL is returned the calling functions assume out of memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    size = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  }
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   685
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   686
  const size_t alloc_size = size + space_before + space_after;
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   687
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   688
  if (size > alloc_size) { // Check for rollover.
14487
9a40ad461ee9 7122219: Passed StringTableSize value not verified
hseigel
parents: 14120
diff changeset
   689
    return NULL;
9a40ad461ee9 7122219: Passed StringTableSize value not verified
hseigel
parents: 14120
diff changeset
   690
  }
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   691
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   693
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   694
  u_char* ptr;
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   695
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   696
  if (MallocMaxTestWords > 0) {
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   697
    ptr = testMalloc(alloc_size);
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   698
  } else {
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   699
    ptr = (u_char*)::malloc(alloc_size);
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   700
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   701
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  if (ptr == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  if (MallocCushion) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    for (u_char* p = ptr; p < ptr + MallocCushion; p++) *p = (u_char)badResourceValue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
    u_char* end = ptr + space_before + size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    for (u_char* pq = ptr+MallocCushion; pq < end; pq++) *pq = (u_char)uninitBlockPad;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    for (u_char* q = end; q < end + MallocCushion; q++) *q = (u_char)badResourceValue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  // put size just before data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  *size_addr_from_base(ptr) = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  u_char* memblock = ptr + space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   715
    tty->print_cr("os::malloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  debug_only(if (paranoid) verify_block(memblock));
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   719
  if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   720
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   721
  // we do not track MallocCushion memory
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   722
    MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   723
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  return memblock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   728
void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
#ifndef ASSERT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   730
  NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   731
  NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
   732
  MemTracker::Tracker tkr = MemTracker::get_realloc_tracker();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   733
  void* ptr = ::realloc(memblock, size);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
   734
  if (ptr != NULL) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
   735
    tkr.record((address)memblock, (address)ptr, size, memflags,
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   736
     caller == 0 ? CALLER_PC : caller);
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
   737
  } else {
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
   738
    tkr.discard();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   739
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   740
  return ptr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  if (memblock == NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   743
    return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   746
    tty->print_cr("os::realloc caught " PTR_FORMAT, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  verify_block(memblock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  if (size == 0) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  // always move the block
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   753
  void* ptr = malloc(size, memflags, caller == 0 ? CALLER_PC : caller);
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   754
  if (PrintMalloc) tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  // Copy to new memory if malloc didn't fail
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  if ( ptr != NULL ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
    memcpy(ptr, memblock, MIN2(size, get_size(memblock)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
    if (paranoid) verify_block(ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
    if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   760
      tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
      breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
    free(memblock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  return ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   770
void  os::free(void *memblock, MEMFLAGS memflags) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   771
  NOT_PRODUCT(inc_stat_counter(&num_frees, 1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  if (memblock == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   775
    if (tty != NULL) tty->print_cr("os::free caught " PTR_FORMAT, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  verify_block(memblock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  // Added by detlefs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  if (MallocCushion) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
    u_char* ptr = (u_char*)memblock - space_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
    for (u_char* p = ptr; p < ptr + MallocCushion; p++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
      guarantee(*p == badResourceValue,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
                "Thing freed should be malloc result.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
      *p = (u_char)freeBlockPad;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
    size_t size = get_size(memblock);
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   789
    inc_stat_counter(&free_bytes, size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    u_char* end = ptr + space_before + size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    for (u_char* q = end; q < end + MallocCushion; q++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
      guarantee(*q == badResourceValue,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
                "Thing freed should be malloc result.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
      *q = (u_char)freeBlockPad;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    }
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   796
    if (PrintMalloc && tty != NULL)
8652
209b2ce94ce5 7021653: Parfait issue in hotspot/src/share/vm/oops/methodDataOops.hpp
coleenp
parents: 8320
diff changeset
   797
      fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)memblock);
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   798
  } else if (PrintMalloc && tty != NULL) {
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   799
    // tty->print_cr("os::free %p", memblock);
8652
209b2ce94ce5 7021653: Parfait issue in hotspot/src/share/vm/oops/methodDataOops.hpp
coleenp
parents: 8320
diff changeset
   800
    fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
#endif
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   803
  MemTracker::record_free((address)memblock, memflags);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   804
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  ::free((char*)memblock - space_before);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
void os::init_random(long initval) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  _rand_seed = initval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
long os::random() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  /* standard, well-known linear congruential random generator with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
   * next_rand = (16807*seed) mod (2**31-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
   * see
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
   * (1) "Random Number Generators: Good Ones Are Hard to Find",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
   *      S.K. Park and K.W. Miller, Communications of the ACM 31:10 (Oct 1988),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
   * (2) "Two Fast Implementations of the 'Minimal Standard' Random
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
   *     Number Generator", David G. Carta, Comm. ACM 33, 1 (Jan 1990), pp. 87-88.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  const long a = 16807;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  const unsigned long m = 2147483647;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  const long q = m / a;        assert(q == 127773, "weird math");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  const long r = m % a;        assert(r == 2836, "weird math");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // compute az=2^31p+q
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  unsigned long lo = a * (long)(_rand_seed & 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  unsigned long hi = a * (long)((unsigned long)_rand_seed >> 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  lo += (hi & 0x7FFF) << 16;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  // if q overflowed, ignore the overflow and increment q
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  if (lo > m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
    lo &= m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    ++lo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  lo += hi >> 15;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  // if (p+q) overflowed, ignore the overflow and increment (p+q)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  if (lo > m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
    lo &= m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
    ++lo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  return (_rand_seed = lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
// The INITIALIZED state is distinguished from the SUSPENDED state because the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
// conditions in which a thread is first started are different from those in which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
// a suspension is resumed.  These differences make it hard for us to apply the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
// tougher checks when starting threads that we want to do when resuming them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
// However, when start_thread is called as a result of Thread.start, on a Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
// thread, the operation is synchronized on the Java Thread object.  So there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
// cannot be a race to start the thread and hence for the thread to exit while
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
// we are working on it.  Non-Java threads that start Java threads either have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
// to do so in a context in which races are impossible, or should do appropriate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
// locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
void os::start_thread(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  // guard suspend/resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  MutexLockerEx ml(thread->SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  OSThread* osthread = thread->osthread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  osthread->set_state(RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  pd_start_thread(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
//---------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
// Helper functions for fatal error handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
void os::print_hex_dump(outputStream* st, address start, address end, int unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  assert(unitsize == 1 || unitsize == 2 || unitsize == 4 || unitsize == 8, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  int cols = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  int cols_per_line = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  switch (unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    case 1: cols_per_line = 16; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    case 2: cols_per_line = 8;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
    case 4: cols_per_line = 4;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
    case 8: cols_per_line = 2;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    default: return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  address p = start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  st->print(PTR_FORMAT ":   ", start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  while (p < end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
    switch (unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
      case 1: st->print("%02x", *(u1*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
      case 2: st->print("%04x", *(u2*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
      case 4: st->print("%08x", *(u4*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
      case 8: st->print("%016" FORMAT64_MODIFIER "x", *(u8*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    p += unitsize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    cols++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
    if (cols >= cols_per_line && p < end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
       cols = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
       st->print(PTR_FORMAT ":   ", p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
       st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
void os::print_environment_variables(outputStream* st, const char** env_list,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
                                     char* buffer, int len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  if (env_list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
    st->print_cr("Environment Variables:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
    for (int i = 0; env_list[i] != NULL; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
      if (getenv(env_list[i], buffer, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
        st->print(env_list[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
        st->print("=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
        st->print_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
void os::print_cpu_info(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  // cpu
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  st->print("CPU:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  st->print("total %d", os::processor_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  // It's not safe to query number of active processors after crash
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  // st->print("(active %d)", os::active_processor_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  st->print(" %s", VM_Version::cpu_features());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  st->cr();
10023
e99d9a03c0f5 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 9125
diff changeset
   927
  pd_print_cpu_info(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
void os::print_date_and_time(outputStream *st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  time_t tloc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  (void)time(&tloc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  st->print("time: %s", ctime(&tloc));  // ctime adds newline.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  double t = os::elapsedTime();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // NOTE: It tends to crash after a SEGV if we want to printf("%f",...) in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  //       Linux. Must be a bug in glibc ? Workaround is to round "t" to int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  //       before printf. We lost some precision, but who cares?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  st->print_cr("elapsed time: %d seconds", (int)t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   942
// moved from debug.cpp (used to be find()) but still called from there
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
   943
// The verbose parameter is only set by the debug code in one case
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
   944
void os::print_location(outputStream* st, intptr_t x, bool verbose) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   945
  address addr = (address)x;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   946
  CodeBlob* b = CodeCache::find_blob_unsafe(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   947
  if (b != NULL) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   948
    if (b->is_buffer_blob()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   949
      // the interpreter is generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   950
      InterpreterCodelet* i = Interpreter::codelet_containing(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   951
      if (i != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   952
        st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an Interpreter codelet", addr, (int)(addr - i->code_begin()));
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   953
        i->print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   954
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   955
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   956
      if (Interpreter::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   957
        st->print_cr(INTPTR_FORMAT " is pointing into interpreter code"
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   958
                     " (not bytecode specific)", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   959
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   960
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   961
      //
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   962
      if (AdapterHandlerLibrary::contains(b)) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   963
        st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an AdapterHandler", addr, (int)(addr - b->code_begin()));
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   964
        AdapterHandlerLibrary::print_handler_on(st, b);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   965
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   966
      // the stubroutines are generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   967
      StubCodeDesc* d = StubCodeDesc::desc_for(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   968
      if (d != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   969
        st->print_cr(INTPTR_FORMAT " is at begin+%d in a stub", addr, (int)(addr - d->begin()));
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   970
        d->print_on(st);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   971
        st->cr();
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   972
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   973
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   974
      if (StubRoutines::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   975
        st->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   976
                     "stub routine", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   977
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   978
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   979
      // the InlineCacheBuffer is using stubs generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   980
      if (InlineCacheBuffer::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   981
        st->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   982
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   983
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   984
      VtableStub* v = VtableStubs::stub_containing(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   985
      if (v != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   986
        st->print_cr(INTPTR_FORMAT " is at entry_point+%d in a vtable stub", addr, (int)(addr - v->entry_point()));
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   987
        v->print_on(st);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   988
        st->cr();
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   989
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   990
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   991
    }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   992
    nmethod* nm = b->as_nmethod_or_null();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   993
    if (nm != NULL) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   994
      ResourceMark rm;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   995
      st->print(INTPTR_FORMAT " is at entry_point+%d in (nmethod*)" INTPTR_FORMAT,
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   996
                addr, (int)(addr - nm->entry_point()), nm);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   997
      if (verbose) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   998
        st->print(" for ");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   999
        nm->method()->print_value_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
  1000
      }
13923
4271ff38528f 8000228: Missing call to cr() when printing entry_point in nmethod, in os::print_location
stefank
parents: 13921
diff changeset
  1001
      st->cr();
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
  1002
      nm->print_nmethod(verbose);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1003
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1004
    }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
  1005
    st->print_cr(INTPTR_FORMAT " is at code_begin+%d in ", addr, (int)(addr - b->code_begin()));
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1006
    b->print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1007
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1008
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1009
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1010
  if (Universe::heap()->is_in(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1011
    HeapWord* p = Universe::heap()->block_start(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1012
    bool print = false;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1013
    // If we couldn't find it it just may mean that heap wasn't parseable
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1014
    // See if we were just given an oop directly
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1015
    if (p != NULL && Universe::heap()->block_is_obj(p)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1016
      print = true;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1017
    } else if (p == NULL && ((oopDesc*)addr)->is_oop()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1018
      p = (HeapWord*) addr;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1019
      print = true;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1020
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1021
    if (print) {
13921
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
  1022
      if (p == (HeapWord*) addr) {
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
  1023
        st->print_cr(INTPTR_FORMAT " is an oop", addr);
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
  1024
      } else {
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
  1025
        st->print_cr(INTPTR_FORMAT " is pointing into object: " INTPTR_FORMAT, addr, p);
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
  1026
      }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1027
      oop(p)->print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1028
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1029
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1030
  } else {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1031
    if (Universe::heap()->is_in_reserved(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1032
      st->print_cr(INTPTR_FORMAT " is an unallocated location "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1033
                   "in the heap", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1034
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1035
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1036
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1037
  if (JNIHandles::is_global_handle((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1038
    st->print_cr(INTPTR_FORMAT " is a global jni handle", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1039
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1040
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1041
  if (JNIHandles::is_weak_global_handle((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1042
    st->print_cr(INTPTR_FORMAT " is a weak global jni handle", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1043
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1044
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1045
#ifndef PRODUCT
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1046
  // we don't keep the block list in product mode
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1047
  if (JNIHandleBlock::any_contains((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1048
    st->print_cr(INTPTR_FORMAT " is a local jni handle", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1049
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1050
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1051
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1052
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1053
  for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1054
    // Check for privilege stack
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1055
    if (thread->privileged_stack_top() != NULL &&
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1056
        thread->privileged_stack_top()->contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1057
      st->print_cr(INTPTR_FORMAT " is pointing into the privilege stack "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1058
                   "for thread: " INTPTR_FORMAT, addr, thread);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1059
      if (verbose) thread->print_on(st);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1060
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1061
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1062
    // If the addr is a java thread print information about that.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1063
    if (addr == (address)thread) {
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1064
      if (verbose) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1065
        thread->print_on(st);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1066
      } else {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1067
        st->print_cr(INTPTR_FORMAT " is a thread", addr);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1068
      }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1069
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1070
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1071
    // If the addr is in the stack region for this thread then report that
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1072
    // and print thread info
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1073
    if (thread->stack_base() >= addr &&
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1074
        addr > (thread->stack_base() - thread->stack_size())) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1075
      st->print_cr(INTPTR_FORMAT " is pointing into the stack for thread: "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1076
                   INTPTR_FORMAT, addr, thread);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1077
      if (verbose) thread->print_on(st);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1078
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1079
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1080
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1081
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1082
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1083
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1084
  // Check if in metaspace.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1085
  if (ClassLoaderDataGraph::contains((address)addr)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1086
    // Use addr->print() from the debugger instead (not here)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1087
    st->print_cr(INTPTR_FORMAT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1088
                 " is pointing into metadata", addr);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1089
    return;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1090
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1091
#endif
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1092
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1093
  // Try an OS specific find
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1094
  if (os::find(addr, st)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1095
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1096
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1097
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1098
  st->print_cr(INTPTR_FORMAT " is an unknown value", addr);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1099
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
// Looks like all platforms except IA64 can use the same function to check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
// if C stack is walkable beyond current frame. The check for fp() is not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
// necessary on Sparc, but it's harmless.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
bool os::is_first_C_frame(frame* fr) {
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1105
#if defined(IA64) && !defined(_WIN32)
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1106
  // On IA64 we have to check if the callers bsp is still valid
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1107
  // (i.e. within the register stack bounds).
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1108
  // Notice: this only works for threads created by the VM and only if
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1109
  // we walk the current stack!!! If we want to be able to walk
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1110
  // arbitrary other threads, we'll have to somehow store the thread
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1111
  // object in the frame.
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1112
  Thread *thread = Thread::current();
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1113
  if ((address)fr->fp() <=
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1114
      thread->register_stack_base() HPUX_ONLY(+ 0x0) LINUX_ONLY(+ 0x50)) {
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1115
    // This check is a little hacky, because on Linux the first C
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1116
    // frame's ('start_thread') register stack frame starts at
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1117
    // "register_stack_base + 0x48" while on HPUX, the first C frame's
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1118
    // ('__pthread_bound_body') register stack frame seems to really
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1119
    // start at "register_stack_base".
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1120
    return true;
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1121
  } else {
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1122
    return false;
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1123
  }
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1124
#elif defined(IA64) && defined(_WIN32)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  return true;
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1126
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
  // Load up sp, fp, sender sp and sender fp, check for reasonable values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  // Check usp first, because if that's bad the other accessors may fault
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  // on some architectures.  Ditto ufp second, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  uintptr_t fp_align_mask = (uintptr_t)(sizeof(address)-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  // sp on amd can be 32 bit aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  uintptr_t sp_align_mask = (uintptr_t)(sizeof(int)-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  uintptr_t usp    = (uintptr_t)fr->sp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  if ((usp & sp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  uintptr_t ufp    = (uintptr_t)fr->fp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  if ((ufp & fp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  uintptr_t old_sp = (uintptr_t)fr->sender_sp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  if ((old_sp & sp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  if (old_sp == 0 || old_sp == (uintptr_t)-1) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  uintptr_t old_fp = (uintptr_t)fr->link();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  if ((old_fp & fp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  if (old_fp == 0 || old_fp == (uintptr_t)-1 || old_fp == ufp) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  // stack grows downwards; if old_fp is below current fp or if the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  // frame is too large, either the stack is corrupted or fp is not saved
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  // on stack (i.e. on x86, ebp may be used as general register). The stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  // is not walkable beyond current frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  if (old_fp < ufp) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  if (old_fp - ufp > 64 * K) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  return false;
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1156
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
extern "C" void test_random() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  const double m = 2147483647;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  double mean = 0.0, variance = 0.0, t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  long reps = 10000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  unsigned long seed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  tty->print_cr("seed %ld for %ld repeats...", seed, reps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  os::init_random(seed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  long num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  for (int k = 0; k < reps; k++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    num = os::random();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    double u = (double)num / m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
    assert(u >= 0.0 && u <= 1.0, "bad random number!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
    // calculate mean and variance of the random sequence
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
    mean += u;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
    variance += (u*u);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  mean /= reps;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  variance /= (reps - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  assert(num == 1043618065, "bad seed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  tty->print_cr("mean of the 1st 10000 numbers: %f", mean);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  tty->print_cr("variance of the 1st 10000 numbers: %f", variance);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  const double eps = 0.0001;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  t = fabsd(mean - 0.5018);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  assert(t < eps, "bad mean");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  t = (variance - 0.3355) < 0.0 ? -(variance - 0.3355) : variance - 0.3355;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  assert(t < eps, "bad variance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
// Set up the boot classpath.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
char* os::format_boot_path(const char* format_string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
                           const char* home,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
                           int home_len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
                           char fileSep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
                           char pathSep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
    assert((fileSep == '/' && pathSep == ':') ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
           (fileSep == '\\' && pathSep == ';'), "unexpected seperator chars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
    // Scan the format string to determine the length of the actual
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
    // boot classpath, and handle platform dependencies as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    int formatted_path_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
    const char* p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
    for (p = format_string; *p != 0; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
        if (*p == '%') formatted_path_len += home_len - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
        ++formatted_path_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1212
    char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
    if (formatted_path == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
        return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
    // Create boot classpath from format, substituting separator chars and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
    // java home directory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
    char* q = formatted_path;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
    for (p = format_string; *p != 0; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
        switch (*p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
        case '%':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
            strcpy(q, home);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
            q += home_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
        case '/':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
            *q++ = fileSep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
        case ':':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
            *q++ = pathSep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
        default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
            *q++ = *p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
    *q = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
    assert((q - formatted_path) == formatted_path_len, "formatted_path size botched");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    return formatted_path;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
bool os::set_boot_path(char fileSep, char pathSep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
    const char* home = Arguments::get_java_home();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
    int home_len = (int)strlen(home);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
    static const char* meta_index_dir_format = "%/lib/";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
    static const char* meta_index_format = "%/lib/meta-index";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
    char* meta_index = format_boot_path(meta_index_format, home, home_len, fileSep, pathSep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
    if (meta_index == NULL) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
    char* meta_index_dir = format_boot_path(meta_index_dir_format, home, home_len, fileSep, pathSep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
    if (meta_index_dir == NULL) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
    Arguments::set_meta_index_path(meta_index, meta_index_dir);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
    // Any modification to the JAR-file list, for the boot classpath must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
    // aligned with install/install/make/common/Pack.gmk. Note: boot class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
    // path class JARs, are stripped for StackMapTable to reduce download size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
    static const char classpath_format[] =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
        "%/lib/resources.jar:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
        "%/lib/rt.jar:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
        "%/lib/sunrsasign.jar:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
        "%/lib/jsse.jar:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
        "%/lib/jce.jar:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
        "%/lib/charsets.jar:"
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11417
diff changeset
  1265
        "%/lib/jfr.jar:"
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1266
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1267
        "%/lib/JObjC.jar:"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1268
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
        "%/classes";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
    char* sysclasspath = format_boot_path(classpath_format, home, home_len, fileSep, pathSep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
    if (sysclasspath == NULL) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
    Arguments::set_sysclasspath(sysclasspath);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1277
/*
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1278
 * Splits a path, based on its separator, the number of
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1279
 * elements is returned back in n.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1280
 * It is the callers responsibility to:
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1281
 *   a> check the value of n, and n may be 0.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1282
 *   b> ignore any empty path elements
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1283
 *   c> free up the data.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1284
 */
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1285
char** os::split_path(const char* path, int* n) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1286
  *n = 0;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1287
  if (path == NULL || strlen(path) == 0) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1288
    return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1289
  }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1290
  const char psepchar = *os::path_separator();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1291
  char* inpath = (char*)NEW_C_HEAP_ARRAY(char, strlen(path) + 1, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1292
  if (inpath == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1293
    return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1294
  }
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
  1295
  strcpy(inpath, path);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1296
  int count = 1;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1297
  char* p = strchr(inpath, psepchar);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1298
  // Get a count of elements to allocate memory
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1299
  while (p != NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1300
    count++;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1301
    p++;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1302
    p = strchr(p, psepchar);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1303
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1304
  char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1305
  if (opath == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1306
    return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1307
  }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1308
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1309
  // do the actual splitting
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1310
  p = inpath;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1311
  for (int i = 0 ; i < count ; i++) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1312
    size_t len = strcspn(p, os::path_separator());
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1313
    if (len > JVM_MAXPATHLEN) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1314
      return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1315
    }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1316
    // allocate the string and add terminator storage
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1317
    char* s  = (char*)NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1318
    if (s == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1319
      return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1320
    }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1321
    strncpy(s, p, len);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1322
    s[len] = '\0';
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1323
    opath[i] = s;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1324
    p += len + 1;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1325
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1326
  FREE_C_HEAP_ARRAY(char, inpath, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1327
  *n = count;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1328
  return opath;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1329
}
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1330
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
void os::set_memory_serialize_page(address page) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  int count = log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  _mem_serialize_page = (volatile int32_t *)page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  // We initialize the serialization page shift count here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  // We assume a cache line size of 64 bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  assert(SerializePageShiftCount == count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
         "thread size changed, fix SerializePageShiftCount constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
  set_serialize_page_mask((uintptr_t)(vm_page_size() - sizeof(int32_t)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1341
static volatile intptr_t SerializePageLock = 0;
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1342
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
// This method is called from signal handler when SIGSEGV occurs while the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
// thread tries to store to the "read-only" memory serialize page during state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
// transition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
void os::block_on_serialize_page_trap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  if (TraceSafepoint) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
    tty->print_cr("Block until the serialize page permission restored");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  }
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1350
  // When VMThread is holding the SerializePageLock during modifying the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  // access permission of the memory serialize page, the following call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  // will block until the permission of that page is restored to rw.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  // Generally, it is unsafe to manipulate locks in signal handlers, but in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  // this case, it's OK as the signal is synchronous and we know precisely when
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1355
  // it can occur.
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1356
  Thread::muxAcquire(&SerializePageLock, "set_memory_serialize_page");
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1357
  Thread::muxRelease(&SerializePageLock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
// Serialize all thread state variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
void os::serialize_thread_states() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
  // On some platforms such as Solaris & Linux, the time duration of the page
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  // permission restoration is observed to be much longer than expected  due to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  // scheduler starvation problem etc. To avoid the long synchronization
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1365
  // time and expensive page trap spinning, 'SerializePageLock' is used to block
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1366
  // the mutator thread if such case is encountered. See bug 6546278 for details.
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1367
  Thread::muxAcquire(&SerializePageLock, "serialize_thread_states");
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
  1368
  os::protect_memory((char *)os::get_memory_serialize_page(),
1664
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 950
diff changeset
  1369
                     os::vm_page_size(), MEM_PROT_READ);
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 950
diff changeset
  1370
  os::protect_memory((char *)os::get_memory_serialize_page(),
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 950
diff changeset
  1371
                     os::vm_page_size(), MEM_PROT_RW);
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1372
  Thread::muxRelease(&SerializePageLock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
// Returns true if the current stack pointer is above the stack shadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
// pages, false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  assert(StackRedPages > 0 && StackYellowPages > 0,"Sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  address sp = current_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  // Check if we have StackShadowPages above the yellow zone.  This parameter
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 2012
diff changeset
  1382
  // is dependent on the depth of the maximum VM call stack possible from
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
  // the handler for stack overflow.  'instanceof' in the stack overflow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
  // handler or a println uses at least 8k stack of VM and native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
  // respectively.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  const int framesize_in_bytes =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
    Interpreter::size_top_interpreter_activation(method()) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  int reserved_area = ((StackShadowPages + StackRedPages + StackYellowPages)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
                      * vm_page_size()) + framesize_in_bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
  // The very lower end of the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
  address stack_limit = thread->stack_base() - thread->stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
  return (sp > (stack_limit + reserved_area));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
                                uint min_pages)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  assert(min_pages > 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
  if (UseLargePages) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
    const size_t max_page_size = region_max_size / min_pages;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
    for (unsigned int i = 0; _page_sizes[i] != 0; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
      const size_t sz = _page_sizes[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
      const size_t mask = sz - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
      if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
        // The largest page size with no fragmentation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
        return sz;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
      if (sz <= max_page_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
        // The largest page size that satisfies the min_pages requirement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
        return sz;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  return vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
#ifndef PRODUCT
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1421
void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count)
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1422
{
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1423
  if (TracePageSizes) {
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1424
    tty->print("%s: ", str);
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1425
    for (int i = 0; i < count; ++i) {
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1426
      tty->print(" " SIZE_FORMAT, page_sizes[i]);
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1427
    }
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1428
    tty->cr();
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1429
  }
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1430
}
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1431
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
void os::trace_page_sizes(const char* str, const size_t region_min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
                          const size_t region_max_size, const size_t page_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
                          const char* base, const size_t size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
  if (TracePageSizes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
    tty->print_cr("%s:  min=" SIZE_FORMAT " max=" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
                  " pg_sz=" SIZE_FORMAT " base=" PTR_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
                  " size=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
                  str, region_min_size, region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
                  page_size, base, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
// This is the working definition of a server class machine:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
// >= 2 physical CPU's and >=2GB of memory, with some fuzz
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
// because the graphics memory (?) sometimes masks physical memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
// If you want to change the definition of a server class machine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
// on some OS or platform, e.g., >=4GB on Windohs platforms,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
// then you'll have to parameterize this method based on that state,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
// as was done for logical processors here, or replicate and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
// specialize this method for each platform.  (Or fix os to have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
// some inheritance structure and use subclassing.  Sigh.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
// If you want some platform to always or never behave as a server
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
// class machine, change the setting of AlwaysActAsServerClassMachine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
// and NeverActAsServerClassMachine in globals*.hpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
bool os::is_server_class_machine() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
  // First check for the early returns
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  if (NeverActAsServerClassMachine) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
  if (AlwaysActAsServerClassMachine) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  // Then actually look at the machine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  bool         result            = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  const unsigned int    server_processors = 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  const julong server_memory     = 2UL * G;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  // We seem not to get our full complement of memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  //     We allow some part (1/8?) of the memory to be "missing",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  //     based on the sizes of DIMMs, and maybe graphics cards.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  const julong missing_memory   = 256UL * M;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  /* Is this a server class machine? */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  if ((os::active_processor_count() >= (int)server_processors) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
      (os::physical_memory() >= (server_memory - missing_memory))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
    const unsigned int logical_processors =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
      VM_Version::logical_processors_per_package();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
    if (logical_processors > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
      const unsigned int physical_packages =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
        os::active_processor_count() / logical_processors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
      if (physical_packages > server_processors) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
        result = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
      result = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
}
9125
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8736
diff changeset
  1492
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1493
void os::SuspendedThreadTask::run() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1494
  assert(Threads_lock->owned_by_self() || (_thread == VMThread::vm_thread()), "must have threads lock to call this");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1495
  internal_do_task();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1496
  _done = true;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1497
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1498
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1499
bool os::create_stack_guard_pages(char* addr, size_t bytes) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1500
  return os::pd_create_stack_guard_pages(addr, bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1501
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1502
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1503
char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1504
  char* result = pd_reserve_memory(bytes, addr, alignment_hint);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
  1505
  if (result != NULL) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1506
    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1507
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1508
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1509
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1510
}
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1511
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1512
char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint,
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1513
   MEMFLAGS flags) {
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1514
  char* result = pd_reserve_memory(bytes, addr, alignment_hint);
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1515
  if (result != NULL) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1516
    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1517
    MemTracker::record_virtual_memory_type((address)result, flags);
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1518
  }
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1519
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1520
  return result;
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1521
}
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1522
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1523
char* os::attempt_reserve_memory_at(size_t bytes, char* addr) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1524
  char* result = pd_attempt_reserve_memory_at(bytes, addr);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
  1525
  if (result != NULL) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1526
    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1527
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1528
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1529
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1530
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1531
void os::split_reserved_memory(char *base, size_t size,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1532
                                 size_t split, bool realloc) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1533
  pd_split_reserved_memory(base, size, split, realloc);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1534
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1535
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1536
bool os::commit_memory(char* addr, size_t bytes, bool executable) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1537
  bool res = pd_commit_memory(addr, bytes, executable);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
  1538
  if (res) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1539
    MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1540
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1541
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1542
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1543
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1544
bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1545
                              bool executable) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1546
  bool res = os::pd_commit_memory(addr, size, alignment_hint, executable);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
  1547
  if (res) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1548
    MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1549
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1550
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1551
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1552
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1553
void os::commit_memory_or_exit(char* addr, size_t bytes, bool executable,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1554
                               const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1555
  pd_commit_memory_or_exit(addr, bytes, executable, mesg);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1556
  MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1557
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1558
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1559
void os::commit_memory_or_exit(char* addr, size_t size, size_t alignment_hint,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1560
                               bool executable, const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1561
  os::pd_commit_memory_or_exit(addr, size, alignment_hint, executable, mesg);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1562
  MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1563
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1564
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1565
bool os::uncommit_memory(char* addr, size_t bytes) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1566
  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1567
  bool res = pd_uncommit_memory(addr, bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1568
  if (res) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1569
    tkr.record((address)addr, bytes);
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1570
  } else {
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1571
    tkr.discard();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1572
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1573
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1574
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1575
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1576
bool os::release_memory(char* addr, size_t bytes) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1577
  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1578
  bool res = pd_release_memory(addr, bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1579
  if (res) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1580
    tkr.record((address)addr, bytes);
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1581
  } else {
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1582
    tkr.discard();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1583
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1584
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1585
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1586
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1587
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1588
char* os::map_memory(int fd, const char* file_name, size_t file_offset,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1589
                           char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1590
                           bool allow_exec) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1591
  char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13923
diff changeset
  1592
  if (result != NULL) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1593
    MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, mtNone, CALLER_PC);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1594
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1595
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1596
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1597
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1598
char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1599
                             char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1600
                             bool allow_exec) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1601
  return pd_remap_memory(fd, file_name, file_offset, addr, bytes,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1602
                    read_only, allow_exec);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1603
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1604
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1605
bool os::unmap_memory(char *addr, size_t bytes) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1606
  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1607
  bool result = pd_unmap_memory(addr, bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1608
  if (result) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1609
    tkr.record((address)addr, bytes);
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1610
  } else {
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1611
    tkr.discard();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1612
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1613
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1614
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1615
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1616
void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1617
  pd_free_memory(addr, bytes, alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1618
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1619
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1620
void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1621
  pd_realign_memory(addr, bytes, alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1622
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1623
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1624
#ifndef TARGET_OS_FAMILY_windows
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1625
/* try to switch state from state "from" to state "to"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1626
 * returns the state set after the method is complete
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1627
 */
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1628
os::SuspendResume::State os::SuspendResume::switch_state(os::SuspendResume::State from,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1629
                                                         os::SuspendResume::State to)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1630
{
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1631
  os::SuspendResume::State result =
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1632
    (os::SuspendResume::State) Atomic::cmpxchg((jint) to, (jint *) &_state, (jint) from);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1633
  if (result == from) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1634
    // success
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1635
    return to;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1636
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1637
  return result;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1638
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1639
#endif