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