hotspot/src/share/vm/runtime/os.hpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 37179 4dbcb3a642d2
child 37462 58bb9394a98b
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35479
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35176
diff changeset
     2
 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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/extendedPC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    30
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    32
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    33
# include "jvm_linux.h"
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
    34
# include <setjmp.h>
7397
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"
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
    38
# include <setjmp.h>
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    39
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    40
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    41
# include "jvm_windows.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    42
#endif
22827
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
    43
#ifdef TARGET_OS_FAMILY_aix
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
    44
# include "jvm_aix.h"
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
    45
# include <setjmp.h>
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
    46
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    47
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    48
# include "jvm_bsd.h"
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
    49
# include <setjmp.h>
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23865
diff changeset
    50
# ifdef __APPLE__
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23865
diff changeset
    51
#  include <mach/mach_time.h>
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23865
diff changeset
    52
# endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
    53
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    54
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
    55
class AgentLibrary;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
    56
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
// os defines the interface to operating system; this includes traditional
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// OS services (time, I/O) as well as other functionality with system-
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// dependent code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
typedef void (*dll_func)(...);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
class Thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
class JavaThread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
class Event;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
class DLL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
class FileHandle;
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
    68
class NativeCallStack;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
    69
388
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
    70
template<class E> class GrowableArray;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
// %%%%% Moved ThreadState, START_FN, OSThread to new osThread.hpp. -- Rose
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// Platform-independent error return values from OS functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
enum OSReturn {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  OS_OK         =  0,        // Operation was successful
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  OS_ERR        = -1,        // Operation failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  OS_INTRPT     = -2,        // Operation was interrupted
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  OS_TIMEOUT    = -3,        // Operation timed out
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  OS_NOMEM      = -5,        // Operation failed for lack of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  OS_NORESOURCE = -6         // Operation failed for lack of nonmemory resource
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
enum ThreadPriority {        // JLS 20.20.1-3
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  NoPriority       = -1,     // Initial non-priority value
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  MinPriority      =  1,     // Minimum priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  NormPriority     =  5,     // Normal (non-daemon) priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  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
    89
  MaxPriority      = 10,     // Highest priority, used for WatcherThread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
                             // 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
    91
  CriticalPriority = 11      // Critical thread priority
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
    94
// Executable parameter flag for os::commit_memory() and
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
    95
// os::commit_memory_or_exit().
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
    96
const bool ExecMem = true;
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
    97
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// Typedef for structured exception handling support
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 31963
diff changeset
    99
typedef void (*java_call_t)(JavaValue* value, const methodHandle& method, JavaCallArguments* args, Thread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   101
class MallocTracker;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   102
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
class os: AllStatic {
20011
d74937287461 8024760: add more types, fields and constants to VMStructs
twisti
parents: 19697
diff changeset
   104
  friend class VMStructs;
35123
b0b89d83bcf5 8134994: use separate VMStructs databases for SA and JVMCI
twisti
parents: 34305
diff changeset
   105
  friend class JVMCIVMStructs;
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   106
  friend class MallocTracker;
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   107
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   110
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  static OSThread*          _starting_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  static address            _polling_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  static volatile int32_t * _mem_serialize_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  static uintptr_t          _serialize_page_mask;
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   115
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  static size_t             _page_sizes[page_sizes_max];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   118
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  static void init_page_sizes(size_t default_page_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    _page_sizes[0] = default_page_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    _page_sizes[1] = 0; // sentinel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   124
  static char*  pd_reserve_memory(size_t bytes, char* addr = 0,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   125
                               size_t alignment_hint = 0);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   126
  static char*  pd_attempt_reserve_memory_at(size_t bytes, char* addr);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   127
  static void   pd_split_reserved_memory(char *base, size_t size,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   128
                                      size_t split, bool realloc);
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   129
  static bool   pd_commit_memory(char* addr, size_t bytes, bool executable);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   130
  static bool   pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   131
                                 bool executable);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   132
  // Same as pd_commit_memory() that either succeeds or calls
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   133
  // vm_exit_out_of_memory() with the specified mesg.
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   134
  static void   pd_commit_memory_or_exit(char* addr, size_t bytes,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   135
                                         bool executable, const char* mesg);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   136
  static void   pd_commit_memory_or_exit(char* addr, size_t size,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   137
                                         size_t alignment_hint,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   138
                                         bool executable, const char* mesg);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   139
  static bool   pd_uncommit_memory(char* addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   140
  static bool   pd_release_memory(char* addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   141
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   142
  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
   143
                           char *addr, size_t bytes, bool read_only = false,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   144
                           bool allow_exec = false);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   145
  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
   146
                             char *addr, size_t bytes, bool read_only,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   147
                             bool allow_exec);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   148
  static bool   pd_unmap_memory(char *addr, size_t bytes);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   149
  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
   150
  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
   151
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   152
  static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   153
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31357
diff changeset
   154
  // Get summary strings for system information in buffer provided
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31357
diff changeset
   155
  static void  get_summary_cpu_info(char* buf, size_t buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31357
diff changeset
   156
  static void  get_summary_os_info(char* buf, size_t buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31357
diff changeset
   157
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
 public:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   159
  static void init(void);                      // Called before command line parsing
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   160
  static void init_before_ergo(void);          // Called after command line parsing
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   161
                                               // before VM ergonomics processing.
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   162
  static jint init_2(void);                    // Called after command line parsing
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   163
                                               // and VM ergonomics processing
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   164
  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
   165
    init_globals_ext();
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   166
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // File names are case-insensitive on windows only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // Override me as needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  static int    file_name_strcmp(const char* s1, const char* s2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29193
diff changeset
   172
  // unset environment variable
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   173
  static bool unsetenv(const char* name);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   174
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  static bool have_special_privileges();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  static jlong  javaTimeMillis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  static jlong  javaTimeNanos();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  static void   javaTimeNanos_info(jvmtiTimerInfo *info_ptr);
28737
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28208
diff changeset
   180
  static void   javaTimeSystemUTC(jlong &seconds, jlong &nanos);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  static void   run_periodic_checks();
22891
1f5d1fff23fa 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 22758
diff changeset
   182
  static bool   supports_monotonic_clock();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  // Returns the elapsed time in seconds since the vm started.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  static double elapsedTime();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Returns real time in seconds since an arbitrary point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // in the past.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  static bool getTimesSecs(double* process_real_time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
                           double* process_user_time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
                           double* process_system_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Interface to the performance counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  static jlong elapsed_counter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  static jlong elapsed_frequency();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   197
  // 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
   198
  // actually run.  The first function indicates whether the OS supports
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   199
  // this functionality for the current thread, and if so:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   200
  //   * the second enables vtime tracking (if that is required).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   201
  //   * the third tells whether vtime is enabled.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   202
  //   * the fourth returns the elapsed virtual time for the current
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   203
  //     thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   204
  static bool supports_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   205
  static bool enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   206
  static bool vtime_enabled();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   207
  static double elapsedVTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 388
diff changeset
   208
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // Return current local time in a string (YYYY-MM-DD HH:MM:SS).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // It is MT safe, but not async-safe, as reading time zone
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // information may require a lock on some platforms.
2012
041fbc6030dd 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 1664
diff changeset
   212
  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
   213
  static struct tm* localtime_pd     (const time_t* clock, struct tm*  res);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // Fill in buffer with current local time as an ISO-8601 string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // Returns buffer, or NULL if it failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  static char* iso8601_time(char* buffer, size_t buffer_length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // Interface for detecting multiprocessor system
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  static inline bool is_MP() {
26680
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   221
    // During bootstrap if _processor_count is not yet initialized
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   222
    // we claim to be MP as that is safest. If any platform has a
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   223
    // stub generator that might be triggered in this phase and for
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   224
    // which being declared MP when in fact not, is a problem - then
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   225
    // the bootstrap routine for the stub generator needs to check
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   226
    // the processor count directly and leave the bootstrap routine
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   227
    // in place until called after initialization has ocurred.
1f181bd352ce 8056183: os::is_MP() always reports true when NMT is enabled
dholmes
parents: 26557
diff changeset
   228
    return (_processor_count != 1) || AssumeMP;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  static julong available_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  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
   232
  static bool has_allocatable_memory_limit(julong* limit);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  static bool is_server_class_machine();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // number of CPUs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  static int processor_count() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    return _processor_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  }
4493
9204129f065e 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 4448
diff changeset
   239
  static void set_processor_count(int count) { _processor_count = count; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // Returns the number of CPUs this process is currently allowed to run on.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // Note that on some OSes this can change dynamically.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  static int active_processor_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Bind processes to processors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  //     This is a two step procedure:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  //     first you generate a distribution of processes to processors,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  //     then you bind processes according to that distribution.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Compute a distribution for number of processes to processors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  //    Stores the processor id's into the distribution array argument.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  //    Returns true if it worked, false if it didn't.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  static bool distribute_processes(uint length, uint* distribution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // Binds the current process to a processor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  //    Returns true if it worked, false if it didn't.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  static bool bind_to_processor(uint processor_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   257
  // Give a name to the current thread.
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   258
  static void set_native_thread_name(const char *name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   259
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // Interface for stack banging (predetect possible stack overflow for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // exception processing)  There are guard pages, and above that shadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // pages for stack overflow checking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  static bool uses_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  static bool allocate_stack_guard_pages();
35479
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35176
diff changeset
   265
  static void map_stack_shadow_pages();
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 31963
diff changeset
   266
  static bool stack_shadow_pages_available(Thread *thread, const methodHandle& method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // OS interface to Virtual Memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // Return the default page size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  static int    vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26589
diff changeset
   273
  // Returns the page size to use for a region of memory.
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26589
diff changeset
   274
  // region_size / min_pages will always be greater than or equal to the
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   275
  // returned value. The returned value will divide region_size.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   276
  static size_t page_size_for_region_aligned(size_t region_size, size_t min_pages);
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   277
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   278
  // Returns the page size to use for a region of memory.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   279
  // region_size / min_pages will always be greater than or equal to the
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   280
  // returned value. The returned value might not divide region_size.
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28208
diff changeset
   281
  static size_t page_size_for_region_unaligned(size_t region_size, size_t min_pages);
26700
8107d0778244 8049864: TestParallelHeapSizeFlags fails with unexpected heap size
ehelin
parents: 26589
diff changeset
   282
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   283
  // Return the largest page size that can be used
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   284
  static size_t max_page_size() {
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   285
    // The _page_sizes array is sorted in descending order.
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   286
    return _page_sizes[0];
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19697
diff changeset
   287
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
   289
  // Methods for tracing page sizes returned by the above method; enabled by
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // TracePageSizes.  The region_{min,max}_size parameters should be the values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // passed to page_size_for_region() and page_size should be the result of that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // call.  The (optional) base and size parameters should come from the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // ReservedSpace base() and size() methods.
10272
9377a9510c83 6791672: enable 1G and larger pages on solaris
jcoomes
parents: 10023
diff changeset
   294
  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
   295
                               int count) PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  static void trace_page_sizes(const char* str, const size_t region_min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
                               const size_t region_max_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
                               const size_t page_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
                               const char* base = NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
                               const size_t size = 0) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  static int    vm_allocation_granularity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  static char*  reserve_memory(size_t bytes, char* addr = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
                               size_t alignment_hint = 0);
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 17121
diff changeset
   305
  static char*  reserve_memory(size_t bytes, char* addr,
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 17121
diff changeset
   306
                               size_t alignment_hint, MEMFLAGS flags);
14840
8994c2377547 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 14471
diff changeset
   307
  static char*  reserve_memory_aligned(size_t size, size_t alignment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  static char*  attempt_reserve_memory_at(size_t bytes, char* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  static void   split_reserved_memory(char *base, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
                                      size_t split, bool realloc);
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   311
  static bool   commit_memory(char* addr, size_t bytes, bool executable);
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2259
diff changeset
   312
  static bool   commit_memory(char* addr, size_t size, size_t alignment_hint,
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   313
                              bool executable);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   314
  // Same as commit_memory() that either succeeds or calls
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   315
  // vm_exit_out_of_memory() with the specified mesg.
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   316
  static void   commit_memory_or_exit(char* addr, size_t bytes,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   317
                                      bool executable, const char* mesg);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   318
  static void   commit_memory_or_exit(char* addr, size_t size,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   319
                                      size_t alignment_hint,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
   320
                                      bool executable, const char* mesg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  static bool   uncommit_memory(char* addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  static bool   release_memory(char* addr, size_t bytes);
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   323
28208
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
   324
  // Touch memory pages that cover the memory range from start to end (exclusive)
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
   325
  // to make the OS back the memory range with actual memory.
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
   326
  // Current implementation may not touch the last page if unaligned addresses
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
   327
  // are passed.
37046
88fbf4e7b9c6 8151414: os::pretouch_memory should take void* instead of char*
tschatzl
parents: 36174
diff changeset
   328
  static void   pretouch_memory(void* start, void* end);
28208
d67f748ece0a 8067469: G1 ignores AlwaysPreTouch
tschatzl
parents: 27926
diff changeset
   329
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   330
  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
   331
  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
   332
                               bool is_committed = true);
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   333
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  static bool   guard_memory(char* addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  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
   336
  static bool   create_stack_guard_pages(char* addr, size_t bytes);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   337
  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
   338
  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
   339
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  static char*  map_memory(int fd, const char* file_name, size_t file_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
                           char *addr, size_t bytes, bool read_only = false,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
                           bool allow_exec = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  static char*  remap_memory(int fd, const char* file_name, size_t file_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
                             char *addr, size_t bytes, bool read_only,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
                             bool allow_exec);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  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
   347
  static void   free_memory(char *addr, size_t bytes, size_t alignment_hint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  static void   realign_memory(char *addr, size_t bytes, size_t alignment_hint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // NUMA-specific interface
388
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   351
  static bool   numa_has_static_binding();
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   352
  static bool   numa_has_group_homing();
bcc631c5bbec 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 252
diff changeset
   353
  static void   numa_make_local(char *addr, size_t bytes, int lgrp_hint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  static void   numa_make_global(char *addr, size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  static size_t numa_get_groups_num();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  static size_t numa_get_leaf_groups(int *ids, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  static bool   numa_topology_changed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  static int    numa_get_group_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  // Page manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  struct page_info {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    size_t size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    int lgrp_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  static bool   get_page_info(char *start, page_info* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  static char*  scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  static char*  non_memory_address_word();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // reserve, commit and pin the entire memory region
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 18945
diff changeset
   370
  static char*  reserve_memory_special(size_t size, size_t alignment,
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 18945
diff changeset
   371
                                       char* addr, bool executable);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  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
   373
  static void   large_page_init();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  static size_t large_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  static bool   can_commit_large_page_memory();
252
050143a0dbfb 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 234
diff changeset
   376
  static bool   can_execute_large_page_memory();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  // OS interface to polling page
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  static address get_polling_page()             { return _polling_page; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  static void    set_polling_page(address page) { _polling_page = page; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  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
   382
  static void    make_polling_page_unreadable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  static void    make_polling_page_readable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // Routines used to serialize the thread state without using membars
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  static void    serialize_thread_states();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // Since we write to the serialize page from every thread, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  // want stores to be on unique cache lines whenever possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  // in order to minimize CPU cross talk.  We pre-compute the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  // amount to shift the thread* to make this offset unique to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  // each thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  static int     get_serialize_page_shift_count() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    return SerializePageShiftCount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  static void     set_serialize_page_mask(uintptr_t mask) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    _serialize_page_mask = mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  static unsigned int  get_serialize_page_mask() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    return _serialize_page_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  static void    set_memory_serialize_page(address page);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  static address get_memory_serialize_page() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    return (address)_mem_serialize_page;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  static inline void write_memory_serialize_page(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    uintptr_t page_offset = ((uintptr_t)thread >>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
                            get_serialize_page_shift_count()) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
                            get_serialize_page_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
    *(volatile int32_t *)((uintptr_t)_mem_serialize_page+page_offset) = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  static bool    is_memory_serialize_page(JavaThread *thread, address addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    if (UseMembar) return false;
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   420
    // Previously this function calculated the exact address of this
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   421
    // thread's serialize page, and checked if the faulting address
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   422
    // was equal.  However, some platforms mask off faulting addresses
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   423
    // 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
   424
    // within the page.  This makes the thread argument unnecessary,
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 20022
diff changeset
   425
    // but we retain the NULL check to preserve existing behavior.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
    if (thread == NULL) return false;
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   427
    address page = (address) _mem_serialize_page;
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 2358
diff changeset
   428
    return addr >= page && addr < (page + os::vm_page_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  static void block_on_serialize_page_trap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  enum ThreadType {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    vm_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    cgc_thread,        // Concurrent GC thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    pgc_thread,        // Parallel GC thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    compiler_thread,
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   441
    watcher_thread,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   442
    os_thread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  static bool create_thread(Thread* thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
                            ThreadType thr_type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
                            size_t stack_size = 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  static bool create_main_thread(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  static bool create_attached_thread(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  static void pd_start_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  static void start_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
13859
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13198
diff changeset
   453
  static void initialize_thread(Thread* thr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  static void free_thread(OSThread* osthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  static intx current_thread_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  static int current_process_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  static int sleep(Thread* thread, jlong ms, bool interruptable);
22533
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 20022
diff changeset
   460
  // Short standalone OS sleep suitable for slow path spin loop.
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 20022
diff changeset
   461
  // Ignores Thread.interrupt() (so keep it short).
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 20022
diff changeset
   462
  // ms = 0, will sleep for the least amount of time allowed by the OS.
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 20022
diff changeset
   463
  static void naked_short_sleep(jlong ms);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  static void infinite_sleep(); // never returns, use with CAUTION
25477
7dad9f95fd31 8047714: Fix for JDK-6546236 made Solaris os::yield() a no-op
fparain
parents: 25469
diff changeset
   465
  static void naked_yield () ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  static OSReturn set_priority(Thread* thread, ThreadPriority priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  static OSReturn get_priority(const Thread* const thread, ThreadPriority& priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  static void interrupt(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  static bool is_interrupted(Thread* thread, bool clear_interrupted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  static int pd_self_suspend_thread(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
35077
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   474
  static ExtendedPC fetch_frame_from_context(const void* ucVoid, intptr_t** sp, intptr_t** fp);
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   475
  static frame      fetch_frame_from_context(const void* ucVoid);
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34633
diff changeset
   476
  static frame      fetch_frame_from_ucontext(Thread* thread, void* ucVoid);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  static ExtendedPC get_thread_pc(Thread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  static void breakpoint();
34305
e399e6b44631 8136978: Much nearly duplicated code for vmError support
sebastian
parents: 33766
diff changeset
   480
  static bool start_debugging(char *buf, int buflen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  static address current_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  static address current_stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  static size_t current_stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
11961
0abd4cd26e5a 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 11601
diff changeset
   486
  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
   487
34305
e399e6b44631 8136978: Much nearly duplicated code for vmError support
sebastian
parents: 33766
diff changeset
   488
  static bool message_box(const char* title, const char* message);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  static char* do_you_want_to_debug(const char* message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // run cmd in a separate process and return its exit code; or -1 on failures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  static int fork_and_exec(char *cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
26682
f339669ba825 8057744: (process) Synchronize exiting of threads and process [win]
igerasim
parents: 26680
diff changeset
   494
  // Call ::exit() on all platforms but Windows
f339669ba825 8057744: (process) Synchronize exiting of threads and process [win]
igerasim
parents: 26680
diff changeset
   495
  static void exit(int num);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // Terminate the VM, but don't exit the process
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  static void shutdown();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  // Terminate with an error.  Default is to generate a core file on platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  // that support such things.  This calls shutdown() and then aborts.
35077
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   502
  static void abort(bool dump_core, void *siginfo, const void *context);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  static void abort(bool dump_core = true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Die immediately, no exit hook, no abort hook, no cleanup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  static void die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   508
  // File i/o operations
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   509
  static const int default_file_open_flags();
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   510
  static int open(const char *path, int oflag, int mode);
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16610
diff changeset
   511
  static FILE* open(int fd, const char* mode);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   512
  static int close(int fd);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   513
  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
   514
  static char* native_path(char *path);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   515
  static int ftruncate(int fd, jlong length);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   516
  static int fsync(int fd);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   517
  static int available(int fd, jlong *bytes);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   518
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   519
  //File i/o operations
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   520
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   521
  static size_t read(int fd, void *buf, unsigned int nBytes);
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27473
diff changeset
   522
  static size_t read_at(int fd, void *buf, unsigned int nBytes, jlong offset);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   523
  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
   524
  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
   525
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  // Reading directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  static DIR*           opendir(const char* dirname);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  static int            readdir_buf_size(const char *path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  static struct dirent* readdir(DIR* dirp, dirent* dbuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  static int            closedir(DIR* dirp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  // Dynamic library extension
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  static const char*    dll_file_extension();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  static const char*    get_temp_directory();
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16610
diff changeset
   536
  static const char*    get_current_directory(char *buf, size_t buflen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   538
  // 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
   539
  // 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
   540
  static bool           dll_build_name(char* buffer, size_t size,
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   541
                                       const char* pathname, const char* fname);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   542
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  // Symbol lookup, find nearest function name; basically it implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // dladdr() for all platforms. Name of the nearest function is copied
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18069
diff changeset
   545
  // to buf. Distance from its base address is optionally returned as offset.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // If function name is not found, buf[0] is set to '\0' and offset is
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18069
diff changeset
   547
  // set to -1 (if offset is non-NULL).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  static bool dll_address_to_function_name(address addr, char* buf,
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31335
diff changeset
   549
                                           int buflen, int* offset,
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31335
diff changeset
   550
                                           bool demangle = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  // Locate DLL/DSO. On success, full path of the library is copied to
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18069
diff changeset
   553
  // buf, and offset is optionally set to be the distance between addr
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18069
diff changeset
   554
  // and the library's base address. On failure, buf[0] is set to '\0'
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18069
diff changeset
   555
  // and offset is set to -1 (if offset is non-NULL).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  static bool dll_address_to_library_name(address addr, char* buf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
                                          int buflen, int* offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  // Find out whether the pc is in the static code for jvm.dll/libjvm.so.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  static bool address_is_in_vm(address addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  // Loads .dll/.so and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  // in case of error it checks if .dll/.so was built for the
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 20022
diff changeset
   564
  // same architecture as HotSpot is running on
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  static void* dll_load(const char *name, char *ebuf, int ebuflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   567
  // lookup symbol in a shared library
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   568
  static void* dll_lookup(void* handle, const char* name);
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 823
diff changeset
   569
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   570
  // Unload library
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   571
  static void  dll_unload(void *lib);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   572
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   573
  // Callback for loaded module information
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   574
  // Input parameters:
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   575
  //    char*     module_file_name,
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   576
  //    address   module_base_addr,
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   577
  //    address   module_top_addr,
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   578
  //    void*     param
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   579
  typedef int (*LoadedModulesCallbackFunc)(const char *, address, address, void *);
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   580
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   581
  static int get_loaded_modules_info(LoadedModulesCallbackFunc callback, void *param);
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 25949
diff changeset
   582
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   583
  // Return the handle of this process
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   584
  static void* get_default_process_handle();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   585
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   586
  // Check for static linked agent library
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   587
  static bool find_builtin_agent(AgentLibrary *agent_lib, const char *syms[],
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   588
                                 size_t syms_len);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   589
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   590
  // Find agent entry point
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   591
  static void *find_agent_function(AgentLibrary *agent_lib, bool check_lib,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   592
                                   const char *syms[], size_t syms_len);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   593
33766
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33593
diff changeset
   594
  // Write to stream
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33593
diff changeset
   595
  static int log_vsnprintf(char* buf, size_t len, const char* fmt, va_list args) ATTRIBUTE_PRINTF(3, 0);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33593
diff changeset
   596
36174
481391df586b 8148219: Add decorator hostname to UL
mlarsson
parents: 35495
diff changeset
   597
  // Get host name in buffer provided
481391df586b 8148219: Add decorator hostname to UL
mlarsson
parents: 35495
diff changeset
   598
  static bool get_host_name(char* buf, size_t buflen);
481391df586b 8148219: Add decorator hostname to UL
mlarsson
parents: 35495
diff changeset
   599
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  // Print out system information; they are called by fatal error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  // Output format may be different on different platforms.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  static void print_os_info(outputStream* st);
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   603
  static void print_os_info_brief(outputStream* st);
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31335
diff changeset
   604
  static void print_cpu_info(outputStream* st, char* buf, size_t buflen);
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31335
diff changeset
   605
  static void pd_print_cpu_info(outputStream* st, char* buf, size_t buflen);
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31357
diff changeset
   606
  static void print_summary_info(outputStream* st, char* buf, size_t buflen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  static void print_memory_info(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  static void print_dll_info(outputStream* st);
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29193
diff changeset
   609
  static void print_environment_variables(outputStream* st, const char** env_list);
35077
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   610
  static void print_context(outputStream* st, const void* context);
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   611
  static void print_register_info(outputStream* st, const void* context);
35176
11a9d4022d9e 8144219: [posix] Remove redundant code around os::print_siginfo()
stuefe
parents: 35077
diff changeset
   612
  static void print_siginfo(outputStream* st, const void* siginfo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  static void print_signal_handlers(outputStream* st, char* buf, size_t buflen);
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30240
diff changeset
   614
  static void print_date_and_time(outputStream* st, char* buf, size_t buflen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6176
diff changeset
   616
  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
   617
  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
   618
  static int get_last_error();
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   619
37113
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   620
  // Replacement for strerror().
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   621
  // Will return the english description of the error (e.g. "File not found", as
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   622
  //  suggested in the POSIX standard.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   623
  // Will return "Unknown error" for an unknown errno value.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   624
  // Will not attempt to localize the returned string.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   625
  // Will always return a valid string which is a static constant.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   626
  // Will not change the value of errno.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   627
  static const char* strerror(int e);
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   628
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   629
  // Will return the literalized version of the given errno (e.g. "EINVAL"
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   630
  //  for EINVAL).
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   631
  // Will return "Unknown error" for an unknown errno value.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   632
  // Will always return a valid string which is a static constant.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   633
  // Will not change the value of errno.
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   634
  static const char* errno_name(int e);
5a33bf5089ac 8148425: strerror() function is not thread-safe
stuefe
parents: 37046
diff changeset
   635
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   636
  // 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
   637
  static bool is_debugger_attached();
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   638
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   639
  // 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
   640
  static void wait_for_keypress_at_exit(void);
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   641
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  // The following two functions are used by fatal error handler to trace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  // native (C) frames. They are not part of frame.hpp/frame.cpp because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  // frame.hpp/cpp assume thread is JavaThread, and also because different
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  // OS/compiler may have different convention or provide different API to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  // walk C frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // We don't attempt to become a debugger, so we only follow frames if that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // does not require a lookup in the unwind table, which is part of the binary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  // file but may be unsafe to read after a fatal error. So on x86, we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  // only walk stack if %ebp is used as frame pointer; on ia64, it's not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  // possible to walk C stack without having the unwind table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  static bool is_first_C_frame(frame *fr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  static frame get_sender_for_C_frame(frame *fr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  // return current frame. pc() and sp() are set to NULL on failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  static frame      current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  static void print_hex_dump(outputStream* st, address start, address end, int unitsize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  // returns a string to describe the exception/signal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  // returns NULL if exception_code is not an OS exception/signal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  static const char* exception_name(int exception_code, char* buf, size_t buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
34621
7676bec20997 8143291: Remove redundant coding around os::exception_name
stuefe
parents: 34305
diff changeset
   665
  // Returns the signal number (e.g. 11) for a given signal name (SIGSEGV).
7676bec20997 8143291: Remove redundant coding around os::exception_name
stuefe
parents: 34305
diff changeset
   666
  static int get_signal_number(const char* signal_name);
7676bec20997 8143291: Remove redundant coding around os::exception_name
stuefe
parents: 34305
diff changeset
   667
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  // Returns native Java library, loads if necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  static void*    native_java_library();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   671
  // Fills in path to jvm.dll/libjvm.so (used by the Disassembler)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  static void     jvm_path(char *buf, jint buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   674
  // Returns true if we are running in a headless jre.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   675
  static bool     is_headless_jre();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   676
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  // JNI names
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  static void     print_jni_name_prefix_on(outputStream* st, int args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  static void     print_jni_name_suffix_on(outputStream* st, int args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  // Init os specific system properties values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  static void init_system_properties_values();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  // IO operations, non-JVM_ version.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  static int stat(const char* path, struct stat* sbuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  static bool dir_is_empty(const char* path);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  // IO operations on binary files
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  static int create_binary_file(const char* path, bool rewrite_existing);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  static jlong current_file_offset(int fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  static jlong seek_to_file_offset(int fd, jlong offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   693
  // Retrieve native stack frames.
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   694
  // Parameter:
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   695
  //   stack:  an array to storage stack pointers.
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   696
  //   frames: size of above array.
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   697
  //   toSkip: number of stack frames to skip at the beginning.
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   698
  // Return: number of stack frames captured.
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   699
  static int get_native_stack(address* stack, int size, int toSkip = 0);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   700
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // General allocation (must be MT-safe)
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   702
  static void* malloc  (size_t size, MEMFLAGS flags, const NativeCallStack& stack);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   703
  static void* malloc  (size_t size, MEMFLAGS flags);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   704
  static void* realloc (void *memblock, size_t size, MEMFLAGS flag, const NativeCallStack& stack);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   705
  static void* realloc (void *memblock, size_t size, MEMFLAGS flag);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
   706
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27473
diff changeset
   707
  static void  free    (void *memblock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  static bool  check_heap(bool force = false);      // verify C heap integrity
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   709
  static char* strdup(const char *, MEMFLAGS flags = mtInternal);  // Like strdup
25949
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   710
  // Like strdup, but exit VM when strdup() returns NULL
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25946
diff changeset
   711
  static char* strdup_check_oom(const char*, MEMFLAGS flags = mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
#ifndef PRODUCT
8320
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   714
  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
   715
  static julong alloc_bytes;         // # of bytes allocated
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   716
  static julong num_frees;           // # of calls to free
544210b4dd48 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 7405
diff changeset
   717
  static julong free_bytes;          // # of bytes freed
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   720
  // SocketInterface (ex HPI SocketInterface )
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   721
  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
   722
  static int socket_close(int fd);
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
   723
  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
   724
  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
   725
  static int raw_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
   726
  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
   727
  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
   728
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // Support for signals (see JVM_RaiseSignal, JVM_RegisterSignal)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  static void  signal_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  static void  signal_init_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  static void  signal_notify(int signal_number);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  static void* signal(int signal_number, void* handler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  static void  signal_raise(int signal_number);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  static int   signal_wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  static int   signal_lookup();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  static void* user_handler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  static void  terminate_signal_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  static int   sigexitnum_pd();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  // random number generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  static long random();                    // return 32bit pseudorandom number
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  static void init_random(long initval);   // initialize random sequence
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  // Structured OS Exception support
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 31963
diff changeset
   746
  static void os_exception_wrapper(java_call_t f, JavaValue* value, const methodHandle& method, JavaCallArguments* args, Thread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   748
  // On Posix compatible OS it will simply check core dump limits while on Windows
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   749
  // it will check if dump file can be created. Check or prepare a core dump to be
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   750
  // taken at a later point in the same thread in os::abort(). Use the caller
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   751
  // provided buffer as a scratch buffer. The status message which will be written
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   752
  // into the error log either is file location or a short error message, depending
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   753
  // on the checking result.
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   754
  static void check_dump_limit(char* buffer, size_t bufferSize);
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8107
diff changeset
   755
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   756
  // Get the default path to the core file
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   757
  // Returns the length of the string
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
   758
  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
   759
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  // JVMTI & JVM monitoring and management support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  // The thread_cpu_time() and current_thread_cpu_time() are only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  // supported if is_thread_cpu_time_supported() returns true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  // They are not supported on Solaris T1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  // Thread CPU Time - return the fast estimate on a platform
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  // On Solaris - call gethrvtime (fast) - user time only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  // On Linux   - fast clock_gettime where available - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  //            - otherwise: very slow /proc fs - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  // On Windows - GetThreadTimes - user+sys
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  static jlong current_thread_cpu_time();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  static jlong thread_cpu_time(Thread* t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  // Thread CPU Time with user_sys_cpu_time parameter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  // If user_sys_cpu_time is true, user+sys time is returned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  // Otherwise, only user time is returned
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  static jlong current_thread_cpu_time(bool user_sys_cpu_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  static jlong thread_cpu_time(Thread* t, bool user_sys_cpu_time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  // Return a bunch of info about the timers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  // Note that the returned info for these two functions may be different
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  // on some platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  static void current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  static void thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  static bool is_thread_cpu_time_supported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  // System loadavg support.  Returns -1 if load average cannot be obtained.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  static int loadavg(double loadavg[], int nelem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  // Hook for os specific jvm options that we don't want to abort on seeing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  static bool obsolete_option(const JavaVMOption *option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
26576
a9429d24d429 8050147: StoreLoad barrier interferes with stack usages
shade
parents: 25949
diff changeset
   794
  // Amount beyond the callee frame size that we bang the stack.
a9429d24d429 8050147: StoreLoad barrier interferes with stack usages
shade
parents: 25949
diff changeset
   795
  static int extra_bang_size_in_bytes();
a9429d24d429 8050147: StoreLoad barrier interferes with stack usages
shade
parents: 25949
diff changeset
   796
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36174
diff changeset
   797
  static char** split_path(const char* path, int* n);
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36174
diff changeset
   798
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   799
  // Extensions
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   800
#include "runtime/os_ext.hpp"
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   801
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   802
 public:
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
   803
  class CrashProtectionCallback : public StackObj {
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
   804
  public:
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
   805
    virtual void call() = 0;
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
   806
  };
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   807
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  // Platform dependent stuff
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   809
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   810
# include "os_linux.hpp"
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   811
# include "os_posix.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   812
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   813
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   814
# include "os_solaris.hpp"
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   815
# include "os_posix.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   816
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   817
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   818
# include "os_windows.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   819
#endif
22827
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   820
#ifdef TARGET_OS_FAMILY_aix
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   821
# include "os_aix.hpp"
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   822
# include "os_posix.hpp"
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   823
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   824
#ifdef TARGET_OS_FAMILY_bsd
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 11961
diff changeset
   825
# include "os_posix.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   826
# include "os_bsd.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   827
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   828
#ifdef TARGET_OS_ARCH_linux_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   829
# include "os_linux_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   830
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   831
#ifdef TARGET_OS_ARCH_linux_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   832
# include "os_linux_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   833
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   834
#ifdef TARGET_OS_ARCH_linux_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   835
# include "os_linux_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   836
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   837
#ifdef TARGET_OS_ARCH_solaris_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   838
# include "os_solaris_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   839
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   840
#ifdef TARGET_OS_ARCH_solaris_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   841
# include "os_solaris_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   842
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   843
#ifdef TARGET_OS_ARCH_windows_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   844
# include "os_windows_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   845
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   846
#ifdef TARGET_OS_ARCH_linux_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   847
# include "os_linux_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   848
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   849
#ifdef TARGET_OS_ARCH_linux_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   850
# include "os_linux_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7405
diff changeset
   851
#endif
22827
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   852
#ifdef TARGET_OS_ARCH_aix_ppc
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   853
# include "os_aix_ppc.hpp"
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 18945
diff changeset
   854
#endif
29180
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 27473
diff changeset
   855
#ifdef TARGET_OS_ARCH_linux_aarch64
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 27473
diff changeset
   856
# include "os_linux_aarch64.hpp"
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 27473
diff changeset
   857
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   858
#ifdef TARGET_OS_ARCH_bsd_x86
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   859
# include "os_bsd_x86.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   860
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   861
#ifdef TARGET_OS_ARCH_bsd_zero
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   862
# include "os_bsd_zero.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10272
diff changeset
   863
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
   864
22758
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   865
#ifndef OS_NATIVE_THREAD_CREATION_FAILED_MSG
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   866
#define OS_NATIVE_THREAD_CREATION_FAILED_MSG "unable to create native thread: possibly out of memory or process/resource limits reached"
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   867
#endif
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   868
11417
4ecc3253bec4 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 11256
diff changeset
   869
 public:
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   870
#ifndef PLATFORM_PRINT_NATIVE_STACK
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   871
  // No platform-specific code for printing the native stack.
35077
8b86440d3bf1 8145114: const-correctness for ucontext_t* reading functions
stuefe
parents: 35071
diff changeset
   872
  static bool platform_print_native_stack(outputStream* st, const void* context,
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   873
                                          char *buf, int buf_size) {
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   874
    return false;
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   875
  }
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   876
#endif
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19697
diff changeset
   877
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   878
  // 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
   879
  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
   880
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  static bool dont_yield();                     // when true, JVM_Yield() is nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  static void print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // Thread priority helpers (implemented in OS-specific part)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  static OSReturn set_native_priority(Thread* thread, int native_prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  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
   887
  static int java_to_os_priority[CriticalPriority + 1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // Hint to the underlying OS that a task switch would not be good.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  // Void return because it's a hint and can fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  static void hint_no_preempt();
22758
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   891
  static const char* native_thread_creation_failed_msg() {
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   892
    return OS_NATIVE_THREAD_CREATION_FAILED_MSG;
c6b6abb73544 7182040: volano29 limited by os resource on Linux - need better diagnostic message
iklam
parents: 22556
diff changeset
   893
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  // Used at creation if requested by the diagnostic flag PauseAtStartup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  // Causes the VM to wait until an external stimulus has been applied
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  // (for Unix, that stimulus is a signal, for Windows, an external
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  // ResumeThread call)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  static void pause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   901
  // Builds a platform dependent Agent_OnLoad_<libname> function name
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   902
  // which is used to find statically linked in agents.
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   903
  static char*  build_agent_function_name(const char *sym, const char *cname,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   904
                                          bool is_absolute_path);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18945
diff changeset
   905
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   906
  class SuspendedThreadTaskContext {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   907
  public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   908
    SuspendedThreadTaskContext(Thread* thread, void *ucontext) : _thread(thread), _ucontext(ucontext) {}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   909
    Thread* thread() const { return _thread; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   910
    void* ucontext() const { return _ucontext; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   911
  private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   912
    Thread* _thread;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   913
    void* _ucontext;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   914
  };
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   915
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   916
  class SuspendedThreadTask {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   917
  public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   918
    SuspendedThreadTask(Thread* thread) : _thread(thread), _done(false) {}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   919
    virtual ~SuspendedThreadTask() {}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   920
    void run();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   921
    bool is_done() { return _done; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   922
    virtual void do_task(const SuspendedThreadTaskContext& context) = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   923
  protected:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   924
  private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   925
    void internal_do_task();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   926
    Thread* _thread;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   927
    bool _done;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   928
  };
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   929
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   930
#ifndef TARGET_OS_FAMILY_windows
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   931
  // Suspend/resume support
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   932
  // Protocol:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   933
  //
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   934
  // a thread starts in SR_RUNNING
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   935
  //
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   936
  // SR_RUNNING can go to
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   937
  //   * SR_SUSPEND_REQUEST when the WatcherThread wants to suspend it
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   938
  // SR_SUSPEND_REQUEST can go to
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   939
  //   * SR_RUNNING if WatcherThread decides it waited for SR_SUSPENDED too long (timeout)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   940
  //   * SR_SUSPENDED if the stopped thread receives the signal and switches state
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   941
  // SR_SUSPENDED can go to
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   942
  //   * SR_WAKEUP_REQUEST when the WatcherThread has done the work and wants to resume
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   943
  // SR_WAKEUP_REQUEST can go to
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   944
  //   * SR_RUNNING when the stopped thread receives the signal
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   945
  //   * SR_WAKEUP_REQUEST on timeout (resend the signal and try again)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   946
  class SuspendResume {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   947
   public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   948
    enum State {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   949
      SR_RUNNING,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   950
      SR_SUSPEND_REQUEST,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   951
      SR_SUSPENDED,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   952
      SR_WAKEUP_REQUEST
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   953
    };
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   954
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   955
  private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   956
    volatile State _state;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   957
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   958
  private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   959
    /* try to switch state from state "from" to state "to"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   960
     * returns the state set after the method is complete
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   961
     */
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   962
    State switch_state(State from, State to);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   963
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   964
  public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   965
    SuspendResume() : _state(SR_RUNNING) { }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   966
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   967
    State state() const { return _state; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   968
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   969
    State request_suspend() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   970
      return switch_state(SR_RUNNING, SR_SUSPEND_REQUEST);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   971
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   972
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   973
    State cancel_suspend() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   974
      return switch_state(SR_SUSPEND_REQUEST, SR_RUNNING);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   975
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   976
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   977
    State suspended() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   978
      return switch_state(SR_SUSPEND_REQUEST, SR_SUSPENDED);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   979
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   980
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   981
    State request_wakeup() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   982
      return switch_state(SR_SUSPENDED, SR_WAKEUP_REQUEST);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   983
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   984
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   985
    State running() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   986
      return switch_state(SR_WAKEUP_REQUEST, SR_RUNNING);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   987
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   988
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   989
    bool is_running() const {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   990
      return _state == SR_RUNNING;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   991
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   992
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   993
    bool is_suspend_request() const {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   994
      return _state == SR_SUSPEND_REQUEST;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   995
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   996
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   997
    bool is_suspended() const {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   998
      return _state == SR_SUSPENDED;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
   999
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1000
  };
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1001
#endif
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1002
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17302
diff changeset
  1003
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  static long _rand_seed;                   // seed for random number generator
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  static int _processor_count;              // number of processors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  static char* format_boot_path(const char* format_string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
                                const char* home,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
                                int home_len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
                                char fileSep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
                                char pathSep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  static bool set_boot_path(char fileSep, char pathSep);
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18683
diff changeset
  1014
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
// Note that "PAUSE" is almost always used with synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
// so arguably we should provide Atomic::SpinPause() instead
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
// of the global SpinPause() with C linkage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
// It'd also be eligible for inlining on many platforms.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
18740
db44b1599483 8016697: Use stubs to implement safefetch
goetz
parents: 18069
diff changeset
  1022
extern "C" int SpinPause();
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
  1023
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
  1024
#endif // SHARE_VM_RUNTIME_OS_HPP