hotspot/src/share/vm/runtime/os.hpp
author tschatzl
Wed, 27 Mar 2013 19:21:18 +0100
changeset 16605 ba13efd453bc
parent 15228 e92acc84ade3
child 16610 899daa32f6a0
permissions -rw-r--r--
7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method. Reviewed-by: jmasa, tamao
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15228
e92acc84ade3 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 14840
diff changeset
     2
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
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: 5085
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
#ifndef SHARE_VM_RUNTIME_OS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    26
#define SHARE_VM_RUNTIME_OS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    28
#include "jvmtifiles/jvmti.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    29
#include "runtime/atomic.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    30
#include "runtime/extendedPC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    32
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    33
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    34
# include "jvm_linux.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    35
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    36
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    37
# include "jvm_solaris.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    38
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    39
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    40
# include "jvm_windows.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    41
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    42
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    43
# include "jvm_bsd.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    44
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    45
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// os defines the interface to operating system; this includes traditional
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// OS services (time, I/O) as well as other functionality with system-
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// dependent code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
typedef void (*dll_func)(...);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
class Thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class JavaThread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class Event;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class DLL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
class FileHandle;
388
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
    57
template<class E> class GrowableArray;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// %%%%% Moved ThreadState, START_FN, OSThread to new osThread.hpp. -- Rose
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// Platform-independent error return values from OS functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
enum OSReturn {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  OS_OK         =  0,        // Operation was successful
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  OS_ERR        = -1,        // Operation failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  OS_INTRPT     = -2,        // Operation was interrupted
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  OS_TIMEOUT    = -3,        // Operation timed out
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  OS_NOMEM      = -5,        // Operation failed for lack of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  OS_NORESOURCE = -6         // Operation failed for lack of nonmemory resource
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
enum ThreadPriority {        // JLS 20.20.1-3
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  NoPriority       = -1,     // Initial non-priority value
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  MinPriority      =  1,     // Minimum priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  NormPriority     =  5,     // Normal (non-daemon) priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  NearMaxPriority  =  9,     // High priority, used for VMThread
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11423
diff changeset
    76
  MaxPriority      = 10,     // Highest priority, used for WatcherThread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
                             // ensures that VMThread doesn't starve profiler
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11423
diff changeset
    78
  CriticalPriority = 11      // Critical thread priority
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
// Typedef for structured exception handling support
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
typedef void (*java_call_t)(JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
class os: AllStatic {
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
    85
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
    88
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  static OSThread*          _starting_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  static address            _polling_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  static volatile int32_t * _mem_serialize_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  static uintptr_t          _serialize_page_mask;
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
    93
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  static size_t             _page_sizes[page_sizes_max];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
    96
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  static void init_page_sizes(size_t default_page_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    _page_sizes[0] = default_page_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    _page_sizes[1] = 0; // sentinel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   102
  static char*  pd_reserve_memory(size_t bytes, char* addr = 0,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   103
                               size_t alignment_hint = 0);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   104
  static char*  pd_attempt_reserve_memory_at(size_t bytes, char* addr);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   105
  static void   pd_split_reserved_memory(char *base, size_t size,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   106
                                      size_t split, bool realloc);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   107
  static bool   pd_commit_memory(char* addr, size_t bytes, bool executable = false);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   108
  static bool   pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   109
                              bool executable = false);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   110
  static bool   pd_uncommit_memory(char* addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   111
  static bool   pd_release_memory(char* addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   112
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   113
  static char*  pd_map_memory(int fd, const char* file_name, size_t file_offset,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   114
                           char *addr, size_t bytes, bool read_only = false,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   115
                           bool allow_exec = false);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   116
  static char*  pd_remap_memory(int fd, const char* file_name, size_t file_offset,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   117
                             char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   118
                             bool allow_exec);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   119
  static bool   pd_unmap_memory(char *addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   120
  static void   pd_free_memory(char *addr, size_t bytes, size_t alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   121
  static void   pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   122
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   123
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
 public:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   125
  static void init(void);                      // Called before command line parsing
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   126
  static jint init_2(void);                    // Called after command line parsing
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   127
  static void init_globals(void) {             // Called from init_globals() in init.cpp
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   128
    init_globals_ext();
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   129
  }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   130
  static void init_3(void);                    // Called at the end of vm init
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // File names are case-insensitive on windows only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // Override me as needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  static int    file_name_strcmp(const char* s1, const char* s2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  static bool getenv(const char* name, char* buffer, int len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  static bool have_special_privileges();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  static jlong  javaTimeMillis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  static jlong  javaTimeNanos();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  static void   javaTimeNanos_info(jvmtiTimerInfo *info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  static void   run_periodic_checks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // Returns the elapsed time in seconds since the vm started.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  static double elapsedTime();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // Returns real time in seconds since an arbitrary point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // in the past.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  static bool getTimesSecs(double* process_real_time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
                           double* process_user_time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
                           double* process_system_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // Interface to the performance counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  static jlong elapsed_counter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  static jlong elapsed_frequency();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   158
  // The "virtual time" of a thread is the amount of time a thread has
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   159
  // actually run.  The first function indicates whether the OS supports
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   160
  // this functionality for the current thread, and if so:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   161
  //   * the second enables vtime tracking (if that is required).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   162
  //   * the third tells whether vtime is enabled.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   163
  //   * the fourth returns the elapsed virtual time for the current
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   164
  //     thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   165
  static bool supports_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   166
  static bool enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   167
  static bool vtime_enabled();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   168
  static double elapsedVTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   169
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // Return current local time in a string (YYYY-MM-DD HH:MM:SS).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // It is MT safe, but not async-safe, as reading time zone
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // information may require a lock on some platforms.
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   173
  static char*      local_time_string(char *buf, size_t buflen);
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   174
  static struct tm* localtime_pd     (const time_t* clock, struct tm*  res);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // Fill in buffer with current local time as an ISO-8601 string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // Returns buffer, or NULL if it failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  static char* iso8601_time(char* buffer, size_t buffer_length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Interface for detecting multiprocessor system
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  static inline bool is_MP() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    assert(_processor_count > 0, "invalid processor count");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    return _processor_count > 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  static julong available_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  static julong physical_memory();
16605
ba13efd453bc 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 15228
diff changeset
   187
  static bool has_allocatable_memory_limit(julong* limit);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  static bool is_server_class_machine();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // number of CPUs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  static int processor_count() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    return _processor_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  }
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   194
  static void set_processor_count(int count) { _processor_count = count; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Returns the number of CPUs this process is currently allowed to run on.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Note that on some OSes this can change dynamically.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  static int active_processor_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // Bind processes to processors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  //     This is a two step procedure:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  //     first you generate a distribution of processes to processors,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  //     then you bind processes according to that distribution.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Compute a distribution for number of processes to processors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  //    Stores the processor id's into the distribution array argument.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  //    Returns true if it worked, false if it didn't.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  static bool distribute_processes(uint length, uint* distribution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // Binds the current process to a processor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  //    Returns true if it worked, false if it didn't.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  static bool bind_to_processor(uint processor_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   212
  // Give a name to the current thread.
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   213
  static void set_native_thread_name(const char *name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   214
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Interface for stack banging (predetect possible stack overflow for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // exception processing)  There are guard pages, and above that shadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  // pages for stack overflow checking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  static bool uses_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  static bool allocate_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  static void bang_stack_shadow_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  static bool stack_shadow_pages_available(Thread *thread, methodHandle method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  // OS interface to Virtual Memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  // Return the default page size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  static int    vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Return the page size to use for a region of memory.  The min_pages argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // is a hint intended to limit fragmentation; it says the returned page size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // should be <= region_max_size / min_pages.  Because min_pages is a hint,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // this routine may return a size larger than region_max_size / min_pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // The current implementation ignores min_pages if a larger page size is an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // exact multiple of both region_min_size and region_max_size.  This allows
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // larger pages to be used when doing so would not cause fragmentation; in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // particular, a single page can be used when region_min_size ==
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // region_max_size == a supported page size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  static size_t page_size_for_region(size_t region_min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
                                     size_t region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
                                     uint min_pages);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
   242
  // Methods for tracing page sizes returned by the above method; enabled by
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // TracePageSizes.  The region_{min,max}_size parameters should be the values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  // passed to page_size_for_region() and page_size should be the result of that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // call.  The (optional) base and size parameters should come from the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // ReservedSpace base() and size() methods.
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
   247
  static void trace_page_sizes(const char* str, const size_t* page_sizes,
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
   248
                               int count) PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  static void trace_page_sizes(const char* str, const size_t region_min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
                               const size_t region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
                               const size_t page_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
                               const char* base = NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
                               const size_t size = 0) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  static int    vm_allocation_granularity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  static char*  reserve_memory(size_t bytes, char* addr = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
                               size_t alignment_hint = 0);
14840
8994c2377547 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 14471
diff changeset
   258
  static char*  reserve_memory_aligned(size_t size, size_t alignment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  static char*  attempt_reserve_memory_at(size_t bytes, char* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  static void   split_reserved_memory(char *base, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
                                      size_t split, bool realloc);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   262
  static bool   commit_memory(char* addr, size_t bytes, bool executable = false);
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2259
diff changeset
   263
  static bool   commit_memory(char* addr, size_t size, size_t alignment_hint,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2259
diff changeset
   264
                              bool executable = false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  static bool   uncommit_memory(char* addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  static bool   release_memory(char* addr, size_t bytes);
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   267
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   268
  enum ProtType { MEM_PROT_NONE, MEM_PROT_READ, MEM_PROT_RW, MEM_PROT_RWX };
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   269
  static bool   protect_memory(char* addr, size_t bytes, ProtType prot,
1664
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 1388
diff changeset
   270
                               bool is_committed = true);
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   271
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  static bool   guard_memory(char* addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  static bool   unguard_memory(char* addr, size_t bytes);
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 4493
diff changeset
   274
  static bool   create_stack_guard_pages(char* addr, size_t bytes);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   275
  static bool   pd_create_stack_guard_pages(char* addr, size_t bytes);
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 4493
diff changeset
   276
  static bool   remove_stack_guard_pages(char* addr, size_t bytes);
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 4493
diff changeset
   277
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  static char*  map_memory(int fd, const char* file_name, size_t file_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
                           char *addr, size_t bytes, bool read_only = false,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
                           bool allow_exec = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  static char*  remap_memory(int fd, const char* file_name, size_t file_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
                             char *addr, size_t bytes, bool read_only,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
                             bool allow_exec);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static bool   unmap_memory(char *addr, size_t bytes);
11402
739e52129c84 7124829: NUMA: memory leak on Linux with large pages
iveresov
parents: 11256
diff changeset
   285
  static void   free_memory(char *addr, size_t bytes, size_t alignment_hint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  static void   realign_memory(char *addr, size_t bytes, size_t alignment_hint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // NUMA-specific interface
388
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   289
  static bool   numa_has_static_binding();
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   290
  static bool   numa_has_group_homing();
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   291
  static void   numa_make_local(char *addr, size_t bytes, int lgrp_hint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  static void   numa_make_global(char *addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  static size_t numa_get_groups_num();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  static size_t numa_get_leaf_groups(int *ids, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  static bool   numa_topology_changed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  static int    numa_get_group_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // Page manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  struct page_info {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    size_t size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    int lgrp_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  static bool   get_page_info(char *start, page_info* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  static char*  scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  static char*  non_memory_address_word();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // reserve, commit and pin the entire memory region
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2259
diff changeset
   308
  static char*  reserve_memory_special(size_t size, char* addr = NULL,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2259
diff changeset
   309
                bool executable = false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  static bool   release_memory_special(char* addr, size_t bytes);
9419
f0360dfe734d 7040485: Use transparent huge page on linux by default
iveresov
parents: 9125
diff changeset
   311
  static void   large_page_init();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  static size_t large_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  static bool   can_commit_large_page_memory();
252
050143a0dbfb 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 234
diff changeset
   314
  static bool   can_execute_large_page_memory();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // OS interface to polling page
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  static address get_polling_page()             { return _polling_page; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  static void    set_polling_page(address page) { _polling_page = page; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  static bool    is_poll_address(address addr)  { return addr >= _polling_page && addr < (_polling_page + os::vm_page_size()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  static void    make_polling_page_unreadable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  static void    make_polling_page_readable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // Routines used to serialize the thread state without using membars
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  static void    serialize_thread_states();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Since we write to the serialize page from every thread, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // want stores to be on unique cache lines whenever possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  // in order to minimize CPU cross talk.  We pre-compute the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // amount to shift the thread* to make this offset unique to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  // each thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  static int     get_serialize_page_shift_count() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    return SerializePageShiftCount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  static void     set_serialize_page_mask(uintptr_t mask) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    _serialize_page_mask = mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  static unsigned int  get_serialize_page_mask() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    return _serialize_page_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  static void    set_memory_serialize_page(address page);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  static address get_memory_serialize_page() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    return (address)_mem_serialize_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  static inline void write_memory_serialize_page(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    uintptr_t page_offset = ((uintptr_t)thread >>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
                            get_serialize_page_shift_count()) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
                            get_serialize_page_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    *(volatile int32_t *)((uintptr_t)_mem_serialize_page+page_offset) = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  static bool    is_memory_serialize_page(JavaThread *thread, address addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    if (UseMembar) return false;
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   358
    // Previously this function calculated the exact address of this
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   359
    // thread's serialize page, and checked if the faulting address
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   360
    // was equal.  However, some platforms mask off faulting addresses
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   361
    // to the page size, so now we just check that the address is
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   362
    // within the page.  This makes the thread argument unnecessary,
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   363
    // but we retain the NULL check to preserve existing behaviour.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    if (thread == NULL) return false;
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   365
    address page = (address) _mem_serialize_page;
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   366
    return addr >= page && addr < (page + os::vm_page_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  static void block_on_serialize_page_trap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  enum ThreadType {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    vm_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    cgc_thread,        // Concurrent GC thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    pgc_thread,        // Parallel GC thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    compiler_thread,
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   379
    watcher_thread,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   380
    os_thread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  static bool create_thread(Thread* thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
                            ThreadType thr_type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
                            size_t stack_size = 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  static bool create_main_thread(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  static bool create_attached_thread(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  static void pd_start_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  static void start_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
13859
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13198
diff changeset
   391
  static void initialize_thread(Thread* thr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  static void free_thread(OSThread* osthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  static intx current_thread_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  static int current_process_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  static int sleep(Thread* thread, jlong ms, bool interruptable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  static int naked_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  static void infinite_sleep(); // never returns, use with CAUTION
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  static void yield();        // Yields to all threads with same priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  enum YieldResult {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    YIELD_SWITCHED = 1,         // caller descheduled, other ready threads exist & ran
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    YIELD_NONEREADY = 0,        // No other runnable/ready threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
                                // platform-specific yield return immediately
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    YIELD_UNKNOWN = -1          // Unknown: platform doesn't support _SWITCHED or _NONEREADY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    // YIELD_SWITCHED and YIELD_NONREADY imply the platform supports a "strong"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    // yield that can be used in lieu of blocking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  } ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  static YieldResult NakedYield () ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  static void yield_all(int attempts = 0); // Yields to all other threads including lower priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  static void loop_breaker(int attempts);  // called from within tight loops to possibly influence time-sharing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  static OSReturn set_priority(Thread* thread, ThreadPriority priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  static OSReturn get_priority(const Thread* const thread, ThreadPriority& priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  static void interrupt(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  static bool is_interrupted(Thread* thread, bool clear_interrupted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  static int pd_self_suspend_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  static ExtendedPC fetch_frame_from_context(void* ucVoid, intptr_t** sp, intptr_t** fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  static frame      fetch_frame_from_context(void* ucVoid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  static ExtendedPC get_thread_pc(Thread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  static void breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  static address current_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  static address current_stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  static size_t current_stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
11961
0abd4cd26e5a 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 11601
diff changeset
   430
  static void verify_stack_alignment() PRODUCT_RETURN;
0abd4cd26e5a 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 11601
diff changeset
   431
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  static int message_box(const char* title, const char* message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  static char* do_you_want_to_debug(const char* message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // run cmd in a separate process and return its exit code; or -1 on failures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  static int fork_and_exec(char *cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // Set file to send error reports.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  static void set_error_file(const char *logfile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // os::exit() is merged with vm_exit()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  // static void exit(int num);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // Terminate the VM, but don't exit the process
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  static void shutdown();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // Terminate with an error.  Default is to generate a core file on platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // that support such things.  This calls shutdown() and then aborts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  static void abort(bool dump_core = true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // Die immediately, no exit hook, no abort hook, no cleanup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  static void die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   454
  // File i/o operations
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   455
  static const int default_file_open_flags();
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   456
  static int open(const char *path, int oflag, int mode);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   457
  static int close(int fd);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   458
  static jlong lseek(int fd, jlong offset, int whence);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   459
  static char* native_path(char *path);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   460
  static int ftruncate(int fd, jlong length);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   461
  static int fsync(int fd);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   462
  static int available(int fd, jlong *bytes);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   463
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   464
  //File i/o operations
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   465
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   466
  static size_t read(int fd, void *buf, unsigned int nBytes);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   467
  static size_t restartable_read(int fd, void *buf, unsigned int nBytes);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   468
  static size_t write(int fd, const void *buf, unsigned int nBytes);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   469
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // Reading directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  static DIR*           opendir(const char* dirname);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  static int            readdir_buf_size(const char *path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  static struct dirent* readdir(DIR* dirp, dirent* dbuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  static int            closedir(DIR* dirp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  // Dynamic library extension
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  static const char*    dll_file_extension();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  static const char*    get_temp_directory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  static const char*    get_current_directory(char *buf, int buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   482
  // Builds a platform-specific full library path given a ld path and lib name
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 13859
diff changeset
   483
  // Returns true if buffer contains full path to existing file, false otherwise
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 13859
diff changeset
   484
  static bool           dll_build_name(char* buffer, size_t size,
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   485
                                       const char* pathname, const char* fname);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   486
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  // Symbol lookup, find nearest function name; basically it implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  // dladdr() for all platforms. Name of the nearest function is copied
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  // to buf. Distance from its base address is returned as offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // If function name is not found, buf[0] is set to '\0' and offset is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // set to -1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  static bool dll_address_to_function_name(address addr, char* buf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
                                           int buflen, int* offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  // Locate DLL/DSO. On success, full path of the library is copied to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  // buf, and offset is set to be the distance between addr and the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // library's base address. On failure, buf[0] is set to '\0' and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  // offset is set to -1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  static bool dll_address_to_library_name(address addr, char* buf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
                                          int buflen, int* offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  // Find out whether the pc is in the static code for jvm.dll/libjvm.so.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  static bool address_is_in_vm(address addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Loads .dll/.so and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  // in case of error it checks if .dll/.so was built for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // same architecture as Hotspot is running on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  static void* dll_load(const char *name, char *ebuf, int ebuflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   510
  // lookup symbol in a shared library
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   511
  static void* dll_lookup(void* handle, const char* name);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   512
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   513
  // Unload library
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   514
  static void  dll_unload(void *lib);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   515
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  // Print out system information; they are called by fatal error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // Output format may be different on different platforms.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  static void print_os_info(outputStream* st);
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   519
  static void print_os_info_brief(outputStream* st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  static void print_cpu_info(outputStream* st);
10023
e99d9a03c0f5 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 9419
diff changeset
   521
  static void pd_print_cpu_info(outputStream* st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  static void print_memory_info(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  static void print_dll_info(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  static void print_environment_variables(outputStream* st, const char** env_list, char* buffer, int len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  static void print_context(outputStream* st, void* context);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
   526
  static void print_register_info(outputStream* st, void* context);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  static void print_siginfo(outputStream* st, void* siginfo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  static void print_signal_handlers(outputStream* st, char* buf, size_t buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  static void print_date_and_time(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
   531
  static void print_location(outputStream* st, intptr_t x, bool verbose = false);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   532
  static size_t lasterror(char *buf, size_t len);
11418
66ca80da30e2 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 11417
diff changeset
   533
  static int get_last_error();
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   534
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   535
  // Determines whether the calling process is being debugged by a user-mode debugger.
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   536
  static bool is_debugger_attached();
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   537
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   538
  // wait for a key press if PauseAtExit is set
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   539
  static void wait_for_keypress_at_exit(void);
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   540
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // The following two functions are used by fatal error handler to trace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  // native (C) frames. They are not part of frame.hpp/frame.cpp because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  // frame.hpp/cpp assume thread is JavaThread, and also because different
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // OS/compiler may have different convention or provide different API to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // walk C frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  // We don't attempt to become a debugger, so we only follow frames if that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  // does not require a lookup in the unwind table, which is part of the binary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // file but may be unsafe to read after a fatal error. So on x86, we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // only walk stack if %ebp is used as frame pointer; on ia64, it's not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  // possible to walk C stack without having the unwind table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  static bool is_first_C_frame(frame *fr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  static frame get_sender_for_C_frame(frame *fr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  // return current frame. pc() and sp() are set to NULL on failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  static frame      current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  static void print_hex_dump(outputStream* st, address start, address end, int unitsize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  // returns a string to describe the exception/signal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  // returns NULL if exception_code is not an OS exception/signal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  static const char* exception_name(int exception_code, char* buf, size_t buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  // Returns native Java library, loads if necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  static void*    native_java_library();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   567
  // Fills in path to jvm.dll/libjvm.so (used by the Disassembler)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  static void     jvm_path(char *buf, jint buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   570
  // Returns true if we are running in a headless jre.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   571
  static bool     is_headless_jre();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   572
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  // JNI names
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  static void     print_jni_name_prefix_on(outputStream* st, int args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  static void     print_jni_name_suffix_on(outputStream* st, int args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  // File conventions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  static const char* file_separator();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  static const char* line_separator();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  static const char* path_separator();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  // Init os specific system properties values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  static void init_system_properties_values();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  // IO operations, non-JVM_ version.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  static int stat(const char* path, struct stat* sbuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  static bool dir_is_empty(const char* path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  // IO operations on binary files
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  static int create_binary_file(const char* path, bool rewrite_existing);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  static jlong current_file_offset(int fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  static jlong seek_to_file_offset(int fd, jlong offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // Thread Local Storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  static int   allocate_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  static void  thread_local_storage_at_put(int index, void* value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  static void* thread_local_storage_at(int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  static void  free_thread_local_storage(int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   600
  // Stack walk
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   601
  static address get_caller_pc(int n = 0);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   602
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  // General allocation (must be MT-safe)
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   604
  static void* malloc  (size_t size, MEMFLAGS flags, address caller_pc = 0);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   605
  static void* realloc (void *memblock, size_t size, MEMFLAGS flags, address caller_pc = 0);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   606
  static void  free    (void *memblock, MEMFLAGS flags = mtNone);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  static bool  check_heap(bool force = false);      // verify C heap integrity
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   608
  static char* strdup(const char *, MEMFLAGS flags = mtInternal);  // Like strdup
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
#ifndef PRODUCT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   611
  static julong num_mallocs;         // # of calls to malloc/realloc
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   612
  static julong alloc_bytes;         // # of bytes allocated
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   613
  static julong num_frees;           // # of calls to free
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   614
  static julong free_bytes;          // # of bytes freed
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   617
  // SocketInterface (ex HPI SocketInterface )
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   618
  static int socket(int domain, int type, int protocol);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   619
  static int socket_close(int fd);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   620
  static int socket_shutdown(int fd, int howto);
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   621
  static int recv(int fd, char* buf, size_t nBytes, uint flags);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   622
  static int send(int fd, char* buf, size_t nBytes, uint flags);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   623
  static int raw_send(int fd, char* buf, size_t nBytes, uint flags);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   624
  static int timeout(int fd, long timeout);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   625
  static int listen(int fd, int count);
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   626
  static int connect(int fd, struct sockaddr* him, socklen_t len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   627
  static int bind(int fd, struct sockaddr* him, socklen_t len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   628
  static int accept(int fd, struct sockaddr* him, socklen_t* len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   629
  static int recvfrom(int fd, char* buf, size_t nbytes, uint flags,
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   630
                      struct sockaddr* from, socklen_t* fromlen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   631
  static int get_sock_name(int fd, struct sockaddr* him, socklen_t* len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   632
  static int sendto(int fd, char* buf, size_t len, uint flags,
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   633
                    struct sockaddr* to, socklen_t tolen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   634
  static int socket_available(int fd, jint* pbytes);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   635
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   636
  static int get_sock_opt(int fd, int level, int optname,
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   637
                          char* optval, socklen_t* optlen);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   638
  static int set_sock_opt(int fd, int level, int optname,
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   639
                          const char* optval, socklen_t optlen);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   640
  static int get_host_name(char* name, int namelen);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   641
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   642
  static struct hostent* get_host_by_name(char* name);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   643
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  // Support for signals (see JVM_RaiseSignal, JVM_RegisterSignal)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  static void  signal_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  static void  signal_init_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  static void  signal_notify(int signal_number);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  static void* signal(int signal_number, void* handler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  static void  signal_raise(int signal_number);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  static int   signal_wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  static int   signal_lookup();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  static void* user_handler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  static void  terminate_signal_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  static int   sigexitnum_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  // random number generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  static long random();                    // return 32bit pseudorandom number
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  static void init_random(long initval);   // initialize random sequence
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  // Structured OS Exception support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  static void os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8107
diff changeset
   663
  // On Windows this will create an actual minidump, on Linux/Solaris it will simply check core dump limits
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8107
diff changeset
   664
  static void check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize);
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8107
diff changeset
   665
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   666
  // Get the default path to the core file
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   667
  // Returns the length of the string
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   668
  static int get_core_path(char* buffer, size_t bufferSize);
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   669
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  // JVMTI & JVM monitoring and management support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  // The thread_cpu_time() and current_thread_cpu_time() are only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  // supported if is_thread_cpu_time_supported() returns true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  // They are not supported on Solaris T1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  // Thread CPU Time - return the fast estimate on a platform
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  // On Solaris - call gethrvtime (fast) - user time only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  // On Linux   - fast clock_gettime where available - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  //            - otherwise: very slow /proc fs - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  // On Windows - GetThreadTimes - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  static jlong current_thread_cpu_time();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  static jlong thread_cpu_time(Thread* t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  // Thread CPU Time with user_sys_cpu_time parameter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // If user_sys_cpu_time is true, user+sys time is returned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  // Otherwise, only user time is returned
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  static jlong current_thread_cpu_time(bool user_sys_cpu_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  static jlong thread_cpu_time(Thread* t, bool user_sys_cpu_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  // Return a bunch of info about the timers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  // Note that the returned info for these two functions may be different
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  // on some platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  static void current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  static void thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  static bool is_thread_cpu_time_supported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  // System loadavg support.  Returns -1 if load average cannot be obtained.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  static int loadavg(double loadavg[], int nelem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // Hook for os specific jvm options that we don't want to abort on seeing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  static bool obsolete_option(const JavaVMOption *option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
9125
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8478
diff changeset
   704
  // Read file line by line. If line is longer than bsize,
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8478
diff changeset
   705
  // rest of line is skipped. Returns number of bytes read or -1 on EOF
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8478
diff changeset
   706
  static int get_line_chars(int fd, char *buf, const size_t bsize);
3b9a527cd492 7017193: Small memory leak in get_stack_bounds os::create_stack_guard_pages
dsamersoff
parents: 8478
diff changeset
   707
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   708
  // Extensions
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   709
#include "runtime/os_ext.hpp"
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   710
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   711
 public:
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   712
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  // Platform dependent stuff
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   714
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   715
# include "os_linux.hpp"
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   716
# include "os_posix.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   717
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   718
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   719
# include "os_solaris.hpp"
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   720
# include "os_posix.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   721
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   722
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   723
# include "os_windows.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   724
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   725
#ifdef TARGET_OS_FAMILY_bsd
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   726
# include "os_posix.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   727
# include "os_bsd.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   728
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   729
#ifdef TARGET_OS_ARCH_linux_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   730
# include "os_linux_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   731
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   732
#ifdef TARGET_OS_ARCH_linux_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   733
# include "os_linux_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   734
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   735
#ifdef TARGET_OS_ARCH_linux_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   736
# include "os_linux_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   737
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   738
#ifdef TARGET_OS_ARCH_solaris_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   739
# include "os_solaris_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   740
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   741
#ifdef TARGET_OS_ARCH_solaris_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   742
# include "os_solaris_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   743
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   744
#ifdef TARGET_OS_ARCH_windows_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   745
# include "os_windows_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   746
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   747
#ifdef TARGET_OS_ARCH_linux_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   748
# include "os_linux_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   749
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   750
#ifdef TARGET_OS_ARCH_linux_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   751
# include "os_linux_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   752
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   753
#ifdef TARGET_OS_ARCH_bsd_x86
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   754
# include "os_bsd_x86.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   755
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   756
#ifdef TARGET_OS_ARCH_bsd_zero
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   757
# include "os_bsd_zero.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   758
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   759
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   760
 public:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   761
  // debugging support (mostly used by debug.cpp but also fatal error handler)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   762
  static bool find(address pc, outputStream* st = tty); // OS specific function to make sense out of an address
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  static bool dont_yield();                     // when true, JVM_Yield() is nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  static void print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  // Thread priority helpers (implemented in OS-specific part)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  static OSReturn set_native_priority(Thread* thread, int native_prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  static OSReturn get_native_priority(const Thread* const thread, int* priority_ptr);
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11423
diff changeset
   770
  static int java_to_os_priority[CriticalPriority + 1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  // Hint to the underlying OS that a task switch would not be good.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  // Void return because it's a hint and can fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  static void hint_no_preempt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  // Used at creation if requested by the diagnostic flag PauseAtStartup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  // Causes the VM to wait until an external stimulus has been applied
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  // (for Unix, that stimulus is a signal, for Windows, an external
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  // ResumeThread call)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  static void pause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  static long _rand_seed;                   // seed for random number generator
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  static int _processor_count;              // number of processors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  static char* format_boot_path(const char* format_string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
                                const char* home,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
                                int home_len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
                                char fileSep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
                                char pathSep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  static bool set_boot_path(char fileSep, char pathSep);
2358
7c8346929fc6 6819213: revive sun.boot.library.path
phh
parents: 2268
diff changeset
   791
  static char** split_path(const char* path, int* n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
// Note that "PAUSE" is almost always used with synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
// so arguably we should provide Atomic::SpinPause() instead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
// of the global SpinPause() with C linkage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
// It'd also be eligible for inlining on many platforms.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
extern "C" int SpinPause () ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
extern "C" int SafeFetch32 (int * adr, int errValue) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t errValue) ;
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   802
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   803
#endif // SHARE_VM_RUNTIME_OS_HPP