hotspot/src/share/vm/runtime/os.cpp
author coleenp
Wed, 22 Jul 2015 00:03:45 -0400
changeset 31963 641ed52732ec
parent 31608 b5cb9a07591a
child 32198 be9ac7dad761
permissions -rw-r--r--
8026324: hs_err improvement: Add summary section to hs_err file 8026333: hs_err improvement: Print GC Strategy 8026336: hs_err improvement: Print compilation mode, server, client or tiered Summary: Added command line, summary cpu and os information to summary section. Moved time of crash and duration in summary section. Add GC strategy and compiler setting (tiered) to enhanced version string in error report. Moved the stack trace sooner in hs_err file. Reviewed-by: dholmes, ctornqvi, ddmitriev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
     2
 * Copyright (c) 1997, 2015, 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"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 25469
diff changeset
    30
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    32
#include "code/vtableStubs.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30125
diff changeset
    33
#include "gc/shared/vmGCOperations.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    34
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    35
#include "memory/allocation.inline.hpp"
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
    36
#ifdef ASSERT
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
    37
#include "memory/guardedMemory.hpp"
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
    38
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    39
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    40
#include "prims/jvm.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    41
#include "prims/jvm_misc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    42
#include "prims/privilegedStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    43
#include "runtime/arguments.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 25056
diff changeset
    44
#include "runtime/atomic.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    45
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    46
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    47
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    48
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    49
#include "runtime/mutexLocker.hpp"
25468
5331df506290 8048241: Introduce umbrella header os.inline.hpp and clean up includes
goetz
parents: 25355
diff changeset
    50
#include "runtime/os.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    51
#include "runtime/stubRoutines.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14490
diff changeset
    52
#include "runtime/thread.inline.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 25469
diff changeset
    53
#include "runtime/vm_version.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    54
#include "services/attachListener.hpp"
26561
e104c9397ca1 8055289: Internal Error: mallocTracker.cpp:146 fatal error: Should not use malloc for big memory block, use virtual memory instead
zgu
parents: 25962
diff changeset
    55
#include "services/mallocTracker.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
    56
#include "services/memTracker.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30125
diff changeset
    57
#include "services/nmtCommon.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    58
#include "services/threadService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    59
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    60
#include "utilities/events.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
# include <signal.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23863
diff changeset
    64
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23863
diff changeset
    65
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
OSThread*         os::_starting_thread    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
address           os::_polling_page       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
volatile int32_t* os::_mem_serialize_page = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
uintptr_t         os::_serialize_page_mask = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
long              os::_rand_seed          = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
int               os::_processor_count    = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
size_t            os::_page_sizes[os::page_sizes_max];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#ifndef PRODUCT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    75
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
    76
julong os::alloc_bytes = 0;         // # of bytes allocated
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
    77
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
    78
julong os::free_bytes = 0;          // # of bytes freed
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
    81
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
    82
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    83
void os_init_globals() {
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    84
  // Called from init_globals().
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    85
  // 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
    86
  os::init_globals();
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    87
}
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 10739
diff changeset
    88
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// Fill in buffer with current local time as an ISO-8601 string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
// E.g., yyyy-mm-ddThh:mm:ss-zzzz.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
// Returns buffer, or NULL if it failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
// This would mostly be a call to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
//     strftime(...., "%Y-%m-%d" "T" "%H:%M:%S" "%z", ....)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// except that on Windows the %z behaves badly, so we do it ourselves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
// Also, people wanted milliseconds on there,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// and strftime doesn't do milliseconds.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
char* os::iso8601_time(char* buffer, size_t buffer_length) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // Output will be of the form "YYYY-MM-DDThh:mm:ss.mmm+zzzz\0"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  //                                      1         2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  //                             12345678901234567890123456789
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  static const char* iso8601_format =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    "%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d%02d";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  static const size_t needed_buffer = 29;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Sanity check the arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  if (buffer == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    assert(false, "NULL buffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  if (buffer_length < needed_buffer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    assert(false, "buffer_length too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // Get the current time
234
4da9c1bbc810 6667833: Remove CacheTimeMillis
sbohne
parents: 228
diff changeset
   115
  jlong milliseconds_since_19700101 = javaTimeMillis();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  const int milliseconds_per_microsecond = 1000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  const time_t seconds_since_19700101 =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    milliseconds_since_19700101 / milliseconds_per_microsecond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  const int milliseconds_after_second =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    milliseconds_since_19700101 % milliseconds_per_microsecond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // 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
   122
  struct tm time_struct;
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   123
  if (localtime_pd(&seconds_since_19700101, &time_struct) == NULL) {
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   124
    assert(false, "Failed localtime_pd");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   127
#if defined(_ALLBSD_SOURCE)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   128
  const time_t zone = (time_t) time_struct.tm_gmtoff;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   129
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  const time_t zone = timezone;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   131
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // If daylight savings time is in effect,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  // we are 1 hour East of our time zone
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  const time_t seconds_per_minute = 60;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  const time_t minutes_per_hour = 60;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  const time_t seconds_per_hour = seconds_per_minute * minutes_per_hour;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  time_t UTC_to_local = zone;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  if (time_struct.tm_isdst > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    UTC_to_local = UTC_to_local - seconds_per_hour;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // Compute the time zone offset.
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   143
  //    localtime_pd() sets timezone to the difference (in seconds)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  //    between UTC and and local time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  //    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
   146
  //    we change the sign of the localtime_pd() result.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  const time_t local_to_UTC = -(UTC_to_local);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // Then we have to figure out if if we are ahead (+) or behind (-) UTC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  char sign_local_to_UTC = '+';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  time_t abs_local_to_UTC = local_to_UTC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  if (local_to_UTC < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    sign_local_to_UTC = '-';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    abs_local_to_UTC = -(abs_local_to_UTC);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // Convert time zone offset seconds to hours and minutes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  const time_t zone_hours = (abs_local_to_UTC / seconds_per_hour);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  const time_t zone_min =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    ((abs_local_to_UTC % seconds_per_hour) / seconds_per_minute);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Print an ISO 8601 date and time stamp into the buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  const int year = 1900 + time_struct.tm_year;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  const int month = 1 + time_struct.tm_mon;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  const int printed = jio_snprintf(buffer, buffer_length, iso8601_format,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
                                   year,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
                                   month,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
                                   time_struct.tm_mday,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
                                   time_struct.tm_hour,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
                                   time_struct.tm_min,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
                                   time_struct.tm_sec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
                                   milliseconds_after_second,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
                                   sign_local_to_UTC,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
                                   zone_hours,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
                                   zone_min);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  if (printed == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    assert(false, "Failed jio_printf");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  return buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
OSReturn os::set_priority(Thread* thread, ThreadPriority p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  if (!(!thread->is_Java_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
         Thread::current() == thread  ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
         Threads_lock->owned_by_self()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
         || thread->is_Compiler_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
        )) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    assert(false, "possibility of dangling Thread pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  if (p >= MinPriority && p <= MaxPriority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    int priority = java_to_os_priority[p];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    return set_native_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    assert(false, "Should not happen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
    return OS_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   201
// 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
   202
// 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
   203
// Java priority then use JavaThread::java_priority()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
OSReturn os::get_priority(const Thread* const thread, ThreadPriority& priority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  int p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  int os_prio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  OSReturn ret = get_native_priority(thread, &os_prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  if (ret != OS_OK) return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   210
  if (java_to_os_priority[MaxPriority] > java_to_os_priority[MinPriority]) {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   211
    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
   212
  } else {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   213
    // niceness values are in reverse order
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13728
diff changeset
   214
    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
   215
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  priority = (ThreadPriority)p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  return OS_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
// --------------------- sun.misc.Signal (optional) ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
// SIGBREAK is sent by the keyboard to query the VM state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
#ifndef SIGBREAK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
#define SIGBREAK SIGQUIT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
// sigexitnum_pd is a platform-specific special signal used for terminating the Signal thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
static void signal_thread_entry(JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  os::set_priority(thread, NearMaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    int sig;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    {
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22201
diff changeset
   237
      // FIXME : Currently we have not decided what should be the status
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
      //         for this java thread blocked here. Once we decide about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
      //         that we should fix this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
      sig = os::signal_wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    if (sig == os::sigexitnum_pd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
       // Terminate the signal thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
       return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    switch (sig) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
      case SIGBREAK: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
        // Check if the signal is a trigger to start the Attach Listener - in that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
        // case don't print stack traces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
        if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
        // Print stack traces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
        // Any SIGBREAK operations added here should make sure to flush
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
        // the output stream (e.g. tty->flush()) after output.  See 4803766.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
        // Each module also prints an extra carriage return after its output.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
        VM_PrintThreads op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
        VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
        VM_PrintJNI jni_op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
        VMThread::execute(&jni_op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
        VM_FindDeadlocks op1(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
        VMThread::execute(&op1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
        Universe::print_heap_at_SIGBREAK();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
        if (PrintClassHistogram) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   266
          VM_GC_HeapInspection op1(gclog_or_tty, true /* force full GC before heap inspection */);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
          VMThread::execute(&op1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
        if (JvmtiExport::should_post_data_dump()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
          JvmtiExport::post_data_dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
      default: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
        // Dispatch the signal to java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
        HandleMark hm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   277
        Klass* k = SystemDictionary::resolve_or_null(vmSymbols::sun_misc_Signal(), THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
        KlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
        if (klass.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
          JavaCallArguments args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
          args.push_int(sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
          JavaCalls::call_static(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
            &result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   286
            vmSymbols::dispatch_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   287
            vmSymbols::int_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
            &args,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
            THREAD
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
          );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
        if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
          // tty is initialized early so we don't expect it to be null, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
          // if it is we can't risk doing an initialization that might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
          // trigger additional out-of-memory conditions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
          if (tty != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
            char klass_name[256];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
            char tmp_sig_name[16];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
            const char* sig_name = "UNKNOWN";
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   300
            InstanceKlass::cast(PENDING_EXCEPTION->klass())->
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
              name()->as_klass_external_name(klass_name, 256);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
            if (os::exception_name(sig, tmp_sig_name, 16) != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
              sig_name = tmp_sig_name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
            warning("Exception %s occurred dispatching signal %s to handler"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
                    "- the VM may need to be forcibly terminated",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
                    klass_name, sig_name );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
          CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
      }
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
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   315
void os::init_before_ergo() {
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   316
  // 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
   317
  // 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
   318
  large_page_init();
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   319
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
void os::signal_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  if (!ReduceSignalUsage) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    // Setup JavaThread for processing signals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    EXCEPTION_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   325
    Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    const char thread_name[] = "Signal Dispatcher";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    Handle string = java_lang_String::create_from_str(thread_name, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    // Initialize thread_oop to put it into the system threadGroup
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    Handle thread_group (THREAD, Universe::system_thread_group());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    JavaCalls::call_special(&result, thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
                           klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   337
                           vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   338
                           vmSymbols::threadgroup_string_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
                           thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
                           string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
                           CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 2358
diff changeset
   343
    KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
                            thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
                            group,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   347
                            vmSymbols::add_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7405
diff changeset
   348
                            vmSymbols::thread_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
                            thread_oop,         // ARG 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
                            CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    os::signal_init_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
      JavaThread* signal_thread = new JavaThread(&signal_thread_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
      // At this point it may be possible that no osthread was created for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
      // JavaThread due to lack of memory. We would have to throw an exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
      // in that case. However, since this must work and we do not allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
      // exceptions anyway, check and abort if this fails.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
      if (signal_thread == NULL || signal_thread->osthread() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
        vm_exit_during_initialization("java.lang.OutOfMemoryError",
22758
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   363
                                      os::native_thread_creation_failed_msg());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
      java_lang_Thread::set_thread(thread_oop(), signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
      java_lang_Thread::set_priority(thread_oop(), NearMaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
      java_lang_Thread::set_daemon(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
      signal_thread->set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
      Threads::add(signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
      Thread::start(signal_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    // Handle ^BREAK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    os::signal(SIGBREAK, os::user_handler());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
void os::terminate_signal_thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  if (!ReduceSignalUsage)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    signal_notify(sigexitnum_pd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// --------------------- loading libraries ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
typedef jint (JNICALL *JNI_OnLoad_t)(JavaVM *, void *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
static void* _native_java_library = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
void* os::native_java_library() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  if (_native_java_library == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    char buffer[JVM_MAXPATHLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    char ebuf[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   398
    // 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
   399
    // always able to find it when the loading executable is outside the JDK.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    // 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
   401
    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
   402
                       "verify")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   403
      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
   404
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    // Load java dll
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   407
    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
   408
                       "java")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   409
      _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
   410
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    if (_native_java_library == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
      vm_exit_during_initialization("Unable to load native library", ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   414
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   415
#if defined(__OpenBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   416
    // Work-around OpenBSD's lack of $ORIGIN support by pre-loading libnet.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   417
    // ignore errors
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   418
    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
   419
                       "net")) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
   420
      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
   421
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10278
diff changeset
   422
#endif
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   423
  }
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   424
  static jboolean onLoaded = JNI_FALSE;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   425
  if (onLoaded) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   426
    // We may have to wait to fire OnLoad until TLS is initialized.
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   427
    if (ThreadLocalStorage::is_initialized()) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   428
      // The JNI_OnLoad handling is normally done by method load in
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   429
      // java.lang.ClassLoader$NativeLibrary, but the VM loads the base library
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   430
      // explicitly so we have to check for JNI_OnLoad as well
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   431
      const char *onLoadSymbols[] = JNI_ONLOAD_SYMBOLS;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   432
      JNI_OnLoad_t JNI_OnLoad = CAST_TO_FN_PTR(
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   433
          JNI_OnLoad_t, dll_lookup(_native_java_library, onLoadSymbols[0]));
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   434
      if (JNI_OnLoad != NULL) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   435
        JavaThread* thread = JavaThread::current();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   436
        ThreadToNativeFromVM ttn(thread);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   437
        HandleMark hm(thread);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   438
        jint ver = (*JNI_OnLoad)(&main_vm, NULL);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   439
        onLoaded = JNI_TRUE;
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   440
        if (!Threads::is_supported_jni_version_including_1_1(ver)) {
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   441
          vm_exit_during_initialization("Unsupported JNI version");
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   442
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  return _native_java_library;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   449
/*
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   450
 * 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
   451
 * 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
   452
 * 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
   453
 * 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
   454
 * 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
   455
 * 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
   456
 * referenced by 'handle'.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   457
 */
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   458
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
   459
                              const char *syms[], size_t syms_len) {
19973
d98623e1f50b 8024007: Misc. cleanup of static agent code
bpittore
parents: 19697
diff changeset
   460
  assert(agent_lib != NULL, "sanity check");
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   461
  const char *lib_name;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   462
  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
   463
  void *entryName = NULL;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   464
  char *agent_function_name;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   465
  size_t i;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   466
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   467
  // 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
   468
  // 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
   469
  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
   470
  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
   471
    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
   472
    if (agent_function_name == NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   473
      break;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   474
    }
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   475
    entryName = dll_lookup(handle, agent_function_name);
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27469
diff changeset
   476
    FREE_C_HEAP_ARRAY(char, agent_function_name);
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   477
    if (entryName != NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   478
      break;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   479
    }
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
  return entryName;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   482
}
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
// 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
   485
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
   486
                            size_t syms_len) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   487
  void *ret;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   488
  void *proc_handle;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   489
  void *save_handle;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   490
19973
d98623e1f50b 8024007: Misc. cleanup of static agent code
bpittore
parents: 19697
diff changeset
   491
  assert(agent_lib != NULL, "sanity check");
19553
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
  if (ret != NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   502
    // 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
   503
    agent_lib->set_valid();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   504
    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
   505
    return true;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   506
  }
19973
d98623e1f50b 8024007: Misc. cleanup of static agent code
bpittore
parents: 19697
diff changeset
   507
  agent_lib->set_os_lib(save_handle);
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   508
  return false;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   509
}
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18943
diff changeset
   510
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
// --------------------- heap allocation utilities ---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   513
char *os::strdup(const char *str, MEMFLAGS flags) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  size_t size = strlen(str);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   515
  char *dup_str = (char *)malloc(size + 1, flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  if (dup_str == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  strcpy(dup_str, str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  return dup_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
25949
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   521
char* os::strdup_check_oom(const char* str, MEMFLAGS flags) {
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   522
  char* p = os::strdup(str, flags);
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   523
  if (p == NULL) {
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   524
    vm_exit_out_of_memory(strlen(str) + 1, OOM_MALLOC_ERROR, "os::strdup_check_oom");
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   525
  }
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   526
  return p;
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   527
}
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   528
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
#define paranoid                 0  /* only set to 1 if you suspect checking code has bug */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   534
static void verify_memory(void* ptr) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   535
  GuardedMemory guarded(ptr);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   536
  if (!guarded.verify_guards()) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   537
    tty->print_cr("## nof_mallocs = " UINT64_FORMAT ", nof_frees = " UINT64_FORMAT, os::num_mallocs, os::num_frees);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   538
    tty->print_cr("## memory stomp:");
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   539
    guarded.print_on(tty);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   540
    fatal("memory stomping error");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   546
//
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   547
// 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
   548
// 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
   549
//
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   550
static bool has_reached_max_malloc_test_peak(size_t alloc_size) {
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   551
  if (MallocMaxTestWords > 0) {
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   552
    jint words = (jint)(alloc_size / BytesPerWord);
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   553
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   554
    if ((cur_malloc_words + words) > MallocMaxTestWords) {
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   555
      return true;
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   556
    }
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   557
    Atomic::add(words, (volatile jint *)&cur_malloc_words);
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   558
  }
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   559
  return false;
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   560
}
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   561
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   562
void* os::malloc(size_t size, MEMFLAGS flags) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   563
  return os::malloc(size, flags, CALLER_PC);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   564
}
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   565
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   566
void* os::malloc(size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   567
  NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   568
  NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   570
#ifdef ASSERT
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   571
  // checking for the WatcherThread and crash_protection first
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   572
  // since os::malloc can be called when the libjvm.{dll,so} is
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   573
  // first loaded and we don't have a thread yet.
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   574
  // try to find the thread after we see that the watcher thread
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   575
  // exists and has crash protection.
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   576
  WatcherThread *wt = WatcherThread::watcher_thread();
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   577
  if (wt != NULL && wt->has_crash_protection()) {
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   578
    Thread* thread = ThreadLocalStorage::get_thread_slow();
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   579
    if (thread == wt) {
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   580
      assert(!wt->has_crash_protection(),
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   581
          "Can't malloc with crash protection from WatcherThread");
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   582
    }
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   583
  }
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   584
#endif
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18086
diff changeset
   585
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    // return a valid pointer if size is zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    // if NULL is returned the calling functions assume out of memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    size = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  }
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   591
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   592
  // NMT support
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   593
  NMT_TrackingLevel level = MemTracker::tracking_level();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   594
  size_t            nmt_header_size = MemTracker::malloc_header_size(level);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   595
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   596
#ifndef ASSERT
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   597
  const size_t alloc_size = size + nmt_header_size;
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   598
#else
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   599
  const size_t alloc_size = GuardedMemory::get_total_size(size + nmt_header_size);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   600
  if (size + nmt_header_size > alloc_size) { // Check for rollover.
14487
9a40ad461ee9 7122219: Passed StringTableSize value not verified
hseigel
parents: 14120
diff changeset
   601
    return NULL;
9a40ad461ee9 7122219: Passed StringTableSize value not verified
hseigel
parents: 14120
diff changeset
   602
  }
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   603
#endif
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   604
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  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
   606
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   607
  // For the test flag -XX:MallocMaxTestWords
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   608
  if (has_reached_max_malloc_test_peak(size)) {
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   609
    return NULL;
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   610
  }
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   611
16428
1b55a8d558b8 7030610: runtime/6878713/Test6878713.sh fails Error. failed to clean up files after test
rdurbin
parents: 15475
diff changeset
   612
  u_char* ptr;
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   613
  ptr = (u_char*)::malloc(alloc_size);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   614
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
#ifdef ASSERT
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   616
  if (ptr == NULL) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   617
    return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  }
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   619
  // Wrap memory with guard
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   620
  GuardedMemory guarded(ptr, size + nmt_header_size);
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   621
  ptr = guarded.get_user_ptr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
#endif
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   623
  if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   624
    tty->print_cr("os::malloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  }
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   627
  debug_only(if (paranoid) verify_memory(ptr));
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   628
  if (PrintMalloc && tty != NULL) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   629
    tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   630
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
   631
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   632
  // we do not track guard memory
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   633
  return MemTracker::record_malloc((address)ptr, size, memflags, stack, level);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   636
void* os::realloc(void *memblock, size_t size, MEMFLAGS flags) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   637
  return os::realloc(memblock, size, flags, CALLER_PC);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   638
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   640
void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
26561
e104c9397ca1 8055289: Internal Error: mallocTracker.cpp:146 fatal error: Should not use malloc for big memory block, use virtual memory instead
zgu
parents: 25962
diff changeset
   641
28470
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   642
  // For the test flag -XX:MallocMaxTestWords
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   643
  if (has_reached_max_malloc_test_peak(size)) {
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   644
    return NULL;
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   645
  }
bf674dd8644e 8058897: Unsafe.reallocateMemory() ignores -XX:MallocMaxTestWords setting
ctornqvi
parents: 28208
diff changeset
   646
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
#ifndef ASSERT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   648
  NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   649
  NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   650
   // NMT support
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   651
  void* membase = MemTracker::record_free(memblock);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   652
  NMT_TrackingLevel level = MemTracker::tracking_level();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   653
  size_t  nmt_header_size = MemTracker::malloc_header_size(level);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   654
  void* ptr = ::realloc(membase, size + nmt_header_size);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   655
  return MemTracker::record_malloc(ptr, size, memflags, stack, level);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  if (memblock == NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   658
    return os::malloc(size, memflags, stack);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   661
    tty->print_cr("os::realloc caught " PTR_FORMAT, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  }
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   664
  // NMT support
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   665
  void* membase = MemTracker::malloc_base(memblock);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   666
  verify_memory(membase);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   668
  if (size == 0) {
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   669
    return NULL;
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   670
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  // always move the block
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   672
  void* ptr = os::malloc(size, memflags, stack);
31347
0fec61c9d330 8098517: Unprotected PrintMalloc in os::realloc
kbarrett
parents: 31335
diff changeset
   673
  if (PrintMalloc && tty != NULL) {
0fec61c9d330 8098517: Unprotected PrintMalloc in os::realloc
kbarrett
parents: 31335
diff changeset
   674
    tty->print_cr("os::realloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   675
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  // Copy to new memory if malloc didn't fail
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  if ( ptr != NULL ) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   678
    GuardedMemory guarded(MemTracker::malloc_base(memblock));
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   679
    // Guard's user data contains NMT header
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   680
    size_t memblock_size = guarded.get_user_size() - MemTracker::malloc_header_size(memblock);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   681
    memcpy(ptr, memblock, MIN2(size, memblock_size));
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   682
    if (paranoid) verify_memory(MemTracker::malloc_base(ptr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   684
      tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
      breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
    }
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   687
    os::free(memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  return ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27469
diff changeset
   694
void  os::free(void *memblock) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   695
  NOT_PRODUCT(inc_stat_counter(&num_frees, 1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  if (memblock == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 8076
diff changeset
   699
    if (tty != NULL) tty->print_cr("os::free caught " PTR_FORMAT, memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  }
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   702
  void* membase = MemTracker::record_free(memblock);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   703
  verify_memory(membase);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   705
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   706
  GuardedMemory guarded(membase);
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   707
  size_t size = guarded.get_user_size();
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   708
  inc_stat_counter(&free_bytes, size);
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   709
  membase = guarded.release_for_freeing();
25056
5ad92b0d1beb 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 24457
diff changeset
   710
  if (PrintMalloc && tty != NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   711
      fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)membase);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  }
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   713
  ::free(membase);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   714
#else
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   715
  void* membase = MemTracker::record_free(memblock);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
   716
  ::free(membase);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
void os::init_random(long initval) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  _rand_seed = initval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
long os::random() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  /* standard, well-known linear congruential random generator with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
   * next_rand = (16807*seed) mod (2**31-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
   * see
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
   * (1) "Random Number Generators: Good Ones Are Hard to Find",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
   *      S.K. Park and K.W. Miller, Communications of the ACM 31:10 (Oct 1988),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
   * (2) "Two Fast Implementations of the 'Minimal Standard' Random
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
   *     Number Generator", David G. Carta, Comm. ACM 33, 1 (Jan 1990), pp. 87-88.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  const long a = 16807;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  const unsigned long m = 2147483647;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  const long q = m / a;        assert(q == 127773, "weird math");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  const long r = m % a;        assert(r == 2836, "weird math");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  // compute az=2^31p+q
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  unsigned long lo = a * (long)(_rand_seed & 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  unsigned long hi = a * (long)((unsigned long)_rand_seed >> 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  lo += (hi & 0x7FFF) << 16;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  // if q overflowed, ignore the overflow and increment q
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  if (lo > m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
    lo &= m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
    ++lo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  lo += hi >> 15;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  // if (p+q) overflowed, ignore the overflow and increment (p+q)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  if (lo > m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
    lo &= m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
    ++lo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  return (_rand_seed = lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
// The INITIALIZED state is distinguished from the SUSPENDED state because the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
// conditions in which a thread is first started are different from those in which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
// a suspension is resumed.  These differences make it hard for us to apply the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
// tougher checks when starting threads that we want to do when resuming them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
// However, when start_thread is called as a result of Thread.start, on a Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
// thread, the operation is synchronized on the Java Thread object.  So there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
// cannot be a race to start the thread and hence for the thread to exit while
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
// we are working on it.  Non-Java threads that start Java threads either have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
// to do so in a context in which races are impossible, or should do appropriate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
// locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
void os::start_thread(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  // guard suspend/resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  MutexLockerEx ml(thread->SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  OSThread* osthread = thread->osthread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  osthread->set_state(RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  pd_start_thread(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
31026
b87ccf34b54c 8080718: Make -XX:CreateCoredumpOnCrash control core dumping in all cases
ctornqvi
parents: 30764
diff changeset
   778
void os::abort(bool dump_core) {
b87ccf34b54c 8080718: Make -XX:CreateCoredumpOnCrash control core dumping in all cases
ctornqvi
parents: 30764
diff changeset
   779
  abort(dump_core && CreateCoredumpOnCrash, NULL, NULL);
b87ccf34b54c 8080718: Make -XX:CreateCoredumpOnCrash control core dumping in all cases
ctornqvi
parents: 30764
diff changeset
   780
}
b87ccf34b54c 8080718: Make -XX:CreateCoredumpOnCrash control core dumping in all cases
ctornqvi
parents: 30764
diff changeset
   781
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
//---------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
// Helper functions for fatal error handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
void os::print_hex_dump(outputStream* st, address start, address end, int unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  assert(unitsize == 1 || unitsize == 2 || unitsize == 4 || unitsize == 8, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  int cols = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  int cols_per_line = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  switch (unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    case 1: cols_per_line = 16; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    case 2: cols_per_line = 8;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
    case 4: cols_per_line = 4;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    case 8: cols_per_line = 2;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    default: return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  address p = start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  st->print(PTR_FORMAT ":   ", start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  while (p < end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
    switch (unitsize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
      case 1: st->print("%02x", *(u1*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
      case 2: st->print("%04x", *(u2*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
      case 4: st->print("%08x", *(u4*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
      case 8: st->print("%016" FORMAT64_MODIFIER "x", *(u8*)p); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    p += unitsize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
    cols++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    if (cols >= cols_per_line && p < end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
       cols = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
       st->print(PTR_FORMAT ":   ", p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
       st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29076
diff changeset
   820
void os::print_environment_variables(outputStream* st, const char** env_list) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  if (env_list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
    st->print_cr("Environment Variables:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
    for (int i = 0; env_list[i] != NULL; i++) {
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29076
diff changeset
   825
      char *envvar = ::getenv(env_list[i]);
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29076
diff changeset
   826
      if (envvar != NULL) {
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23863
diff changeset
   827
        st->print("%s", env_list[i]);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
        st->print("=");
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29076
diff changeset
   829
        st->print_cr("%s", envvar);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31347
diff changeset
   835
void os::print_cpu_info(outputStream* st, char* buf, size_t buflen) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  // cpu
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  st->print("CPU:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  st->print("total %d", os::processor_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  // It's not safe to query number of active processors after crash
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  // st->print("(active %d)", os::active_processor_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  st->print(" %s", VM_Version::cpu_features());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  st->cr();
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31347
diff changeset
   843
  pd_print_cpu_info(st, buf, buflen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   846
// Print a one line string summarizing the cpu, number of cores, memory, and operating system version
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   847
void os::print_summary_info(outputStream* st, char* buf, size_t buflen) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   848
  st->print("Host: ");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   849
#ifndef PRODUCT
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   850
  if (get_host_name(buf, buflen)) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   851
    st->print("%s, ", buf);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   852
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   853
#endif // PRODUCT
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   854
  get_summary_cpu_info(buf, buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   855
  st->print("%s, ", buf);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   856
  size_t mem = physical_memory()/G;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   857
  if (mem == 0) {  // for low memory systems
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   858
    mem = physical_memory()/M;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   859
    st->print("%d cores, %dM, ", processor_count(), mem);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   860
  } else {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   861
    st->print("%d cores, %dG, ", processor_count(), mem);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   862
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   863
  get_summary_os_info(buf, buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   864
  st->print_raw(buf);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   865
  st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   866
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   867
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   868
void os::print_date_and_time(outputStream *st, char* buf, size_t buflen) {
23863
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   869
  const int secs_per_day  = 86400;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   870
  const int secs_per_hour = 3600;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   871
  const int secs_per_min  = 60;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   872
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  time_t tloc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  (void)time(&tloc);
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   875
  char* timestring = ctime(&tloc);  // ctime adds newline.
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   876
  // edit out the newline
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   877
  char* nl = strchr(timestring, '\n');
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   878
  if (nl != NULL) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   879
    *nl = '\0';
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   880
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   882
  struct tm tz;
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   883
  if (localtime_pd(&tloc, &tz) != NULL) {
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   884
    ::strftime(buf, buflen, "%Z", &tz);
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   885
    st->print("Time: %s %s", timestring, buf);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   886
  } else {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   887
    st->print("Time: %s", timestring);
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   888
  }
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 31026
diff changeset
   889
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  double t = os::elapsedTime();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // NOTE: It tends to crash after a SEGV if we want to printf("%f",...) in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  //       Linux. Must be a bug in glibc ? Workaround is to round "t" to int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  //       before printf. We lost some precision, but who cares?
23863
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   894
  int eltime = (int)t;  // elapsed time in seconds
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   895
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   896
  // print elapsed time in a human-readable format:
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   897
  int eldays = eltime / secs_per_day;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   898
  int day_secs = eldays * secs_per_day;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   899
  int elhours = (eltime - day_secs) / secs_per_hour;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   900
  int hour_secs = elhours * secs_per_hour;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   901
  int elmins = (eltime - day_secs - hour_secs) / secs_per_min;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   902
  int minute_secs = elmins * secs_per_min;
76fc8456723d 8026334: hs_err improvement: Print elapsed time in a humanly readable format
kevinw
parents: 22876
diff changeset
   903
  int elsecs = (eltime - day_secs - hour_secs - minute_secs);
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31608
diff changeset
   904
  st->print_cr(" elapsed time: %d seconds (%dd %dh %dm %ds)", eltime, eldays, elhours, elmins, elsecs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   907
// 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
   908
// 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
   909
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
   910
  address addr = (address)x;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   911
  CodeBlob* b = CodeCache::find_blob_unsafe(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   912
  if (b != NULL) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   913
    if (b->is_buffer_blob()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   914
      // the interpreter is generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   915
      InterpreterCodelet* i = Interpreter::codelet_containing(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   916
      if (i != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   917
        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
   918
        i->print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   919
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   920
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   921
      if (Interpreter::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   922
        st->print_cr(INTPTR_FORMAT " is pointing into interpreter code"
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   923
                     " (not bytecode specific)", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   924
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   925
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   926
      //
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   927
      if (AdapterHandlerLibrary::contains(b)) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   928
        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
   929
        AdapterHandlerLibrary::print_handler_on(st, b);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   930
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   931
      // the stubroutines are generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   932
      StubCodeDesc* d = StubCodeDesc::desc_for(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   933
      if (d != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   934
        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
   935
        d->print_on(st);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   936
        st->cr();
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   937
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   938
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   939
      if (StubRoutines::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   940
        st->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   941
                     "stub routine", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   942
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   943
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   944
      // the InlineCacheBuffer is using stubs generated into a buffer blob
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   945
      if (InlineCacheBuffer::contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   946
        st->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   947
        return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   948
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   949
      VtableStub* v = VtableStubs::stub_containing(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   950
      if (v != NULL) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   951
        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
   952
        v->print_on(st);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   953
        st->cr();
6176
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
    }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   957
    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
   958
    if (nm != NULL) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   959
      ResourceMark rm;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   960
      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
   961
                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
   962
      if (verbose) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   963
        st->print(" for ");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   964
        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
   965
      }
13923
4271ff38528f 8000228: Missing call to cr() when printing entry_point in nmethod, in os::print_location
stefank
parents: 13921
diff changeset
   966
      st->cr();
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   967
      nm->print_nmethod(verbose);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   968
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   969
    }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   970
    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
   971
    b->print_on(st);
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
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   975
  if (Universe::heap()->is_in(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   976
    HeapWord* p = Universe::heap()->block_start(addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   977
    bool print = false;
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22201
diff changeset
   978
    // If we couldn't find it it just may mean that heap wasn't parsable
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   979
    // See if we were just given an oop directly
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   980
    if (p != NULL && Universe::heap()->block_is_obj(p)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   981
      print = true;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   982
    } else if (p == NULL && ((oopDesc*)addr)->is_oop()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   983
      p = (HeapWord*) addr;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   984
      print = true;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   985
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   986
    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
   987
      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
   988
        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
   989
      } else {
cfc740741651 8000230: Change os::print_location to be more descriptive when a location is pointing into an object
stefank
parents: 13857
diff changeset
   990
        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
   991
      }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   992
      oop(p)->print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   993
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   994
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   995
  } else {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   996
    if (Universe::heap()->is_in_reserved(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   997
      st->print_cr(INTPTR_FORMAT " is an unallocated location "
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   998
                   "in the heap", addr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
   999
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1000
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1001
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1002
  if (JNIHandles::is_global_handle((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1003
    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
  1004
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1005
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1006
  if (JNIHandles::is_weak_global_handle((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1007
    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
  1008
    return;
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
#ifndef PRODUCT
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1011
  // we don't keep the block list in product mode
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1012
  if (JNIHandleBlock::any_contains((jobject) addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1013
    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
  1014
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1015
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1016
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1017
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1018
  for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1019
    // Check for privilege stack
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1020
    if (thread->privileged_stack_top() != NULL &&
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1021
        thread->privileged_stack_top()->contains(addr)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1022
      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
  1023
                   "for thread: " INTPTR_FORMAT, addr, thread);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1024
      if (verbose) thread->print_on(st);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1025
      return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1026
    }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1027
    // 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
  1028
    if (addr == (address)thread) {
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1029
      if (verbose) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1030
        thread->print_on(st);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1031
      } else {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1032
        st->print_cr(INTPTR_FORMAT " is a thread", addr);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1033
      }
6176
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
    // 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
  1037
    // and print thread info
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1038
    if (thread->stack_base() >= addr &&
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1039
        addr > (thread->stack_base() - thread->stack_size())) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1040
      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
  1041
                   INTPTR_FORMAT, addr, thread);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1042
      if (verbose) thread->print_on(st);
6176
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
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1046
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1047
24457
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1048
  // Check if in metaspace and print types that have vptrs (only method now)
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1049
  if (Metaspace::contains(addr)) {
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1050
    if (Method::has_method_vptr((const void*)addr)) {
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1051
      ((Method*)addr)->print_value_on(st);
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1052
      st->cr();
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1053
    } else {
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1054
      // Use addr->print() from the debugger instead (not here)
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1055
      st->print_cr(INTPTR_FORMAT " is pointing into metadata", addr);
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24424
diff changeset
  1056
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1057
    return;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1058
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1059
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1060
  // Try an OS specific find
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1061
  if (os::find(addr, st)) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1062
    return;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1063
  }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5922
diff changeset
  1064
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
  1065
  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
  1066
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
// Looks like all platforms except IA64 can use the same function to check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
// if C stack is walkable beyond current frame. The check for fp() is not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
// necessary on Sparc, but it's harmless.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
bool os::is_first_C_frame(frame* fr) {
22819
f88b9c394e42 8019973: PPC64 (part 11): Fix IA64 preprocessor conditionals on AIX.
goetz
parents: 18086
diff changeset
  1072
#if (defined(IA64) && !defined(AIX)) && !defined(_WIN32)
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1073
  // 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
  1074
  // (i.e. within the register stack bounds).
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1075
  // 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
  1076
  // 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
  1077
  // arbitrary other threads, we'll have to somehow store the thread
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1078
  // object in the frame.
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1079
  Thread *thread = Thread::current();
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1080
  if ((address)fr->fp() <=
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1081
      thread->register_stack_base() HPUX_ONLY(+ 0x0) LINUX_ONLY(+ 0x50)) {
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1082
    // 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
  1083
    // frame's ('start_thread') register stack frame starts at
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1084
    // "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
  1085
    // ('__pthread_bound_body') register stack frame seems to really
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1086
    // start at "register_stack_base".
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1087
    return true;
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1088
  } else {
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1089
    return false;
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1090
  }
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1091
#elif defined(IA64) && defined(_WIN32)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  return true;
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1093
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  // Load up sp, fp, sender sp and sender fp, check for reasonable values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  // Check usp first, because if that's bad the other accessors may fault
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  // on some architectures.  Ditto ufp second, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  uintptr_t fp_align_mask = (uintptr_t)(sizeof(address)-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  // sp on amd can be 32 bit aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  uintptr_t sp_align_mask = (uintptr_t)(sizeof(int)-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  uintptr_t usp    = (uintptr_t)fr->sp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  if ((usp & sp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  uintptr_t ufp    = (uintptr_t)fr->fp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  if ((ufp & fp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  uintptr_t old_sp = (uintptr_t)fr->sender_sp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  if ((old_sp & sp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  if (old_sp == 0 || old_sp == (uintptr_t)-1) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  uintptr_t old_fp = (uintptr_t)fr->link();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  if ((old_fp & fp_align_mask) != 0) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  if (old_fp == 0 || old_fp == (uintptr_t)-1 || old_fp == ufp) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  // stack grows downwards; if old_fp is below current fp or if the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  // frame is too large, either the stack is corrupted or fp is not saved
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  // on stack (i.e. on x86, ebp may be used as general register). The stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  // is not walkable beyond current frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  if (old_fp < ufp) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  if (old_fp - ufp > 64 * K) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
  return false;
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14583
diff changeset
  1123
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
extern "C" void test_random() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  const double m = 2147483647;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  double mean = 0.0, variance = 0.0, t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  long reps = 10000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  unsigned long seed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  tty->print_cr("seed %ld for %ld repeats...", seed, reps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  os::init_random(seed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  long num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  for (int k = 0; k < reps; k++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
    num = os::random();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
    double u = (double)num / m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    assert(u >= 0.0 && u <= 1.0, "bad random number!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    // calculate mean and variance of the random sequence
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
    mean += u;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
    variance += (u*u);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  mean /= reps;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  variance /= (reps - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  assert(num == 1043618065, "bad seed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  tty->print_cr("mean of the 1st 10000 numbers: %f", mean);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  tty->print_cr("variance of the 1st 10000 numbers: %f", variance);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  const double eps = 0.0001;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  t = fabsd(mean - 0.5018);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  assert(t < eps, "bad mean");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  t = (variance - 0.3355) < 0.0 ? -(variance - 0.3355) : variance - 0.3355;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  assert(t < eps, "bad variance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
// Set up the boot classpath.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
char* os::format_boot_path(const char* format_string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
                           const char* home,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
                           int home_len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
                           char fileSep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
                           char pathSep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    assert((fileSep == '/' && pathSep == ':') ||
22775
52bc5222f5f1 8026849: Fix typos in the GC code, part 2
jwilhelm
parents: 22556
diff changeset
  1168
           (fileSep == '\\' && pathSep == ';'), "unexpected separator chars");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    // Scan the format string to determine the length of the actual
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    // boot classpath, and handle platform dependencies as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
    int formatted_path_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
    const char* p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
    for (p = format_string; *p != 0; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
        if (*p == '%') formatted_path_len += home_len - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
        ++formatted_path_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1179
    char* formatted_path = NEW_C_HEAP_ARRAY(char, formatted_path_len + 1, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
    if (formatted_path == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
        return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
    // Create boot classpath from format, substituting separator chars and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
    // java home directory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
    char* q = formatted_path;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
    for (p = format_string; *p != 0; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
        switch (*p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
        case '%':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
            strcpy(q, home);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
            q += home_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
        case '/':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
            *q++ = fileSep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
        case ':':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
            *q++ = pathSep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
        default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
            *q++ = *p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
    *q = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    assert((q - formatted_path) == formatted_path_len, "formatted_path size botched");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
    return formatted_path;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
25856
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1209
// returns a PATH of all entries in the given directory that do not start with a '.'
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1210
static char* expand_entries_to_path(char* directory, char fileSep, char pathSep) {
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1211
  DIR* dir = os::opendir(directory);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1212
  if (dir == NULL) return NULL;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1213
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1214
  char* path = NULL;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1215
  size_t path_len = 0;  // path length including \0 terminator
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1216
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1217
  size_t directory_len = strlen(directory);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1218
  struct dirent *entry;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1219
  char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory), mtInternal);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1220
  while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) {
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1221
    const char* name = entry->d_name;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1222
    if (name[0] == '.') continue;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1223
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1224
    size_t name_len = strlen(name);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1225
    size_t needed = directory_len + name_len + 2;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1226
    size_t new_len = path_len + needed;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1227
    if (path == NULL) {
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1228
      path = NEW_C_HEAP_ARRAY(char, new_len, mtInternal);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1229
    } else {
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1230
      path = REALLOC_C_HEAP_ARRAY(char, path, new_len, mtInternal);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1231
    }
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1232
    if (path == NULL)
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1233
      break;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1234
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1235
    // append <pathSep>directory<fileSep>name
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1236
    char* p = path;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1237
    if (path_len > 0) {
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1238
      p += (path_len -1);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1239
      *p = pathSep;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1240
      p++;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1241
    }
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1242
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1243
    strcpy(p, directory);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1244
    p += directory_len;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1245
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1246
    *p = fileSep;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1247
    p++;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1248
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1249
    strcpy(p, name);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1250
    p += name_len;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1251
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1252
    path_len = new_len;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1253
  }
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1254
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27469
diff changeset
  1255
  FREE_C_HEAP_ARRAY(char, dbuf);
25856
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1256
  os::closedir(dir);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1257
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1258
  return path;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1259
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
bool os::set_boot_path(char fileSep, char pathSep) {
25856
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1262
  const char* home = Arguments::get_java_home();
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1263
  int home_len = (int)strlen(home);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1264
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1265
  char* sysclasspath = NULL;
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1266
  struct stat st;
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1267
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1268
  // modular image if bootmodules.jimage exists
31608
b5cb9a07591a 8080511: Refresh of jimage support
jfdenise
parents: 31356
diff changeset
  1269
  char* jimage = format_boot_path("%/lib/modules/" BOOT_IMAGE_NAME, home, home_len, fileSep, pathSep);
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1270
  if (jimage == NULL) return false;
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1271
  bool has_jimage = (os::stat(jimage, &st) == 0);
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1272
  if (has_jimage) {
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1273
    Arguments::set_sysclasspath(jimage);
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1274
    return true;
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27469
diff changeset
  1275
  }
27926
amurillo
parents: 27562 27880
diff changeset
  1276
  FREE_C_HEAP_ARRAY(char, jimage);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
29076
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1278
  // check if developer build with exploded modules
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1279
  char* modules_dir = format_boot_path("%/modules", home, home_len, fileSep, pathSep);
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1280
  if (os::stat(modules_dir, &st) == 0) {
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1281
    if ((st.st_mode & S_IFDIR) == S_IFDIR) {
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1282
      sysclasspath = expand_entries_to_path(modules_dir, fileSep, pathSep);
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1283
    }
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1284
  }
25856
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1285
29076
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1286
  // fallback to classes
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1287
  if (sysclasspath == NULL)
4a5f7c1e6ed7 8068687: Remove meta-index support and cleanup hotspot code for rt.jar etc in non-modular jdk image
hseigel
parents: 28636
diff changeset
  1288
    sysclasspath = format_boot_path("%/classes", home, home_len, fileSep, pathSep);
25856
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1289
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1290
  if (sysclasspath == NULL) return false;
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1291
  Arguments::set_sysclasspath(sysclasspath);
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1292
e5904519ae05 8054834: Modular Source Code
chegar
parents: 25715
diff changeset
  1293
  return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1296
/*
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1297
 * Splits a path, based on its separator, the number of
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1298
 * elements is returned back in n.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1299
 * It is the callers responsibility to:
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1300
 *   a> check the value of n, and n may be 0.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1301
 *   b> ignore any empty path elements
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1302
 *   c> free up the data.
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1303
 */
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1304
char** os::split_path(const char* path, int* n) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1305
  *n = 0;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1306
  if (path == NULL || strlen(path) == 0) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1307
    return NULL;
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
  const char psepchar = *os::path_separator();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1310
  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
  1311
  if (inpath == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1312
    return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1313
  }
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14120
diff changeset
  1314
  strcpy(inpath, path);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1315
  int count = 1;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1316
  char* p = strchr(inpath, psepchar);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1317
  // Get a count of elements to allocate memory
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1318
  while (p != NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1319
    count++;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1320
    p++;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1321
    p = strchr(p, psepchar);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1322
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1323
  char** opath = (char**) NEW_C_HEAP_ARRAY(char*, count, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1324
  if (opath == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1325
    return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1326
  }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1327
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1328
  // do the actual splitting
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1329
  p = inpath;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1330
  for (int i = 0 ; i < count ; i++) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1331
    size_t len = strcspn(p, os::path_separator());
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1332
    if (len > JVM_MAXPATHLEN) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1333
      return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1334
    }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1335
    // allocate the string and add terminator storage
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1336
    char* s  = (char*)NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1337
    if (s == NULL) {
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1338
      return NULL;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1339
    }
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1340
    strncpy(s, p, len);
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1341
    s[len] = '\0';
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1342
    opath[i] = s;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1343
    p += len + 1;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1344
  }
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27469
diff changeset
  1345
  FREE_C_HEAP_ARRAY(char, inpath);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1346
  *n = count;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1347
  return opath;
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1348
}
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2154
diff changeset
  1349
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
void os::set_memory_serialize_page(address page) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  int count = log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  _mem_serialize_page = (volatile int32_t *)page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  // We initialize the serialization page shift count here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  // We assume a cache line size of 64 bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
  assert(SerializePageShiftCount == count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
         "thread size changed, fix SerializePageShiftCount constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  set_serialize_page_mask((uintptr_t)(vm_page_size() - sizeof(int32_t)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1360
static volatile intptr_t SerializePageLock = 0;
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1361
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
// This method is called from signal handler when SIGSEGV occurs while the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
// thread tries to store to the "read-only" memory serialize page during state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
// transition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
void os::block_on_serialize_page_trap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  if (TraceSafepoint) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
    tty->print_cr("Block until the serialize page permission restored");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
  }
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1369
  // When VMThread is holding the SerializePageLock during modifying the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  // access permission of the memory serialize page, the following call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  // will block until the permission of that page is restored to rw.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  // Generally, it is unsafe to manipulate locks in signal handlers, but in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  // 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
  1374
  // it can occur.
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1375
  Thread::muxAcquire(&SerializePageLock, "set_memory_serialize_page");
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1376
  Thread::muxRelease(&SerializePageLock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
// Serialize all thread state variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
void os::serialize_thread_states() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  // On some platforms such as Solaris & Linux, the time duration of the page
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
  // permission restoration is observed to be much longer than expected  due to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
  // 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
  1384
  // 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
  1385
  // 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
  1386
  Thread::muxAcquire(&SerializePageLock, "serialize_thread_states");
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
  1387
  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
  1388
                     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
  1389
  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
  1390
                     os::vm_page_size(), MEM_PROT_RW);
228
69939fa91efd 6610420: Debug VM crashes during monitor lock rank checking
xlu
parents: 1
diff changeset
  1391
  Thread::muxRelease(&SerializePageLock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
// Returns true if the current stack pointer is above the stack shadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
// pages, false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  assert(StackRedPages > 0 && StackYellowPages > 0,"Sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
  address sp = current_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  // Check if we have StackShadowPages above the yellow zone.  This parameter
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 2012
diff changeset
  1401
  // is dependent on the depth of the maximum VM call stack possible from
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
  // the handler for stack overflow.  'instanceof' in the stack overflow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  // handler or a println uses at least 8k stack of VM and native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  // respectively.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  const int framesize_in_bytes =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
    Interpreter::size_top_interpreter_activation(method()) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  int reserved_area = ((StackShadowPages + StackRedPages + StackYellowPages)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
                      * vm_page_size()) + framesize_in_bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  // The very lower end of the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  address stack_limit = thread->stack_base() - thread->stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  return (sp > (stack_limit + reserved_area));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1414
size_t os::page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  assert(min_pages > 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
  if (UseLargePages) {
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1417
    const size_t max_page_size = region_size / min_pages;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1419
    for (size_t i = 0; _page_sizes[i] != 0; ++i) {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1420
      const size_t page_size = _page_sizes[i];
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1421
      if (page_size <= max_page_size) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1422
        if (!must_be_aligned || is_size_aligned(region_size, page_size)) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1423
          return page_size;
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1424
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
  return vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1432
size_t os::page_size_for_region_aligned(size_t region_size, size_t min_pages) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1433
  return page_size_for_region(region_size, min_pages, true);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1434
}
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1435
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1436
size_t os::page_size_for_region_unaligned(size_t region_size, size_t min_pages) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1437
  return page_size_for_region(region_size, min_pages, false);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1438
}
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1439
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
#ifndef PRODUCT
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1441
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
  1442
{
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1443
  if (TracePageSizes) {
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1444
    tty->print("%s: ", str);
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1445
    for (int i = 0; i < count; ++i) {
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1446
      tty->print(" " SIZE_FORMAT, page_sizes[i]);
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1447
    }
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1448
    tty->cr();
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1449
  }
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1450
}
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
  1451
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
void os::trace_page_sizes(const char* str, const size_t region_min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
                          const size_t region_max_size, const size_t page_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
                          const char* base, const size_t size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
  if (TracePageSizes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
    tty->print_cr("%s:  min=" SIZE_FORMAT " max=" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
                  " pg_sz=" SIZE_FORMAT " base=" PTR_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
                  " size=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
                  str, region_min_size, region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
                  page_size, base, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
// This is the working definition of a server class machine:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
// >= 2 physical CPU's and >=2GB of memory, with some fuzz
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
// because the graphics memory (?) sometimes masks physical memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
// If you want to change the definition of a server class machine
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22201
diff changeset
  1470
// on some OS or platform, e.g., >=4GB on Windows platforms,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
// then you'll have to parameterize this method based on that state,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
// as was done for logical processors here, or replicate and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
// specialize this method for each platform.  (Or fix os to have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
// some inheritance structure and use subclassing.  Sigh.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
// If you want some platform to always or never behave as a server
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
// class machine, change the setting of AlwaysActAsServerClassMachine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
// and NeverActAsServerClassMachine in globals*.hpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
bool os::is_server_class_machine() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  // First check for the early returns
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  if (NeverActAsServerClassMachine) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  if (AlwaysActAsServerClassMachine) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  // Then actually look at the machine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
  bool         result            = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  const unsigned int    server_processors = 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  const julong server_memory     = 2UL * G;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  // We seem not to get our full complement of memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  //     We allow some part (1/8?) of the memory to be "missing",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  //     based on the sizes of DIMMs, and maybe graphics cards.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  const julong missing_memory   = 256UL * M;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
  /* Is this a server class machine? */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
  if ((os::active_processor_count() >= (int)server_processors) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
      (os::physical_memory() >= (server_memory - missing_memory))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
    const unsigned int logical_processors =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
      VM_Version::logical_processors_per_package();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    if (logical_processors > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
      const unsigned int physical_packages =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
        os::active_processor_count() / logical_processors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
      if (physical_packages > server_processors) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
        result = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
      result = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
}
9125
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8736
diff changeset
  1512
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1513
void os::SuspendedThreadTask::run() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1514
  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
  1515
  internal_do_task();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1516
  _done = true;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1517
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1518
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1519
bool os::create_stack_guard_pages(char* addr, size_t bytes) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1520
  return os::pd_create_stack_guard_pages(addr, bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1521
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1522
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1523
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
  1524
  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
  1525
  if (result != NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1526
    MemTracker::record_virtual_memory_reserve((address)result, bytes, 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
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1529
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1530
}
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1531
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1532
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
  1533
   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
  1534
  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
  1535
  if (result != NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1536
    MemTracker::record_virtual_memory_reserve((address)result, bytes, 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
  1537
    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
  1538
  }
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1539
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1540
  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
  1541
}
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 16434
diff changeset
  1542
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1543
char* os::attempt_reserve_memory_at(size_t bytes, char* addr) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1544
  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
  1545
  if (result != NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1546
    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1547
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1548
  return result;
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
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1551
void os::split_reserved_memory(char *base, size_t size,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1552
                                 size_t split, bool realloc) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1553
  pd_split_reserved_memory(base, size, split, realloc);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1554
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1555
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1556
bool os::commit_memory(char* addr, size_t bytes, bool executable) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1557
  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
  1558
  if (res) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1559
    MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1560
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1561
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1562
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1563
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1564
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
  1565
                              bool executable) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1566
  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
  1567
  if (res) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1568
    MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1569
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1570
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1571
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1572
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1573
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
  1574
                               const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1575
  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
  1576
  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
  1577
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1578
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1579
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
  1580
                               bool executable, const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1581
  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
  1582
  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
  1583
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  1584
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1585
bool os::uncommit_memory(char* addr, size_t bytes) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1586
  bool res;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1587
  if (MemTracker::tracking_level() > NMT_minimal) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1588
    Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1589
    res = pd_uncommit_memory(addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1590
    if (res) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1591
      tkr.record((address)addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1592
    }
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1593
  } else {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1594
    res = pd_uncommit_memory(addr, bytes);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1595
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1596
  return res;
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
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1599
bool os::release_memory(char* addr, size_t bytes) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1600
  bool res;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1601
  if (MemTracker::tracking_level() > NMT_minimal) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1602
    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1603
    res = pd_release_memory(addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1604
    if (res) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1605
      tkr.record((address)addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1606
    }
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1607
  } else {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1608
    res = pd_release_memory(addr, bytes);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1609
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1610
  return res;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1611
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1612
28208
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
  1613
void os::pretouch_memory(char* start, char* end) {
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
  1614
  for (volatile char *p = start; p < end; p += os::vm_page_size()) {
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
  1615
    *p = 0;
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
  1616
  }
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
  1617
}
13195
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
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
  1620
                           char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1621
                           bool allow_exec) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1622
  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
  1623
  if (result != NULL) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1624
    MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1625
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1626
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1627
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1628
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1629
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
  1630
                             char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1631
                             bool allow_exec) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1632
  return pd_remap_memory(fd, file_name, file_offset, addr, bytes,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1633
                    read_only, allow_exec);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1634
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1635
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1636
bool os::unmap_memory(char *addr, size_t bytes) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1637
  bool result;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1638
  if (MemTracker::tracking_level() > NMT_minimal) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1639
    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1640
    result = pd_unmap_memory(addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1641
    if (result) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1642
      tkr.record((address)addr, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1643
    }
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  1644
  } else {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25715
diff changeset
  1645
    result = pd_unmap_memory(addr, bytes);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1646
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1647
  return result;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1648
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1649
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1650
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
  1651
  pd_free_memory(addr, bytes, alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1652
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1653
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1654
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
  1655
  pd_realign_memory(addr, bytes, alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1656
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11480
diff changeset
  1657
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1658
#ifndef TARGET_OS_FAMILY_windows
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1659
/* try to switch state from state "from" to state "to"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1660
 * returns the state set after the method is complete
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1661
 */
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1662
os::SuspendResume::State os::SuspendResume::switch_state(os::SuspendResume::State from,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1663
                                                         os::SuspendResume::State to)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1664
{
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1665
  os::SuspendResume::State result =
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1666
    (os::SuspendResume::State) Atomic::cmpxchg((jint) to, (jint *) &_state, (jint) from);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1667
  if (result == from) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1668
    // success
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1669
    return to;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1670
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1671
  return result;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1672
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1673
#endif
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1674
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1675
/////////////// Unit tests ///////////////
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1676
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1677
#ifndef PRODUCT
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1678
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1679
#define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b))
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1680
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1681
class TestOS : AllStatic {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1682
  static size_t small_page_size() {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1683
    return os::vm_page_size();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1684
  }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1685
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1686
  static size_t large_page_size() {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1687
    const size_t large_page_size_example = 4 * M;
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1688
    return os::page_size_for_region_aligned(large_page_size_example, 1);
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1689
  }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1690
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1691
  static void test_page_size_for_region_aligned() {
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1692
    if (UseLargePages) {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1693
      const size_t small_page = small_page_size();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1694
      const size_t large_page = large_page_size();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1695
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1696
      if (large_page > small_page) {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1697
        size_t num_small_pages_in_large = large_page / small_page;
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1698
        size_t page = os::page_size_for_region_aligned(large_page, num_small_pages_in_large);
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1699
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1700
        assert_eq(page, small_page);
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1701
      }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1702
    }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1703
  }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1704
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1705
  static void test_page_size_for_region_alignment() {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1706
    if (UseLargePages) {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1707
      const size_t small_page = small_page_size();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1708
      const size_t large_page = large_page_size();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1709
      if (large_page > small_page) {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1710
        const size_t unaligned_region = large_page + 17;
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1711
        size_t page = os::page_size_for_region_aligned(unaligned_region, 1);
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1712
        assert_eq(page, small_page);
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1713
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1714
        const size_t num_pages = 5;
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1715
        const size_t aligned_region = large_page * num_pages;
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1716
        page = os::page_size_for_region_aligned(aligned_region, num_pages);
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1717
        assert_eq(page, large_page);
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1718
      }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1719
    }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1720
  }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1721
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1722
  static void test_page_size_for_region_unaligned() {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1723
    if (UseLargePages) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1724
      // Given exact page size, should return that page size.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1725
      for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1726
        size_t expected = os::_page_sizes[i];
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1727
        size_t actual = os::page_size_for_region_unaligned(expected, 1);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1728
        assert_eq(expected, actual);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1729
      }
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1730
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1731
      // Given slightly larger size than a page size, return the page size.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1732
      for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1733
        size_t expected = os::_page_sizes[i];
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1734
        size_t actual = os::page_size_for_region_unaligned(expected + 17, 1);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1735
        assert_eq(expected, actual);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1736
      }
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1737
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1738
      // Given a slightly smaller size than a page size,
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1739
      // return the next smaller page size.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1740
      if (os::_page_sizes[1] > os::_page_sizes[0]) {
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1741
        size_t expected = os::_page_sizes[0];
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1742
        size_t actual = os::page_size_for_region_unaligned(os::_page_sizes[1] - 17, 1);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1743
        assert_eq(actual, expected);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1744
      }
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1745
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1746
      // Return small page size for values less than a small page.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1747
      size_t small_page = small_page_size();
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1748
      size_t actual = os::page_size_for_region_unaligned(small_page - 17, 1);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1749
      assert_eq(small_page, actual);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1750
    }
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1751
  }
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1752
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1753
 public:
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1754
  static void run_tests() {
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1755
    test_page_size_for_region_aligned();
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1756
    test_page_size_for_region_alignment();
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
  1757
    test_page_size_for_region_unaligned();
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1758
  }
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1759
};
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1760
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1761
void TestOS_test() {
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1762
  TestOS::run_tests();
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1763
}
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1764
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26561
diff changeset
  1765
#endif // PRODUCT