hotspot/src/os/bsd/vm/os_bsd.cpp
author coleenp
Wed, 22 Jul 2015 00:03:45 -0400
changeset 31963 641ed52732ec
parent 31610 b05ea6f92971
child 32080 9d2ace436482
permissions -rw-r--r--
8026324: hs_err improvement: Add summary section to hs_err file 8026333: hs_err improvement: Print GC Strategy 8026336: hs_err improvement: Print compilation mode, server, client or tiered Summary: Added command line, summary cpu and os information to summary section. Moved time of crash and duration in summary section. Add GC strategy and compiler setting (tiered) to enhanced version string in error report. Moved the stack trace sooner in hs_err file. Reviewed-by: dholmes, ctornqvi, ddmitriev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     1
/*
28737
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
     2
 * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     4
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     7
 * published by the Free Software Foundation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     8
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    13
 * accompanied this code).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    14
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    18
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    21
 * questions.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    22
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    23
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    24
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    25
// no precompiled headers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    26
#include "classfile/classLoader.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    27
#include "classfile/systemDictionary.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    28
#include "classfile/vmSymbols.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    29
#include "code/icBuffer.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    30
#include "code/vtableStubs.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    31
#include "compiler/compileBroker.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14471
diff changeset
    32
#include "compiler/disassembler.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    33
#include "interpreter/interpreter.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    34
#include "jvm_bsd.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    35
#include "memory/allocation.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    36
#include "memory/filemap.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    37
#include "mutex_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    38
#include "oops/oop.inline.hpp"
25468
5331df506290 8048241: Introduce umbrella header os.inline.hpp and clean up includes
goetz
parents: 25354
diff changeset
    39
#include "os_bsd.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    40
#include "os_share_bsd.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    41
#include "prims/jniFastGetField.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    42
#include "prims/jvm.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    43
#include "prims/jvm_misc.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    44
#include "runtime/arguments.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 25064
diff changeset
    45
#include "runtime/atomic.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    46
#include "runtime/extendedPC.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    47
#include "runtime/globals.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    48
#include "runtime/interfaceSupport.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    49
#include "runtime/java.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    50
#include "runtime/javaCalls.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    51
#include "runtime/mutexLocker.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    52
#include "runtime/objectMonitor.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 24239
diff changeset
    53
#include "runtime/orderAccess.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    54
#include "runtime/osThread.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    55
#include "runtime/perfMemory.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    56
#include "runtime/sharedRuntime.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    57
#include "runtime/statSampler.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    58
#include "runtime/stubRoutines.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14471
diff changeset
    59
#include "runtime/thread.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    60
#include "runtime/threadCritical.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    61
#include "runtime/timer.hpp"
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
    62
#include "semaphore_bsd.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    63
#include "services/attachListener.hpp"
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
    64
#include "services/memTracker.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    65
#include "services/runtimeService.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    66
#include "utilities/decoder.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    67
#include "utilities/defaultStream.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    68
#include "utilities/events.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    69
#include "utilities/growableArray.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    70
#include "utilities/vmError.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    71
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    72
// put OS-includes here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    73
# include <sys/types.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    74
# include <sys/mman.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    75
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    76
# include <sys/select.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    77
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    78
# include <signal.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    79
# include <errno.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    80
# include <dlfcn.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    81
# include <stdio.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    82
# include <unistd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    83
# include <sys/resource.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    84
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    85
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    86
# include <sys/time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    87
# include <sys/times.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    88
# include <sys/utsname.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    89
# include <sys/socket.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    90
# include <sys/wait.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    91
# include <time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    92
# include <pwd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    93
# include <poll.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    94
# include <semaphore.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    95
# include <fcntl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    96
# include <string.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    97
# include <sys/param.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    98
# include <sys/sysctl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    99
# include <sys/ipc.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   100
# include <sys/shm.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   101
#ifndef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   102
# include <link.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   103
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   104
# include <stdint.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   105
# include <inttypes.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   106
# include <sys/ioctl.h>
20373
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   107
# include <sys/syscall.h>
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   108
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   109
#if defined(__FreeBSD__) || defined(__NetBSD__)
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   110
  #include <elf.h>
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   111
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   112
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   113
#ifdef __APPLE__
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   114
  #include <mach/mach.h> // semaphore_* API
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   115
  #include <mach-o/dyld.h>
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   116
  #include <sys/proc_info.h>
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   117
  #include <objc/objc-auto.h>
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   118
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   119
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   120
#ifndef MAP_ANONYMOUS
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   121
  #define MAP_ANONYMOUS MAP_ANON
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   122
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   123
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   124
#define MAX_PATH    (2 * K)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   125
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   126
// for timer info max values which include all bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   127
#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   128
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   129
#define LARGEPAGES_BIT (1 << 6)
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   130
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   131
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   132
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   133
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   134
// global variables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   135
julong os::Bsd::_physical_memory = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   136
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   137
#ifdef __APPLE__
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   138
mach_timebase_info_data_t os::Bsd::_timebase_info = {0, 0};
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   139
volatile uint64_t         os::Bsd::_max_abstime   = 0;
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   140
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   141
int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   142
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   143
pthread_t os::Bsd::_main_thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   144
int os::Bsd::_page_size = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   145
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   146
static jlong initial_time_count=0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   147
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   148
static int clock_tics_per_sec = 100;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   149
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   150
// For diagnostics to print a message once. see run_periodic_checks
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   151
static sigset_t check_signal_done;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   152
static bool check_signals = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   153
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   154
static pid_t _initial_pid = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   155
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   156
// Signal number used to suspend/resume a thread
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   157
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   158
// do not use any signal number less than SIGSEGV, see 4355769
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   159
static int SR_signum = SIGUSR2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   160
sigset_t SR_sigset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   161
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   162
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   163
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   164
// utility functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   165
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   166
static int SR_initialize();
20373
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   167
static void unpackTime(timespec* absTime, bool isAbsolute, jlong time);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   168
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   169
julong os::available_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   170
  return Bsd::available_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   171
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   172
20683
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   173
// available here means free
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   174
julong os::Bsd::available_memory() {
20683
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   175
  uint64_t available = physical_memory() >> 2;
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   176
#ifdef __APPLE__
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   177
  mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   178
  vm_statistics64_data_t vmstat;
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   179
  kern_return_t kerr = host_statistics64(mach_host_self(), HOST_VM_INFO64,
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   180
                                         (host_info64_t)&vmstat, &count);
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   181
  assert(kerr == KERN_SUCCESS,
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   182
         "host_statistics64 failed - check mach_host_self() and count");
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   183
  if (kerr == KERN_SUCCESS) {
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   184
    available = vmstat.free_count * os::vm_page_size();
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   185
  }
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   186
#endif
7b211e525ab8 8025942: os::Bsd::available_memory() needs implementation
hseigel
parents: 20377
diff changeset
   187
  return available;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   188
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   189
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   190
julong os::physical_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   191
  return Bsd::physical_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   192
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   193
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   194
// Return true if user is running as root.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   195
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   196
bool os::have_special_privileges() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   197
  static bool init = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   198
  static bool privileges = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   199
  if (!init) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   200
    privileges = (getuid() != geteuid()) || (getgid() != getegid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   201
    init = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   202
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   203
  return privileges;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   204
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   205
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   206
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   207
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   208
// Cpu architecture string
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   209
#if   defined(ZERO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   210
static char cpu_arch[] = ZERO_LIBARCH;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   211
#elif defined(IA64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   212
static char cpu_arch[] = "ia64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   213
#elif defined(IA32)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   214
static char cpu_arch[] = "i386";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   215
#elif defined(AMD64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   216
static char cpu_arch[] = "amd64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   217
#elif defined(ARM)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   218
static char cpu_arch[] = "arm";
22806
7d1955769e90 8016491: PPC64 (part 2): Clean up PPC defines.
goetz
parents: 17134
diff changeset
   219
#elif defined(PPC32)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   220
static char cpu_arch[] = "ppc";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   221
#elif defined(SPARC)
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   222
  #ifdef _LP64
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   223
static char cpu_arch[] = "sparcv9";
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   224
  #else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   225
static char cpu_arch[] = "sparc";
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   226
  #endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   227
#else
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   228
  #error Add appropriate cpu_arch setting
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   229
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   230
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   231
// Compiler variant
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   232
#ifdef COMPILER2
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   233
  #define COMPILER_VARIANT "server"
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   234
#else
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   235
  #define COMPILER_VARIANT "client"
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   236
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   237
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   238
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   239
void os::Bsd::initialize_system_info() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   240
  int mib[2];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   241
  size_t len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   242
  int cpu_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   243
  julong mem_val;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   244
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   245
  // get processors count via hw.ncpus sysctl
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   246
  mib[0] = CTL_HW;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   247
  mib[1] = HW_NCPU;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   248
  len = sizeof(cpu_val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   249
  if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   250
    assert(len == sizeof(cpu_val), "unexpected data size");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   251
    set_processor_count(cpu_val);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   252
  } else {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   253
    set_processor_count(1);   // fallback
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   254
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   255
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   256
  // get physical memory via hw.memsize sysctl (hw.memsize is used
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   257
  // since it returns a 64 bit value)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   258
  mib[0] = CTL_HW;
20373
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   259
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   260
#if defined (HW_MEMSIZE) // Apple
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   261
  mib[1] = HW_MEMSIZE;
20373
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   262
#elif defined(HW_PHYSMEM) // Most of BSD
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   263
  mib[1] = HW_PHYSMEM;
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   264
#elif defined(HW_REALMEM) // Old FreeBSD
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   265
  mib[1] = HW_REALMEM;
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   266
#else
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   267
  #error No ways to get physmem
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   268
#endif
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
   269
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   270
  len = sizeof(mem_val);
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   271
  if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   272
    assert(len == sizeof(mem_val), "unexpected data size");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   273
    _physical_memory = mem_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   274
  } else {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   275
    _physical_memory = 256 * 1024 * 1024;       // fallback (XXXBSD?)
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   276
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   277
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   278
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   279
  {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   280
    // limit _physical_memory memory view on OpenBSD since
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   281
    // datasize rlimit restricts us anyway.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   282
    struct rlimit limits;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   283
    getrlimit(RLIMIT_DATA, &limits);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   284
    _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   285
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   286
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   287
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   288
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   289
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   290
static const char *get_home() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   291
  const char *home_dir = ::getenv("HOME");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   292
  if ((home_dir == NULL) || (*home_dir == '\0')) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   293
    struct passwd *passwd_info = getpwuid(geteuid());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   294
    if (passwd_info != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   295
      home_dir = passwd_info->pw_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   296
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   297
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   298
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   299
  return home_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   300
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   301
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   302
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   303
void os::init_system_properties_values() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   304
  // The next steps are taken in the product version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   305
  //
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   306
  // Obtain the JAVA_HOME value from the location of libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   307
  // This library should be located at:
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   308
  // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   309
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   310
  // If "/jre/lib/" appears at the right place in the path, then we
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   311
  // assume libjvm.so is installed in a JDK and we use this path.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   312
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   313
  // Otherwise exit with message: "Could not create the Java virtual machine."
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   314
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   315
  // The following extra steps are taken in the debugging version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   316
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   317
  // If "/jre/lib/" does NOT appear at the right place in the path
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   318
  // instead of exit check for $JAVA_HOME environment variable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   319
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   320
  // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   321
  // then we append a fake suffix "hotspot/libjvm.so" to this path so
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   322
  // it looks like libjvm.so is installed there
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   323
  // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   324
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   325
  // Otherwise exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   326
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   327
  // Important note: if the location of libjvm.so changes this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   328
  // code needs to be changed accordingly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   329
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   330
  // See ld(1):
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   331
  //      The linker uses the following search paths to locate required
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   332
  //      shared libraries:
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   333
  //        1: ...
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   334
  //        ...
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   335
  //        7: The default directories, normally /lib and /usr/lib.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   336
#ifndef DEFAULT_LIBPATH
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   337
  #define DEFAULT_LIBPATH "/lib:/usr/lib"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   338
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   339
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   340
// Base path of extensions installed on the system.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   341
#define SYS_EXT_DIR     "/usr/java/packages"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   342
#define EXTENSIONS_DIR  "/lib/ext"
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   343
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   344
#ifndef __APPLE__
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   345
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   346
  // Buffer that fits several sprintfs.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   347
  // Note that the space for the colon and the trailing null are provided
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   348
  // by the nulls included by the sizeof operator.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   349
  const size_t bufsize =
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   350
    MAX2((size_t)MAXPATHLEN,  // For dll_dir & friends.
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   351
         (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   352
  char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   353
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   354
  // sysclasspath, java_home, dll_dir
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   355
  {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   356
    char *pslash;
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   357
    os::jvm_path(buf, bufsize);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   358
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   359
    // Found the full path to libjvm.so.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   360
    // Now cut the path to <java_home>/jre if we can.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   361
    *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   362
    pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   363
    if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   364
      *pslash = '\0';            // Get rid of /{client|server|hotspot}.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   365
    }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   366
    Arguments::set_dll_dir(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   367
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   368
    if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   369
      pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   370
      if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   371
        *pslash = '\0';          // Get rid of /<arch>.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   372
        pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   373
        if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   374
          *pslash = '\0';        // Get rid of /lib.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   375
        }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   376
      }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   377
    }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   378
    Arguments::set_java_home(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   379
    set_boot_path('/', ':');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   380
  }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   381
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   382
  // Where to look for native libraries.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   383
  //
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   384
  // Note: Due to a legacy implementation, most of the library path
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   385
  // is set in the launcher. This was to accomodate linking restrictions
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   386
  // on legacy Bsd implementations (which are no longer supported).
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   387
  // Eventually, all the library path setting will be done here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   388
  //
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   389
  // However, to prevent the proliferation of improperly built native
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   390
  // libraries, the new path component /usr/java/packages is added here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   391
  // Eventually, all the library path setting will be done here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   392
  {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   393
    // Get the user setting of LD_LIBRARY_PATH, and prepended it. It
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   394
    // should always exist (until the legacy problem cited above is
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   395
    // addressed).
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   396
    const char *v = ::getenv("LD_LIBRARY_PATH");
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   397
    const char *v_colon = ":";
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   398
    if (v == NULL) { v = ""; v_colon = ""; }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   399
    // That's +1 for the colon and +1 for the trailing '\0'.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   400
    char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   401
                                                     strlen(v) + 1 +
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   402
                                                     sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   403
                                                     mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   404
    sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   405
    Arguments::set_library_path(ld_library_path);
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
   406
    FREE_C_HEAP_ARRAY(char, ld_library_path);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   407
  }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   408
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   409
  // Extensions directories.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   410
  sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   411
  Arguments::set_ext_dirs(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   412
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
   413
  FREE_C_HEAP_ARRAY(char, buf);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   414
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   415
#else // __APPLE__
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   416
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   417
  #define SYS_EXTENSIONS_DIR   "/Library/Java/Extensions"
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   418
  #define SYS_EXTENSIONS_DIRS  SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   419
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   420
  const char *user_home_dir = get_home();
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   421
  // The null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   422
  size_t system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   423
    sizeof(SYS_EXTENSIONS_DIRS);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   424
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   425
  // Buffer that fits several sprintfs.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   426
  // Note that the space for the colon and the trailing null are provided
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   427
  // by the nulls included by the sizeof operator.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   428
  const size_t bufsize =
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   429
    MAX2((size_t)MAXPATHLEN,  // for dll_dir & friends.
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   430
         (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + system_ext_size); // extensions dir
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   431
  char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   432
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   433
  // sysclasspath, java_home, dll_dir
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   434
  {
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   435
    char *pslash;
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   436
    os::jvm_path(buf, bufsize);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   437
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   438
    // Found the full path to libjvm.so.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   439
    // Now cut the path to <java_home>/jre if we can.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   440
    *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   441
    pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   442
    if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   443
      *pslash = '\0';            // Get rid of /{client|server|hotspot}.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   444
    }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   445
    Arguments::set_dll_dir(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   446
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   447
    if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   448
      pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   449
      if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   450
        *pslash = '\0';          // Get rid of /lib.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   451
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   452
    }
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   453
    Arguments::set_java_home(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   454
    set_boot_path('/', ':');
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   455
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   456
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   457
  // Where to look for native libraries.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   458
  //
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   459
  // Note: Due to a legacy implementation, most of the library path
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   460
  // is set in the launcher. This was to accomodate linking restrictions
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   461
  // on legacy Bsd implementations (which are no longer supported).
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   462
  // Eventually, all the library path setting will be done here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   463
  //
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   464
  // However, to prevent the proliferation of improperly built native
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   465
  // libraries, the new path component /usr/java/packages is added here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   466
  // Eventually, all the library path setting will be done here.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   467
  {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   468
    // Get the user setting of LD_LIBRARY_PATH, and prepended it. It
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   469
    // should always exist (until the legacy problem cited above is
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   470
    // addressed).
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   471
    // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   472
    // can specify a directory inside an app wrapper
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   473
    const char *l = ::getenv("JAVA_LIBRARY_PATH");
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   474
    const char *l_colon = ":";
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   475
    if (l == NULL) { l = ""; l_colon = ""; }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   476
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   477
    const char *v = ::getenv("DYLD_LIBRARY_PATH");
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   478
    const char *v_colon = ":";
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   479
    if (v == NULL) { v = ""; v_colon = ""; }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   480
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   481
    // Apple's Java6 has "." at the beginning of java.library.path.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   482
    // OpenJDK on Windows has "." at the end of java.library.path.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   483
    // OpenJDK on Linux and Solaris don't have "." in java.library.path
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   484
    // at all. To ease the transition from Apple's Java6 to OpenJDK7,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   485
    // "." is appended to the end of java.library.path. Yes, this
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   486
    // could cause a change in behavior, but Apple's Java6 behavior
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   487
    // can be achieved by putting "." at the beginning of the
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   488
    // JAVA_LIBRARY_PATH environment variable.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   489
    char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   490
                                                     strlen(v) + 1 + strlen(l) + 1 +
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   491
                                                     system_ext_size + 3,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   492
                                                     mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   493
    sprintf(ld_library_path, "%s%s%s%s%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS ":.",
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   494
            v, v_colon, l, l_colon, user_home_dir);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   495
    Arguments::set_library_path(ld_library_path);
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
   496
    FREE_C_HEAP_ARRAY(char, ld_library_path);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   497
  }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   498
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   499
  // Extensions directories.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   500
  //
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   501
  // Note that the space for the colon and the trailing null are provided
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   502
  // by the nulls included by the sizeof operator (so actually one byte more
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   503
  // than necessary is allocated).
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   504
  sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS,
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   505
          user_home_dir, Arguments::get_java_home());
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   506
  Arguments::set_ext_dirs(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   507
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
   508
  FREE_C_HEAP_ARRAY(char, buf);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   509
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   510
#undef SYS_EXTENSIONS_DIR
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   511
#undef SYS_EXTENSIONS_DIRS
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   512
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   513
#endif // __APPLE__
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   514
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
   515
#undef SYS_EXT_DIR
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   516
#undef EXTENSIONS_DIR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   517
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   518
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   519
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   520
// breakpoint support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   521
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   522
void os::breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   523
  BREAKPOINT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   524
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   526
extern "C" void breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   527
  // use debugger to set breakpoint here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   528
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   529
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   530
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   531
// signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   532
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   533
debug_only(static bool signal_sets_initialized = false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   534
static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   536
bool os::Bsd::is_sig_ignored(int sig) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   537
  struct sigaction oact;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   538
  sigaction(sig, (struct sigaction*)NULL, &oact);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   539
  void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oact.sa_sigaction)
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   540
                                 : CAST_FROM_FN_PTR(void*,  oact.sa_handler);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   541
  if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   542
    return true;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   543
  } else {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   544
    return false;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   545
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   546
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   547
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   548
void os::Bsd::signal_sets_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   549
  // Should also have an assertion stating we are still single-threaded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   550
  assert(!signal_sets_initialized, "Already initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   551
  // Fill in signals that are necessarily unblocked for all threads in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   552
  // the VM. Currently, we unblock the following signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   553
  // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   554
  //                         by -Xrs (=ReduceSignalUsage));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   555
  // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   556
  // other threads. The "ReduceSignalUsage" boolean tells us not to alter
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   557
  // the dispositions or masks wrt these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   558
  // Programs embedding the VM that want to use the above signals for their
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   559
  // own purposes must, at this time, use the "-Xrs" option to prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   560
  // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   561
  // (See bug 4345157, and other related bugs).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   562
  // In reality, though, unblocking these signals is really a nop, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   563
  // these signals are not blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   564
  sigemptyset(&unblocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   565
  sigemptyset(&allowdebug_blocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   566
  sigaddset(&unblocked_sigs, SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   567
  sigaddset(&unblocked_sigs, SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   568
  sigaddset(&unblocked_sigs, SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   569
  sigaddset(&unblocked_sigs, SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   570
  sigaddset(&unblocked_sigs, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   571
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   572
  if (!ReduceSignalUsage) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   573
    if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   574
      sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   575
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   576
    }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   577
    if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   578
      sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   579
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   580
    }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   581
    if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   582
      sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   583
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   584
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   585
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   586
  // Fill in signals that are blocked by all but the VM thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   587
  sigemptyset(&vm_sigs);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   588
  if (!ReduceSignalUsage) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   589
    sigaddset(&vm_sigs, BREAK_SIGNAL);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   590
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   591
  debug_only(signal_sets_initialized = true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   592
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   593
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   594
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   595
// These are signals that are unblocked while a thread is running Java.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   596
// (For some reason, they get blocked by default.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   597
sigset_t* os::Bsd::unblocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   598
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   599
  return &unblocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   600
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   601
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   602
// These are the signals that are blocked while a (non-VM) thread is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   603
// running Java. Only the VM thread handles these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   604
sigset_t* os::Bsd::vm_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   605
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   606
  return &vm_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   607
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   608
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   609
// These are signals that are blocked during cond_wait to allow debugger in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   610
sigset_t* os::Bsd::allowdebug_blocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   611
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   612
  return &allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   613
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   614
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   615
void os::Bsd::hotspot_sigmask(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   616
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   617
  //Save caller's signal mask before setting VM signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   618
  sigset_t caller_sigmask;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   619
  pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   620
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   621
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   622
  osthread->set_caller_sigmask(caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   623
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   624
  pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   625
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   626
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   627
    if (thread->is_VM_thread()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   628
      // Only the VM thread handles BREAK_SIGNAL ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   629
      pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   630
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   631
      // ... all other threads block BREAK_SIGNAL
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   632
      pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   633
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   634
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   635
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   636
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   637
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   638
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   639
// create new thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   640
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   641
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   642
// library handle for calling objc_registerThreadWithCollector()
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   643
// without static linking to the libobjc library
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   644
  #define OBJC_LIB "/usr/lib/libobjc.dylib"
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   645
  #define OBJC_GCREGISTER "objc_registerThreadWithCollector"
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   646
typedef void (*objc_registerThreadWithCollector_t)();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   647
extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   648
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   649
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   650
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   651
#ifdef __APPLE__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   652
static uint64_t locate_unique_thread_id(mach_port_t mach_thread_port) {
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   653
  // Additional thread_id used to correlate threads in SA
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   654
  thread_identifier_info_data_t     m_ident_info;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   655
  mach_msg_type_number_t            count = THREAD_IDENTIFIER_INFO_COUNT;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   656
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   657
  thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO,
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   658
              (thread_info_t) &m_ident_info, &count);
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   659
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   660
  return m_ident_info.thread_id;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   661
}
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   662
#endif
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   663
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   664
// Thread start routine for all newly created threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   665
static void *java_start(Thread *thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   666
  // Try to randomize the cache line index of hot stack frames.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   667
  // This helps when threads of the same stack traces evict each other's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   668
  // cache lines. The threads can be either from the same JVM instance, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   669
  // from different JVM instances. The benefit is especially true for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   670
  // processors with hyperthreading technology.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   671
  static int counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   672
  int pid = os::current_process_id();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   673
  alloca(((pid ^ counter++) & 7) * 128);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   674
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   675
  ThreadLocalStorage::set_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   676
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   677
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   678
  Monitor* sync = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   679
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   680
  osthread->set_thread_id(os::Bsd::gettid());
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   681
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   682
#ifdef __APPLE__
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   683
  uint64_t unique_thread_id = locate_unique_thread_id(osthread->thread_id());
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   684
  guarantee(unique_thread_id != 0, "unique thread id was not found");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   685
  osthread->set_unique_thread_id(unique_thread_id);
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   686
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   687
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   688
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   689
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   690
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   691
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   692
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   693
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   694
  // register thread with objc gc
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   695
  if (objc_registerThreadWithCollectorFunction != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   696
    objc_registerThreadWithCollectorFunction();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   697
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   698
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   699
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   700
  // handshaking with parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   701
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   702
    MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   703
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   704
    // notify parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   705
    osthread->set_state(INITIALIZED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   706
    sync->notify_all();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   707
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   708
    // wait until os::start_thread()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   709
    while (osthread->get_state() == INITIALIZED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   710
      sync->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   711
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   712
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   713
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   714
  // call one more level start routine
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   715
  thread->run();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   716
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   717
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   718
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   719
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   720
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   721
  assert(thread->osthread() == NULL, "caller responsible");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   722
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   723
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   724
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   725
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   726
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   727
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   728
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   729
  // set the correct thread state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   730
  osthread->set_thread_type(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   732
  // Initial state is ALLOCATED but not INITIALIZED
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   733
  osthread->set_state(ALLOCATED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   734
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   735
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   736
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   737
  // init thread attributes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   738
  pthread_attr_t attr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   739
  pthread_attr_init(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   740
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   741
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   742
  // stack size
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   743
  if (os::Bsd::supports_variable_stack_size()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   744
    // calculate stack size if it's not specified by caller
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   745
    if (stack_size == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   746
      stack_size = os::Bsd::default_stack_size(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   747
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   748
      switch (thr_type) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   749
      case os::java_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   750
        // Java threads use ThreadStackSize which default value can be
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   751
        // changed with the flag -Xss
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
   752
        assert(JavaThread::stack_size_at_create() > 0, "this should be set");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   753
        stack_size = JavaThread::stack_size_at_create();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   754
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   755
      case os::compiler_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   756
        if (CompilerThreadStackSize > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   757
          stack_size = (size_t)(CompilerThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   758
          break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   759
        } // else fall through:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   760
          // use VMThreadStackSize if CompilerThreadStackSize is not defined
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   761
      case os::vm_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   762
      case os::pgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   763
      case os::cgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   764
      case os::watcher_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   765
        if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   766
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   767
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   768
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   769
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   770
    stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   771
    pthread_attr_setstacksize(&attr, stack_size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   772
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   773
    // let pthread_create() pick the default value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   774
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   775
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   776
  ThreadState state;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   777
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   778
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   779
    pthread_t tid;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   780
    int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   781
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   782
    pthread_attr_destroy(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   783
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   784
    if (ret != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   785
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   786
        perror("pthread_create()");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   787
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   788
      // Need to clean up stuff we've allocated so far
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   789
      thread->set_osthread(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   790
      delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   791
      return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   792
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   793
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   794
    // Store pthread info into the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   795
    osthread->set_pthread_id(tid);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   796
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   797
    // Wait until child thread is either initialized or aborted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   798
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   799
      Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   800
      MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   801
      while ((state = osthread->get_state()) == ALLOCATED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   802
        sync_with_child->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   803
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   804
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   805
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   806
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   807
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   808
  // Aborted due to thread limit being reached
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   809
  if (state == ZOMBIE) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   810
    thread->set_osthread(NULL);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   811
    delete osthread;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   812
    return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   813
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   814
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   815
  // The thread is returned suspended (in state INITIALIZED),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   816
  // and is started higher up in the call chain
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   817
  assert(state == INITIALIZED, "race condition");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   818
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   819
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   820
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   821
/////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   822
// attach existing thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   823
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   824
// bootstrap the main thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   825
bool os::create_main_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   826
  assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   827
  return create_attached_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   828
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   829
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   830
bool os::create_attached_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   831
#ifdef ASSERT
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   832
  thread->verify_not_published();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   833
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   834
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   835
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   836
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   838
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   839
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   840
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   841
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   842
  osthread->set_thread_id(os::Bsd::gettid());
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   843
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   844
  // Store pthread info into the OSThread
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   845
#ifdef __APPLE__
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
   846
  uint64_t unique_thread_id = locate_unique_thread_id(osthread->thread_id());
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   847
  guarantee(unique_thread_id != 0, "just checking");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   848
  osthread->set_unique_thread_id(unique_thread_id);
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   849
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   850
  osthread->set_pthread_id(::pthread_self());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   851
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   852
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   853
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   854
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   855
  // Initial thread state is RUNNABLE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   856
  osthread->set_state(RUNNABLE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   857
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   858
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   859
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   860
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   861
  // and save the caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   862
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   863
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   864
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   865
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   866
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   867
void os::pd_start_thread(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   868
  OSThread * osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   869
  assert(osthread->get_state() != INITIALIZED, "just checking");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   870
  Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   871
  MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   872
  sync_with_child->notify();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   873
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   874
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   875
// Free Bsd resources related to the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   876
void os::free_thread(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   877
  assert(osthread != NULL, "osthread not set");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   878
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   879
  if (Thread::current()->osthread() == osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   880
    // Restore caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   881
    sigset_t sigmask = osthread->caller_sigmask();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   882
    pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   883
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   884
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   885
  delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   886
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   887
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   888
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   889
// thread local storage
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   890
23864
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   891
// Restore the thread pointer if the destructor is called. This is in case
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   892
// someone from JNI code sets up a destructor with pthread_key_create to run
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   893
// detachCurrentThread on thread death. Unless we restore the thread pointer we
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   894
// will hang or crash. When detachCurrentThread is called the key will be set
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   895
// to null and we will not be called again. If detachCurrentThread is never
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   896
// called we could loop forever depending on the pthread implementation.
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   897
static void restore_thread_pointer(void* p) {
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   898
  Thread* thread = (Thread*) p;
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   899
  os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   900
}
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   901
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   902
int os::allocate_thread_local_storage() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   903
  pthread_key_t key;
23864
8af6bd3b1375 8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction
kevinw
parents: 23522
diff changeset
   904
  int rslt = pthread_key_create(&key, restore_thread_pointer);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   905
  assert(rslt == 0, "cannot allocate thread local storage");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   906
  return (int)key;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   907
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   908
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   909
// Note: This is currently not used by VM, as we don't destroy TLS key
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   910
// on VM exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   911
void os::free_thread_local_storage(int index) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   912
  int rslt = pthread_key_delete((pthread_key_t)index);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   913
  assert(rslt == 0, "invalid index");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   914
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   915
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   916
void os::thread_local_storage_at_put(int index, void* value) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   917
  int rslt = pthread_setspecific((pthread_key_t)index, value);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   918
  assert(rslt == 0, "pthread_setspecific failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   919
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   920
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   921
extern "C" Thread* get_thread() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   922
  return ThreadLocalStorage::thread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   923
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   924
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   925
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   926
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   927
// time support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   928
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   929
// Time since start-up in seconds to a fine granularity.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   930
// Used by VMSelfDestructTimer and the MemProfiler.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   931
double os::elapsedTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   932
21185
9d53434b1ef5 8027294: Prepare hotspot for non TOD based uptime counter
jbachorik
parents: 20683
diff changeset
   933
  return ((double)os::elapsed_counter()) / os::elapsed_frequency();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   934
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   935
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   936
jlong os::elapsed_counter() {
21185
9d53434b1ef5 8027294: Prepare hotspot for non TOD based uptime counter
jbachorik
parents: 20683
diff changeset
   937
  return javaTimeNanos() - initial_time_count;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   938
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   939
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   940
jlong os::elapsed_frequency() {
21185
9d53434b1ef5 8027294: Prepare hotspot for non TOD based uptime counter
jbachorik
parents: 20683
diff changeset
   941
  return NANOSECS_PER_SEC; // nanosecond resolution
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   942
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   943
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17134
diff changeset
   944
bool os::supports_vtime() { return true; }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   945
bool os::enable_vtime()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   946
bool os::vtime_enabled()  { return false; }
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17134
diff changeset
   947
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   948
double os::elapsedVTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   949
  // better than nothing, but not much
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   950
  return elapsedTime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   951
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   952
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   953
jlong os::javaTimeMillis() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   954
  timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   955
  int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   956
  assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   957
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   958
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   959
28737
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   960
void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   961
  timeval time;
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   962
  int status = gettimeofday(&time, NULL);
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   963
  assert(status != -1, "bsd error");
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   964
  seconds = jlong(time.tv_sec);
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   965
  nanos = jlong(time.tv_usec) * 1000;
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   966
}
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28172
diff changeset
   967
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   968
#ifndef __APPLE__
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   969
  #ifndef CLOCK_MONOTONIC
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   970
    #define CLOCK_MONOTONIC (1)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   971
  #endif
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   972
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   973
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   974
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   975
void os::Bsd::clock_init() {
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   976
  mach_timebase_info(&_timebase_info);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   977
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   978
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   979
void os::Bsd::clock_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   980
  struct timespec res;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   981
  struct timespec tp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   982
  if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   983
      ::clock_gettime(CLOCK_MONOTONIC, &tp)  == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   984
    // yes, monotonic clock is supported
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   985
    _clock_gettime = ::clock_gettime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   986
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   987
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   988
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   989
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   990
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   991
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   992
#ifdef __APPLE__
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   993
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
   994
jlong os::javaTimeNanos() {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   995
  const uint64_t tm = mach_absolute_time();
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   996
  const uint64_t now = (tm * Bsd::_timebase_info.numer) / Bsd::_timebase_info.denom;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   997
  const uint64_t prev = Bsd::_max_abstime;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   998
  if (now <= prev) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
   999
    return prev;   // same or retrograde time;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1000
  }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1001
  const uint64_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&Bsd::_max_abstime, prev);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1002
  assert(obsv >= prev, "invariant");   // Monotonicity
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1003
  // If the CAS succeeded then we're done and return "now".
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1004
  // If the CAS failed and the observed value "obsv" is >= now then
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1005
  // we should return "obsv".  If the CAS failed and now > obsv > prv then
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1006
  // some other thread raced this thread and installed a new value, in which case
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1007
  // we could either (a) retry the entire operation, (b) retry trying to install now
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1008
  // or (c) just return obsv.  We use (c).   No loop is required although in some cases
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1009
  // we might discard a higher "now" value in deference to a slightly lower but freshly
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1010
  // installed obsv value.   That's entirely benign -- it admits no new orderings compared
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1011
  // to (a) or (b) -- and greatly reduces coherence traffic.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1012
  // We might also condition (c) on the magnitude of the delta between obsv and now.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1013
  // Avoiding excessive CAS operations to hot RW locations is critical.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1014
  // See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1015
  return (prev == obsv) ? now : obsv;
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1016
}
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1017
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1018
#else // __APPLE__
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1019
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1020
jlong os::javaTimeNanos() {
22891
1f5d1fff23fa 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 22784
diff changeset
  1021
  if (os::supports_monotonic_clock()) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1022
    struct timespec tp;
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1023
    int status = Bsd::_clock_gettime(CLOCK_MONOTONIC, &tp);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1024
    assert(status == 0, "gettime error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1025
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1026
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1027
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1028
    timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1029
    int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1030
    assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1031
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1032
    return 1000 * usecs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1033
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1034
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1035
24239
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1036
#endif // __APPLE__
db81abb281bc 8040140: System.nanoTime() is slow and non-monotonic on OS X
sla
parents: 23866
diff changeset
  1037
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1038
void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
22891
1f5d1fff23fa 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 22784
diff changeset
  1039
  if (os::supports_monotonic_clock()) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1040
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1041
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1042
    // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1043
    info_ptr->may_skip_backward = false;      // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1044
    info_ptr->may_skip_forward = false;       // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1045
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1046
    // gettimeofday - based on time in seconds since the Epoch thus does not wrap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1047
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1048
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1049
    // gettimeofday is a real time clock so it skips
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1050
    info_ptr->may_skip_backward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1051
    info_ptr->may_skip_forward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1052
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1053
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1054
  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1055
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1056
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1057
// Return the real, user, and system times in seconds from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1058
// arbitrary fixed point in the past.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1059
bool os::getTimesSecs(double* process_real_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1060
                      double* process_user_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1061
                      double* process_system_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1062
  struct tms ticks;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1063
  clock_t real_ticks = times(&ticks);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1064
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1065
  if (real_ticks == (clock_t) (-1)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1066
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1067
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1068
    double ticks_per_second = (double) clock_tics_per_sec;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1069
    *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1070
    *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1071
    *process_real_time = ((double) real_ticks) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1072
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1073
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1074
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1075
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1076
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1077
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1078
char * os::local_time_string(char *buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1079
  struct tm t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1080
  time_t long_time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1081
  time(&long_time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1082
  localtime_r(&long_time, &t);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1083
  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1084
               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1085
               t.tm_hour, t.tm_min, t.tm_sec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1086
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1087
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1088
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1089
struct tm* os::localtime_pd(const time_t* clock, struct tm*  res) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1090
  return localtime_r(clock, res);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1091
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1092
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1093
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1094
// runtime exit support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1095
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1096
// Note: os::shutdown() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1097
// called from signal handler. Before adding something to os::shutdown(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1098
// sure it is async-safe and can handle partially initialized VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1099
void os::shutdown() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1100
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1101
  // allow PerfMemory to attempt cleanup of any persistent resources
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1102
  perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1103
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1104
  // needs to remove object in file system
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1105
  AttachListener::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1106
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1107
  // flush buffered output, finish log files
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1108
  ostream_abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1109
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1110
  // Check for abort hook
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1111
  abort_hook_t abort_hook = Arguments::abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1112
  if (abort_hook != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1113
    abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1114
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1115
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1116
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1117
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1118
// Note: os::abort() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1119
// called from signal handler. Before adding something to os::abort(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1120
// sure it is async-safe and can handle partially initialized VM.
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
  1121
void os::abort(bool dump_core, void* siginfo, void* context) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1122
  os::shutdown();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1123
  if (dump_core) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1124
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1125
    fdStream out(defaultStream::output_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1126
    out.print_raw("Current thread is ");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1127
    char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1128
    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1129
    out.print_raw_cr(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1130
    out.print_raw_cr("Dumping core ...");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1131
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1132
    ::abort(); // dump core
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1133
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1134
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1135
  ::exit(1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1136
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1137
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1138
// Die immediately, no exit hook, no abort hook, no cleanup.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1139
void os::die() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1140
  // _exit() on BsdThreads only kills current thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1141
  ::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1142
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1143
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1144
// This method is a copy of JDK's sysGetLastErrorString
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1145
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1146
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1147
size_t os::lasterror(char *buf, size_t len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1148
  if (errno == 0)  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1149
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1150
  const char *s = ::strerror(errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1151
  size_t n = ::strlen(s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1152
  if (n >= len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1153
    n = len - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1154
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1155
  ::strncpy(buf, s, n);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1156
  buf[n] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1157
  return n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1158
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1159
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1160
// Information of current thread in variety of formats
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1161
pid_t os::Bsd::gettid() {
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1162
  int retval = -1;
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1163
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1164
#ifdef __APPLE__ //XNU kernel
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1165
  // despite the fact mach port is actually not a thread id use it
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1166
  // instead of syscall(SYS_thread_selfid) as it certainly fits to u4
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1167
  retval = ::pthread_mach_thread_np(::pthread_self());
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1168
  guarantee(retval != 0, "just checking");
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1169
  return retval;
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1170
30252
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1171
#else
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1172
  #ifdef __FreeBSD__
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1173
  retval = syscall(SYS_thr_self);
30252
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1174
  #else
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1175
    #ifdef __OpenBSD__
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1176
  retval = syscall(SYS_getthrid);
30252
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1177
    #else
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1178
      #ifdef __NetBSD__
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1179
  retval = (pid_t) syscall(SYS__lwp_self);
30252
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1180
      #endif
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1181
    #endif
b9faf31ff015 8077674: BSD build failures due to undefined macros
dholmes
parents: 30240
diff changeset
  1182
  #endif
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1183
#endif
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1184
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1185
  if (retval == -1) {
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1186
    return getpid();
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1187
  }
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1188
}
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1189
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1190
intx os::current_thread_id() {
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1191
#ifdef __APPLE__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
  1192
  return (intx)::pthread_mach_thread_np(::pthread_self());
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1193
#else
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1194
  return (intx)::pthread_self();
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1195
#endif
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1196
}
20377
393ee12eccc8 8022616: u4 should not be used as a type for thread_id
dsamersoff
parents: 20373
diff changeset
  1197
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1198
int os::current_process_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1199
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1200
  // Under the old bsd thread library, bsd gives each thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1201
  // its own process id. Because of this each thread will return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1202
  // a different pid if this method were to return the result
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1203
  // of getpid(2). Bsd provides no api that returns the pid
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1204
  // of the launcher thread for the vm. This implementation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1205
  // returns a unique pid, the pid of the launcher thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1206
  // that starts the vm 'process'.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1207
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1208
  // Under the NPTL, getpid() returns the same pid as the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1209
  // launcher thread rather than a unique pid per thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1210
  // Use gettid() if you want the old pre NPTL behaviour.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1211
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1212
  // if you are looking for the result of a call to getpid() that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1213
  // returns a unique pid for the calling thread, then look at the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1214
  // OSThread::thread_id() method in osThread_bsd.hpp file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1215
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1216
  return (int)(_initial_pid ? _initial_pid : getpid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1217
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1218
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1219
// DLL functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1220
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1221
#define JNI_LIB_PREFIX "lib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1222
#ifdef __APPLE__
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1223
  #define JNI_LIB_SUFFIX ".dylib"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1224
#else
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1225
  #define JNI_LIB_SUFFIX ".so"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1226
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1227
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1228
const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1229
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1230
// This must be hard coded because it's the system's temporary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1231
// directory not the java application's temp directory, ala java.io.tmpdir.
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1232
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1233
// macosx has a secure per-user temporary directory
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1234
char temp_path_storage[PATH_MAX];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1235
const char* os::get_temp_directory() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1236
  static char *temp_path = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1237
  if (temp_path == NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1238
    int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1239
    if (pathSize == 0 || pathSize > PATH_MAX) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1240
      strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1241
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1242
    temp_path = temp_path_storage;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1243
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1244
  return temp_path;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1245
}
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1246
#else // __APPLE__
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1247
const char* os::get_temp_directory() { return "/tmp"; }
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1248
#endif // __APPLE__
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1249
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1250
static bool file_exists(const char* filename) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1251
  struct stat statbuf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1252
  if (filename == NULL || strlen(filename) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1253
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1254
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1255
  return os::stat(filename, &statbuf) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1256
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1257
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1258
bool os::dll_build_name(char* buffer, size_t buflen,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1259
                        const char* pname, const char* fname) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1260
  bool retval = false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1261
  // Copied from libhpi
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1262
  const size_t pnamelen = pname ? strlen(pname) : 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1263
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1264
  // Return error on buffer overflow.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1265
  if (pnamelen + strlen(fname) + strlen(JNI_LIB_PREFIX) + strlen(JNI_LIB_SUFFIX) + 2 > buflen) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1266
    return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1267
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1268
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1269
  if (pnamelen == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1270
    snprintf(buffer, buflen, JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, fname);
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1271
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1272
  } else if (strchr(pname, *os::path_separator()) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1273
    int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1274
    char** pelements = split_path(pname, &n);
16669
fb3397cee116 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 15929
diff changeset
  1275
    if (pelements == NULL) {
16672
dcubed
parents: 16605 16670
diff changeset
  1276
      return false;
16669
fb3397cee116 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 15929
diff changeset
  1277
    }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  1278
    for (int i = 0; i < n; i++) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1279
      // Really shouldn't be NULL, but check can't hurt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1280
      if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1281
        continue; // skip the empty path values
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1282
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1283
      snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1284
               pelements[i], fname);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1285
      if (file_exists(buffer)) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1286
        retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1287
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1288
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1289
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1290
    // release the storage
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  1291
    for (int i = 0; i < n; i++) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1292
      if (pelements[i] != NULL) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
  1293
        FREE_C_HEAP_ARRAY(char, pelements[i]);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1294
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1295
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1296
    if (pelements != NULL) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27474
diff changeset
  1297
      FREE_C_HEAP_ARRAY(char*, pelements);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1298
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1299
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1300
    snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1301
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1302
  }
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1303
  return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1304
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1305
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1306
// check if addr is inside libjvm.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1307
bool os::address_is_in_vm(address addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1308
  static address libjvm_base_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1309
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1310
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1311
  if (libjvm_base_addr == NULL) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1312
    if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1313
      libjvm_base_addr = (address)dlinfo.dli_fbase;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1314
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1315
    assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1316
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1317
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1318
  if (dladdr((void *)addr, &dlinfo) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1319
    if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1320
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1321
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1322
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1323
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1324
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1325
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1326
#define MACH_MAXSYMLEN 256
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1327
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1328
bool os::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: 31026
diff changeset
  1329
                                      int buflen, int *offset,
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1330
                                      bool demangle) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1331
  // buf is not optional, but offset is optional
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1332
  assert(buf != NULL, "sanity check");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1333
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1334
  Dl_info dlinfo;
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1335
  char localbuf[MACH_MAXSYMLEN];
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1336
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1337
  if (dladdr((void*)addr, &dlinfo) != 0) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1338
    // see if we have a matching symbol
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1339
    if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1340
      if (!(demangle && Decoder::demangle(dlinfo.dli_sname, buf, buflen))) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1341
        jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1342
      }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1343
      if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1344
      return true;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1345
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1346
    // no matching symbol so try for just file info
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1347
    if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1348
      if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1349
                          buf, buflen, offset, dlinfo.dli_fname, demangle)) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1350
        return true;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1351
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1352
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1353
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1354
    // Handle non-dynamic manually:
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1355
    if (dlinfo.dli_fbase != NULL &&
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1356
        Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1357
                        dlinfo.dli_fbase)) {
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1358
      if (!(demangle && Decoder::demangle(localbuf, buf, buflen))) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1359
        jio_snprintf(buf, buflen, "%s", localbuf);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1360
      }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1361
      return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1362
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1363
  }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1364
  buf[0] = '\0';
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1365
  if (offset != NULL) *offset = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1366
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1367
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1368
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1369
// ported from solaris version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1370
bool os::dll_address_to_library_name(address addr, char* buf,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1371
                                     int buflen, int* offset) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1372
  // buf is not optional, but offset is optional
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1373
  assert(buf != NULL, "sanity check");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1374
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1375
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1376
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1377
  if (dladdr((void*)addr, &dlinfo) != 0) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1378
    if (dlinfo.dli_fname != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1379
      jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1380
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1381
    if (dlinfo.dli_fbase != NULL && offset != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1382
      *offset = addr - (address)dlinfo.dli_fbase;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1383
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1384
    return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1385
  }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1386
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1387
  buf[0] = '\0';
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1388
  if (offset) *offset = -1;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1389
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1390
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1391
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1392
// Loads .dll/.so and
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1393
// in case of error it checks if .dll/.so was built for the
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1394
// same architecture as Hotspot is running on
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1395
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1396
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1397
void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1398
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1399
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1400
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1401
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1402
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1403
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1404
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1405
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1406
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1407
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1408
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1409
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1410
#else
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1411
void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1412
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1413
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1414
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1415
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1416
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1417
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1418
  Elf32_Ehdr elf_head;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1419
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1420
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1421
  // It may or may not be overwritten below
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1422
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1423
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1424
  int diag_msg_max_length=ebuflen-strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1425
  char* diag_msg_buf=ebuf+strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1426
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1427
  if (diag_msg_max_length==0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1428
    // No more space in ebuf for additional diagnostics message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1429
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1430
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1431
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1432
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1433
  int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1434
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1435
  if (file_descriptor < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1436
    // Can't open library, report dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1437
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1438
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1439
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1440
  bool failed_to_read_elf_head=
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1441
    (sizeof(elf_head)!=
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1442
     (::read(file_descriptor, &elf_head,sizeof(elf_head))));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1443
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1444
  ::close(file_descriptor);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1445
  if (failed_to_read_elf_head) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1446
    // file i/o error - report dlerror() msg
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1447
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1448
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1449
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1450
  typedef struct {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1451
    Elf32_Half  code;         // Actual value as defined in elf.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1452
    Elf32_Half  compat_class; // Compatibility of archs at VM's sense
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1453
    char        elf_class;    // 32 or 64 bit
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1454
    char        endianess;    // MSB or LSB
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1455
    char*       name;         // String representation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1456
  } arch_t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1457
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1458
  #ifndef EM_486
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1459
    #define EM_486          6               /* Intel 80486 */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1460
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1461
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1462
  #ifndef EM_MIPS_RS3_LE
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1463
    #define EM_MIPS_RS3_LE  10              /* MIPS */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1464
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1465
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1466
  #ifndef EM_PPC64
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1467
    #define EM_PPC64        21              /* PowerPC64 */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1468
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1469
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1470
  #ifndef EM_S390
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1471
    #define EM_S390         22              /* IBM System/390 */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1472
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1474
  #ifndef EM_IA_64
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1475
    #define EM_IA_64        50              /* HP/Intel IA-64 */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1476
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1477
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1478
  #ifndef EM_X86_64
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1479
    #define EM_X86_64       62              /* AMD x86-64 */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1480
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1481
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1482
  static const arch_t arch_array[]={
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1483
    {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1484
    {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1485
    {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1486
    {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1487
    {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1488
    {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1489
    {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1490
    {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1491
    {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1492
    {EM_ARM,         EM_ARM,     ELFCLASS32,   ELFDATA2LSB, (char*)"ARM"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1493
    {EM_S390,        EM_S390,    ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1494
    {EM_ALPHA,       EM_ALPHA,   ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1495
    {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1496
    {EM_MIPS,        EM_MIPS,    ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1497
    {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1498
    {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1499
  };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1500
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1501
  #if  (defined IA32)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1502
  static  Elf32_Half running_arch_code=EM_386;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1503
  #elif   (defined AMD64)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1504
  static  Elf32_Half running_arch_code=EM_X86_64;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1505
  #elif  (defined IA64)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1506
  static  Elf32_Half running_arch_code=EM_IA_64;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1507
  #elif  (defined __sparc) && (defined _LP64)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1508
  static  Elf32_Half running_arch_code=EM_SPARCV9;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1509
  #elif  (defined __sparc) && (!defined _LP64)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1510
  static  Elf32_Half running_arch_code=EM_SPARC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1511
  #elif  (defined __powerpc64__)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1512
  static  Elf32_Half running_arch_code=EM_PPC64;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1513
  #elif  (defined __powerpc__)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1514
  static  Elf32_Half running_arch_code=EM_PPC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1515
  #elif  (defined ARM)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1516
  static  Elf32_Half running_arch_code=EM_ARM;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1517
  #elif  (defined S390)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1518
  static  Elf32_Half running_arch_code=EM_S390;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1519
  #elif  (defined ALPHA)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1520
  static  Elf32_Half running_arch_code=EM_ALPHA;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1521
  #elif  (defined MIPSEL)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1522
  static  Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1523
  #elif  (defined PARISC)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1524
  static  Elf32_Half running_arch_code=EM_PARISC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1525
  #elif  (defined MIPS)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1526
  static  Elf32_Half running_arch_code=EM_MIPS;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1527
  #elif  (defined M68K)
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1528
  static  Elf32_Half running_arch_code=EM_68K;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1529
  #else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1530
    #error Method os::dll_load requires that one of following is defined:\
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1531
         IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1532
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1533
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1534
  // Identify compatability class for VM's architecture and library's architecture
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1535
  // Obtain string descriptions for architectures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1536
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1537
  arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1538
  int running_arch_index=-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1539
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  1540
  for (unsigned int i=0; i < ARRAY_SIZE(arch_array); i++) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1541
    if (running_arch_code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1542
      running_arch_index    = i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1543
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1544
    if (lib_arch.code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1545
      lib_arch.compat_class = arch_array[i].compat_class;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1546
      lib_arch.name         = arch_array[i].name;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1547
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1548
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1549
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1550
  assert(running_arch_index != -1,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1551
         "Didn't find running architecture code (running_arch_code) in arch_array");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1552
  if (running_arch_index == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1553
    // Even though running architecture detection failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1554
    // we may still continue with reporting dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1555
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1556
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1557
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1558
  if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1559
    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1560
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1561
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1562
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1563
#ifndef S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1564
  if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1565
    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1566
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1567
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1568
#endif // !S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1569
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1570
  if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  1571
    if (lib_arch.name!=NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1572
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1573
                 " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1574
                 lib_arch.name, arch_array[running_arch_index].name);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1575
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1576
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1577
                 " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1578
                 lib_arch.code,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1579
                 arch_array[running_arch_index].name);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1580
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1581
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1582
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1583
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1584
}
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1585
#endif // !__APPLE__
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1586
22528
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1587
void* os::get_default_process_handle() {
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1588
#ifdef __APPLE__
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1589
  // MacOS X needs to use RTLD_FIRST instead of RTLD_LAZY
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1590
  // to avoid finding unexpected symbols on second (or later)
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1591
  // loads of a library.
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1592
  return (void*)::dlopen(NULL, RTLD_FIRST);
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1593
#else
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1594
  return (void*)::dlopen(NULL, RTLD_LAZY);
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1595
#endif
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1596
}
bd3821442010 8031968: Mac OS X: VM starts the agent by calling both Agent_OnAttach and Agent_OnAttach_L functions if its agent library is dynamically linked.
sla
parents: 21213
diff changeset
  1597
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1598
// XXX: Do we need a lock around this as per Linux?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1599
void* os::dll_lookup(void* handle, const char* name) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1600
  return dlsym(handle, name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1601
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1602
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1603
int _print_dll_info_cb(const char * name, address base_address, address top_address, void * param) {
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1604
  outputStream * out = (outputStream *) param;
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1605
  out->print_cr(PTR_FORMAT " \t%s", base_address, name);
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1606
  return 0;
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1607
}
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1608
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1609
void os::print_dll_info(outputStream *st) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1610
  st->print_cr("Dynamic libraries:");
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1611
  if (get_loaded_modules_info(_print_dll_info_cb, (void *)st)) {
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1612
    st->print_cr("Error: Cannot print dynamic libraries.");
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1613
  }
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1614
}
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1615
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1616
int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *param) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1617
#ifdef RTLD_DI_LINKMAP
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1618
  Dl_info dli;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1619
  void *handle;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1620
  Link_map *map;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1621
  Link_map *p;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1622
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1623
  if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1624
      dli.dli_fname == NULL) {
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1625
    return 1;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1626
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1627
  handle = dlopen(dli.dli_fname, RTLD_LAZY);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1628
  if (handle == NULL) {
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1629
    return 1;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1630
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1631
  dlinfo(handle, RTLD_DI_LINKMAP, &map);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1632
  if (map == NULL) {
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1633
    dlclose(handle);
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1634
    return 1;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1635
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1636
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1637
  while (map->l_prev != NULL)
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1638
    map = map->l_prev;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1639
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1640
  while (map != NULL) {
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1641
    // Value for top_address is returned as 0 since we don't have any information about module size
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1642
    if (callback(map->l_name, (address)map->l_addr, (address)0, param)) {
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1643
      dlclose(handle);
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1644
      return 1;
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1645
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1646
    map = map->l_next;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1647
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1648
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1649
  dlclose(handle);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1650
#elif defined(__APPLE__)
26409
9f717958a2bb 8055755: Information about loaded dynamic libraries is wrong on MacOSX
sla
parents: 25946
diff changeset
  1651
  for (uint32_t i = 1; i < _dyld_image_count(); i++) {
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1652
    // Value for top_address is returned as 0 since we don't have any information about module size
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1653
    if (callback(_dyld_get_image_name(i), (address)_dyld_get_image_header(i), (address)0, param)) {
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1654
      return 1;
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1655
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1656
  }
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1657
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1658
#else
26557
e399effe36f9 8056242: Add function to return structured information about loaded libraries.
sla
parents: 26409
diff changeset
  1659
  return 1;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1660
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1661
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1662
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1663
void os::get_summary_os_info(char* buf, size_t buflen) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1664
  // These buffers are small because we want this to be brief
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1665
  // and not use a lot of stack while generating the hs_err file.
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1666
  char os[100];
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1667
  size_t size = sizeof(os);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1668
  int mib_kern[] = { CTL_KERN, KERN_OSTYPE };
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1669
  if (sysctl(mib_kern, 2, os, &size, NULL, 0) < 0) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1670
#ifdef __APPLE__
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1671
      strncpy(os, "Darwin", sizeof(os));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1672
#elif __OpenBSD__
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1673
      strncpy(os, "OpenBSD", sizeof(os));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1674
#else
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1675
      strncpy(os, "BSD", sizeof(os));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1676
#endif
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1677
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1678
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1679
  char release[100];
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1680
  size = sizeof(release);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1681
  int mib_release[] = { CTL_KERN, KERN_OSRELEASE };
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1682
  if (sysctl(mib_release, 2, release, &size, NULL, 0) < 0) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1683
      // if error, leave blank
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1684
      strncpy(release, "", sizeof(release));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1685
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1686
  snprintf(buf, buflen, "%s %s", os, release);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1687
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1688
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1689
void os::print_os_info_brief(outputStream* st) {
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1690
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1691
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1692
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1693
void os::print_os_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1694
  st->print("OS:");
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1695
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1696
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1697
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1698
  os::Posix::print_rlimit_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1699
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1700
  os::Posix::print_load_average(st);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1701
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1702
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31026
diff changeset
  1703
void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1704
  // Nothing to do for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1705
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1706
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1707
void os::get_summary_cpu_info(char* buf, size_t buflen) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1708
  unsigned int mhz;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1709
  size_t size = sizeof(mhz);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1710
  int mib[] = { CTL_HW, HW_CPU_FREQ };
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1711
  if (sysctl(mib, 2, &mhz, &size, NULL, 0) < 0) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1712
    mhz = 1;  // looks like an error but can be divided by
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1713
  } else {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1714
    mhz /= 1000000;  // reported in millions
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1715
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1716
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1717
  char model[100];
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1718
  size = sizeof(model);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1719
  int mib_model[] = { CTL_HW, HW_MODEL };
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1720
  if (sysctl(mib_model, 2, model, &size, NULL, 0) < 0) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1721
    strncpy(model, cpu_arch, sizeof(model));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1722
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1723
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1724
  char machine[100];
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1725
  size = sizeof(machine);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1726
  int mib_machine[] = { CTL_HW, HW_MACHINE };
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1727
  if (sysctl(mib_machine, 2, machine, &size, NULL, 0) < 0) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1728
      strncpy(machine, "", sizeof(machine));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1729
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1730
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1731
  snprintf(buf, buflen, "%s %s %d MHz", model, machine, mhz);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1732
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31610
diff changeset
  1733
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1734
void os::print_memory_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1735
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1736
  st->print("Memory:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1737
  st->print(" %dk page", os::vm_page_size()>>10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1738
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1739
  st->print(", physical " UINT64_FORMAT "k",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1740
            os::physical_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1741
  st->print("(" UINT64_FORMAT "k free)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1742
            os::available_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1743
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1744
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1745
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1746
void os::print_siginfo(outputStream* st, void* siginfo) {
22826
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  1747
  const siginfo_t* si = (const siginfo_t*)siginfo;
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  1748
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  1749
  os::Posix::print_siginfo_brief(st, si);
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  1750
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  1751
  if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1752
      UseSharedSpaces) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1753
    FileMapInfo* mapinfo = FileMapInfo::current_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1754
    if (mapinfo->is_in_shared_space(si->si_addr)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1755
      st->print("\n\nError accessing class data sharing archive."   \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1756
                " Mapped file inaccessible during execution, "      \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1757
                " possible disk/network problem.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1758
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1759
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1760
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1761
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1762
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1763
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1764
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1765
                                 char* buf, size_t buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1766
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1767
void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1768
  st->print_cr("Signal Handlers:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1769
  print_signal_handler(st, SIGSEGV, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1770
  print_signal_handler(st, SIGBUS , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1771
  print_signal_handler(st, SIGFPE , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1772
  print_signal_handler(st, SIGPIPE, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1773
  print_signal_handler(st, SIGXFSZ, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1774
  print_signal_handler(st, SIGILL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1775
  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1776
  print_signal_handler(st, SR_signum, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1777
  print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1778
  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1779
  print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1780
  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1781
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1782
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1783
static char saved_jvm_path[MAXPATHLEN] = {0};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1784
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1785
// Find the full path to the current module, libjvm
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1786
void os::jvm_path(char *buf, jint buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1787
  // Error checking.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1788
  if (buflen < MAXPATHLEN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1789
    assert(false, "must use a large-enough buffer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1790
    buf[0] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1791
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1792
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1793
  // Lazy resolve the path to current module.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1794
  if (saved_jvm_path[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1795
    strcpy(buf, saved_jvm_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1796
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1797
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1798
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1799
  char dli_fname[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1800
  bool ret = dll_address_to_library_name(
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1801
                                         CAST_FROM_FN_PTR(address, os::jvm_path),
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1802
                                         dli_fname, sizeof(dli_fname), NULL);
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1803
  assert(ret, "cannot locate libjvm");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1804
  char *rp = NULL;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1805
  if (ret && dli_fname[0] != '\0') {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1806
    rp = realpath(dli_fname, buf);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1807
  }
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1808
  if (rp == NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1809
    return;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1810
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1811
22734
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1812
  if (Arguments::sun_java_launcher_is_altjvm()) {
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1813
    // Support for the java launcher's '-XXaltjvm=<path>' option. Typical
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1814
    // value for buf is "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so"
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1815
    // or "<JAVA_HOME>/jre/lib/<vmtype>/libjvm.dylib". If "/jre/lib/"
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1816
    // appears at the right place in the string, then assume we are
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1817
    // installed in a JDK and we're done. Otherwise, check for a
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1818
    // JAVA_HOME environment variable and construct a path to the JVM
41757c1f3946 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 22533
diff changeset
  1819
    // being overridden.
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1820
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1821
    const char *p = buf + strlen(buf) - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1822
    for (int count = 0; p > buf && count < 5; ++count) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1823
      for (--p; p > buf && *p != '/'; --p)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1824
        /* empty */ ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1825
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1826
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1827
    if (strncmp(p, "/jre/lib/", 9) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1828
      // Look for JAVA_HOME in the environment.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1829
      char* java_home_var = ::getenv("JAVA_HOME");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1830
      if (java_home_var != NULL && java_home_var[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1831
        char* jrelib_p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1832
        int len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1833
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1834
        // Check the current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1835
        p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1836
        assert(strstr(p, "/libjvm") == p, "invalid library name");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1838
        rp = realpath(java_home_var, buf);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1839
        if (rp == NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1840
          return;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1841
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1842
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1843
        // determine if this is a legacy image or modules image
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1844
        // modules image doesn't have "jre" subdirectory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1845
        len = strlen(buf);
25503
9f471b837330 8030763: Validate global memory allocation
hseigel
parents: 25477
diff changeset
  1846
        assert(len < buflen, "Ran out of buffer space");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1847
        jrelib_p = buf + len;
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1848
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1849
        // Add the appropriate library subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1850
        snprintf(jrelib_p, buflen-len, "/jre/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1851
        if (0 != access(buf, F_OK)) {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1852
          snprintf(jrelib_p, buflen-len, "/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1853
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1854
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1855
        // Add the appropriate client or server subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1856
        len = strlen(buf);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1857
        jrelib_p = buf + len;
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1858
        snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1859
        if (0 != access(buf, F_OK)) {
22784
f264891fc7a8 8030350: Enable additional compiler warnings for GCC
mduigou
parents: 22734
diff changeset
  1860
          snprintf(jrelib_p, buflen-len, "%s", "");
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1861
        }
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1862
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1863
        // If the path exists within JAVA_HOME, add the JVM library name
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1864
        // to complete the path to JVM being overridden.  Otherwise fallback
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1865
        // to the path to the current library.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1866
        if (0 == access(buf, F_OK)) {
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1867
          // Use current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1868
          len = strlen(buf);
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1869
          snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1870
        } else {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1871
          // Fall back to path of current library
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1872
          rp = realpath(dli_fname, buf);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1873
          if (rp == NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1874
            return;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1875
          }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1876
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1877
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1878
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1879
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1880
25503
9f471b837330 8030763: Validate global memory allocation
hseigel
parents: 25477
diff changeset
  1881
  strncpy(saved_jvm_path, buf, MAXPATHLEN);
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27458
diff changeset
  1882
  saved_jvm_path[MAXPATHLEN - 1] = '\0';
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1883
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1884
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1885
void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1886
  // no prefix required, not even "_"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1887
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1888
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1889
void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1890
  // no suffix required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1891
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1892
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1893
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1894
// sun.misc.Signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1895
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1896
static volatile jint sigint_count = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1897
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1898
static void UserHandler(int sig, void *siginfo, void *context) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1899
  // 4511530 - sem_post is serialized and handled by the manager thread. When
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1900
  // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1901
  // don't want to flood the manager thread with sem_post requests.
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1902
  if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1903
    return;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1904
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1905
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1906
  // Ctrl-C is pressed during error reporting, likely because the error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1907
  // handler fails to abort. Let VM die immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1908
  if (sig == SIGINT && is_error_reported()) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  1909
    os::die();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1910
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1911
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1912
  os::signal_notify(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1913
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1914
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1915
void* os::user_handler() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1916
  return CAST_FROM_FN_PTR(void*, UserHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1917
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1918
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1919
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1920
  typedef void (*sa_handler_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1921
  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1922
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1923
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1924
void* os::signal(int signal_number, void* handler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1925
  struct sigaction sigAct, oldSigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1926
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1927
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1928
  sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1929
  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1930
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1931
  if (sigaction(signal_number, &sigAct, &oldSigAct)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1932
    // -1 means registration failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1933
    return (void *)-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1934
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1935
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1936
  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1937
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1938
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1939
void os::signal_raise(int signal_number) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1940
  ::raise(signal_number);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1941
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1942
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1943
// The following code is moved from os.cpp for making this
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1944
// code platform specific, which it is by its very nature.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1945
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1946
// Will be modified when max signal is changed to be dynamic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1947
int os::sigexitnum_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1948
  return NSIG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1949
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1950
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1951
// a counter for each possible signal value
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1952
static volatile jint pending_signals[NSIG+1] = { 0 };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1953
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1954
// Bsd(POSIX) specific hand shaking semaphore.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1955
#ifdef __APPLE__
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1956
typedef semaphore_t os_semaphore_t;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1957
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1958
  #define SEM_INIT(sem, value)    semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1959
  #define SEM_WAIT(sem)           semaphore_wait(sem)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1960
  #define SEM_POST(sem)           semaphore_signal(sem)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1961
  #define SEM_DESTROY(sem)        semaphore_destroy(mach_task_self(), sem)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1962
#else
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1963
typedef sem_t os_semaphore_t;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1964
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1965
  #define SEM_INIT(sem, value)    sem_init(&sem, 0, value)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1966
  #define SEM_WAIT(sem)           sem_wait(&sem)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1967
  #define SEM_POST(sem)           sem_post(&sem)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  1968
  #define SEM_DESTROY(sem)        sem_destroy(&sem)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1969
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1970
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1971
#ifdef __APPLE__
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1972
// OS X doesn't support unamed POSIX semaphores, so the implementation in os_posix.cpp can't be used.
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1973
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1974
static const char* sem_init_strerror(kern_return_t value) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1975
  switch (value) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1976
    case KERN_INVALID_ARGUMENT:  return "Invalid argument";
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1977
    case KERN_RESOURCE_SHORTAGE: return "Resource shortage";
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1978
    default:                     return "Unknown";
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1979
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1980
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1981
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1982
OSXSemaphore::OSXSemaphore(uint value) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1983
  kern_return_t ret = SEM_INIT(_semaphore, value);
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1984
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1985
  guarantee(ret == KERN_SUCCESS, err_msg("Failed to create semaphore: %s", sem_init_strerror(ret)));
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1986
}
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1987
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1988
OSXSemaphore::~OSXSemaphore() {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1989
  SEM_DESTROY(_semaphore);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1990
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1991
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1992
void OSXSemaphore::signal(uint count) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1993
  for (uint i = 0; i < count; i++) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1994
    kern_return_t ret = SEM_POST(_semaphore);
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1995
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1996
    assert(ret == KERN_SUCCESS, "Failed to signal semaphore");
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  1997
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1998
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1999
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2000
void OSXSemaphore::wait() {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2001
  kern_return_t ret;
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2002
  while ((ret = SEM_WAIT(_semaphore)) == KERN_ABORTED) {
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2003
    // Semaphore was interrupted. Retry.
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2004
  }
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2005
  assert(ret == KERN_SUCCESS, "Failed to wait on semaphore");
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2006
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2007
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2008
jlong OSXSemaphore::currenttime() {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2009
  struct timeval tv;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2010
  gettimeofday(&tv, NULL);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2011
  return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2012
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2013
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2014
bool OSXSemaphore::trywait() {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2015
  return timedwait(0, 0);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2016
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2017
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2018
bool OSXSemaphore::timedwait(unsigned int sec, int nsec) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2019
  kern_return_t kr = KERN_ABORTED;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2020
  mach_timespec_t waitspec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2021
  waitspec.tv_sec = sec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2022
  waitspec.tv_nsec = nsec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2023
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2024
  jlong starttime = currenttime();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2026
  kr = semaphore_timedwait(_semaphore, waitspec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2027
  while (kr == KERN_ABORTED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2028
    jlong totalwait = (sec * NANOSECS_PER_SEC) + nsec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2029
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2030
    jlong current = currenttime();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2031
    jlong passedtime = current - starttime;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2032
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2033
    if (passedtime >= totalwait) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2034
      waitspec.tv_sec = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2035
      waitspec.tv_nsec = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2036
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2037
      jlong waittime = totalwait - (current - starttime);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2038
      waitspec.tv_sec = waittime / NANOSECS_PER_SEC;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2039
      waitspec.tv_nsec = waittime % NANOSECS_PER_SEC;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2040
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2041
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2042
    kr = semaphore_timedwait(_semaphore, waitspec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2043
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2044
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2045
  return kr == KERN_SUCCESS;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2046
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2047
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2048
#else
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2049
// Use POSIX implementation of semaphores.
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2050
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2051
struct timespec PosixSemaphore::create_timespec(unsigned int sec, int nsec) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2052
  struct timespec ts;
20373
5d68702ea998 8025283: Nits in os_bsd file breaks compilation of open hotspot
dsamersoff
parents: 19986
diff changeset
  2053
  unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2054
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2055
  return ts;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2056
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2057
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2058
#endif // __APPLE__
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2059
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2060
static os_semaphore_t sig_sem;
31610
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2061
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2062
#ifdef __APPLE__
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2063
static OSXSemaphore sr_semaphore;
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2064
#else
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2065
static PosixSemaphore sr_semaphore;
b05ea6f92971 8087322: Implement a Semaphore utility class
stefank
parents: 31377
diff changeset
  2066
#endif
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2067
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2068
void os::signal_init_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2069
  // Initialize signal structures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2070
  ::memset((void*)pending_signals, 0, sizeof(pending_signals));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2071
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2072
  // Initialize signal semaphore
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2073
  ::SEM_INIT(sig_sem, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2074
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2075
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2076
void os::signal_notify(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2077
  Atomic::inc(&pending_signals[sig]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2078
  ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2079
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2080
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2081
static int check_pending_signals(bool wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2082
  Atomic::store(0, &sigint_count);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2083
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2084
    for (int i = 0; i < NSIG + 1; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2085
      jint n = pending_signals[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2086
      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2087
        return i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2088
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2089
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2090
    if (!wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2091
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2092
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2093
    JavaThread *thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2094
    ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2095
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2096
    bool threadIsSuspended;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2097
    do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2098
      thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2099
      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2100
      ::SEM_WAIT(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2101
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2102
      // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2103
      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2104
      if (threadIsSuspended) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2105
        // The semaphore has been incremented, but while we were waiting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2106
        // another thread suspended us. We don't want to continue running
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2107
        // while suspended because that would surprise the thread that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2108
        // suspended us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2109
        ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2110
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2111
        thread->java_suspend_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2112
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2113
    } while (threadIsSuspended);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2114
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2115
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2116
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2117
int os::signal_lookup() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2118
  return check_pending_signals(false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2119
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2120
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2121
int os::signal_wait() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2122
  return check_pending_signals(true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2123
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2124
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2125
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2126
// Virtual Memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2127
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2128
int os::vm_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2129
  // Seems redundant as all get out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2130
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2131
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2132
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2133
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2134
// Solaris allocates memory by pages.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2135
int os::vm_allocation_granularity() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2136
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2137
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2138
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2139
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2140
// Rationale behind this function:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2141
//  current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2142
//  mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2143
//  samples for JITted code. Here we create private executable mapping over the code cache
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2144
//  and then we can use standard (well, almost, as mapping can change) way to provide
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2145
//  info for the reporting script by storing timestamp and location of symbol
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2146
void bsd_wrap_code(char* base, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2147
  static volatile jint cnt = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2148
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2149
  if (!UseOprofile) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2150
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2151
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2152
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2153
  char buf[PATH_MAX + 1];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2154
  int num = Atomic::add(1, &cnt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2155
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2156
  snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2157
           os::get_temp_directory(), os::current_process_id(), num);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2158
  unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2159
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2160
  int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2161
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2162
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2163
    off_t rv = ::lseek(fd, size-2, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2164
    if (rv != (off_t)-1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2165
      if (::write(fd, "", 1) == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2166
        mmap(base, size,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2167
             PROT_READ|PROT_WRITE|PROT_EXEC,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2168
             MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2169
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2170
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2171
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2172
    unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2173
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2174
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2175
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2176
static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2177
                                    int err) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2178
  warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2179
          ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2180
          strerror(err), err);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2181
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2182
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2183
// NOTE: Bsd kernel does not really reserve the pages for us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2184
//       All it does is to check if there are enough free pages
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2185
//       left at the time of mmap(). This could be a potential
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2186
//       problem.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2187
bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2188
  int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2189
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2190
  // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2191
  if (::mprotect(addr, size, prot) == 0) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2192
    return true;
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2193
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2194
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2195
  uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2196
                                     MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2197
  if (res != (uintptr_t) MAP_FAILED) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2198
    return true;
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2199
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2200
#endif
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2201
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2202
  // Warn about any commit errors we see in non-product builds just
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2203
  // in case mmap() doesn't work as described on the man page.
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2204
  NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);)
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2205
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2206
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2207
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2208
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2209
bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2210
                          bool exec) {
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2211
  // alignment_hint is ignored on this OS
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2212
  return pd_commit_memory(addr, size, exec);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2213
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2214
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2215
void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2216
                                  const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2217
  assert(mesg != NULL, "mesg must be specified");
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2218
  if (!pd_commit_memory(addr, size, exec)) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2219
    // add extra info in product mode for vm_exit_out_of_memory():
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2220
    PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2221
    vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2222
  }
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2223
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2224
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2225
void os::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
  2226
                                  size_t alignment_hint, bool exec,
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2227
                                  const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2228
  // alignment_hint is ignored on this OS
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2229
  pd_commit_memory_or_exit(addr, size, exec, mesg);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2230
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2231
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2232
void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2233
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2234
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2235
void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2236
  ::madvise(addr, bytes, MADV_DONTNEED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2237
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2238
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2239
void os::numa_make_global(char *addr, size_t bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2240
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2241
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2242
void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2243
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2244
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2245
bool os::numa_topology_changed()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2246
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2247
size_t os::numa_get_groups_num() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2248
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2249
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2250
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2251
int os::numa_get_group_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2252
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2253
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2254
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2255
size_t os::numa_get_leaf_groups(int *ids, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2256
  if (size > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2257
    ids[0] = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2258
    return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2259
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2260
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2261
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2262
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2263
bool os::get_page_info(char *start, page_info* info) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2264
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2265
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2266
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2267
char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2268
  return end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2269
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2270
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2271
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2272
bool os::pd_uncommit_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2273
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2274
  // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2275
  return ::mprotect(addr, size, PROT_NONE) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2276
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2277
  uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2278
                                     MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2279
  return res  != (uintptr_t) MAP_FAILED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2280
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2281
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2282
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2283
bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2284
  return os::commit_memory(addr, size, !ExecMem);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2285
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2286
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2287
// If this is a growable mapping, remove the guard pages entirely by
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2288
// munmap()ping them.  If not, just call uncommit_memory().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2289
bool os::remove_stack_guard_pages(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2290
  return os::uncommit_memory(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2291
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2292
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2293
// If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2294
// at 'requested_addr'. If there are existing memory mappings at the same
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2295
// location, however, they will be overwritten. If 'fixed' is false,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2296
// 'requested_addr' is only treated as a hint, the return value may or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2297
// may not start from the requested address. Unlike Bsd mmap(), this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2298
// function returns NULL to indicate failure.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2299
static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2300
  char * addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2301
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2302
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2303
  flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2304
  if (fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2305
    assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2306
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2307
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2308
17083
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2309
  // Map reserved/uncommitted pages PROT_NONE so we fail early if we
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2310
  // touch an uncommitted page. Otherwise, the read/write might
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2311
  // succeed if we have enough swap space to back the physical page.
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2312
  addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2313
                       flags, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2314
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2315
  return addr == MAP_FAILED ? NULL : addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2316
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2317
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2318
static int anon_munmap(char * addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2319
  return ::munmap(addr, size) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2320
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2321
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2322
char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2323
                            size_t alignment_hint) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2324
  return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2325
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2326
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2327
bool os::pd_release_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2328
  return anon_munmap(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2329
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2330
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2331
static bool bsd_mprotect(char* addr, size_t size, int prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2332
  // Bsd wants the mprotect address argument to be page aligned.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2333
  char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2334
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2335
  // According to SUSv3, mprotect() should only be used with mappings
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2336
  // established by mmap(), and mmap() always maps whole pages. Unaligned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2337
  // 'addr' likely indicates problem in the VM (e.g. trying to change
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2338
  // protection of malloc'ed or statically allocated memory). Check the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2339
  // caller if you hit this assert.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2340
  assert(addr == bottom, "sanity check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2341
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2342
  size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2343
  return ::mprotect(bottom, size, prot) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2344
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2345
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2346
// Set protections specified
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2347
bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2348
                        bool is_committed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2349
  unsigned int p = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2350
  switch (prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2351
  case MEM_PROT_NONE: p = PROT_NONE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2352
  case MEM_PROT_READ: p = PROT_READ; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2353
  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2354
  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2355
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2356
    ShouldNotReachHere();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2357
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2358
  // is_committed is unused.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2359
  return bsd_mprotect(addr, bytes, p);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2360
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2361
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2362
bool os::guard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2363
  return bsd_mprotect(addr, size, PROT_NONE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2364
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2365
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2366
bool os::unguard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2367
  return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2368
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2369
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2370
bool os::Bsd::hugetlbfs_sanity_check(bool warn, size_t page_size) {
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2371
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2372
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2373
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2374
// Large page support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2375
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2376
static size_t _large_page_size = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2377
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2378
void os::large_page_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2379
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2380
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2381
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  2382
char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  2383
  fatal("This code is not used or maintained.");
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  2384
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2385
  // "exec" is passed in but not used.  Creating the shared image for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2386
  // the code cache doesn't have an SHM_X executable permission to check.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2387
  assert(UseLargePages && UseSHM, "only for SHM large pages");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2388
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2389
  key_t key = IPC_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2390
  char *addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2391
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2392
  bool warn_on_failure = UseLargePages &&
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2393
                         (!FLAG_IS_DEFAULT(UseLargePages) ||
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2394
                          !FLAG_IS_DEFAULT(LargePageSizeInBytes));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2395
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2396
  // Create a large shared memory region to attach to based on size.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2397
  // Currently, size is the total size of the heap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2398
  int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2399
  if (shmid == -1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2400
    // Possible reasons for shmget failure:
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2401
    // 1. shmmax is too small for Java heap.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2402
    //    > check shmmax value: cat /proc/sys/kernel/shmmax
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2403
    //    > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2404
    // 2. not enough large page memory.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2405
    //    > check available large pages: cat /proc/meminfo
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2406
    //    > increase amount of large pages:
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2407
    //          echo new_value > /proc/sys/vm/nr_hugepages
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2408
    //      Note 1: different Bsd may use different name for this property,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2409
    //            e.g. on Redhat AS-3 it is "hugetlb_pool".
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2410
    //      Note 2: it's possible there's enough physical memory available but
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2411
    //            they are so fragmented after a long run that they can't
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2412
    //            coalesce into large pages. Try to reserve large pages when
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2413
    //            the system is still "fresh".
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2414
    if (warn_on_failure) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2415
      warning("Failed to reserve shared memory (errno = %d).", errno);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2416
    }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2417
    return NULL;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2418
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2419
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2420
  // attach to the region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2421
  addr = (char*)shmat(shmid, req_addr, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2422
  int err = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2423
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2424
  // Remove shmid. If shmat() is successful, the actual shared memory segment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2425
  // will be deleted when it's detached by shmdt() or when the process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2426
  // terminates. If shmat() is not successful this will remove the shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2427
  // segment immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2428
  shmctl(shmid, IPC_RMID, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2429
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2430
  if ((intptr_t)addr == -1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2431
    if (warn_on_failure) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2432
      warning("Failed to attach shared memory (errno = %d).", err);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2433
    }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2434
    return NULL;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2435
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2436
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2437
  // The memory is committed
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2438
  MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC);
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2439
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2440
  return addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2441
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2442
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2443
bool os::release_memory_special(char* base, size_t bytes) {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2444
  if (MemTracker::tracking_level() > NMT_minimal) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2445
    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2446
    // detaching the SHM segment will also delete it, see reserve_memory_special()
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2447
    int rslt = shmdt(base);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2448
    if (rslt == 0) {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2449
      tkr.record((address)base, bytes);
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2450
      return true;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2451
    } else {
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2452
      return false;
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2453
    }
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2454
  } else {
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25503
diff changeset
  2455
    return shmdt(base) == 0;
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2456
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2457
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2458
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2459
size_t os::large_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2460
  return _large_page_size;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2461
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2462
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2463
// HugeTLBFS allows application to commit large page memory on demand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2464
// with SysV SHM the entire memory region must be allocated as shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2465
// memory.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2466
bool os::can_commit_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2467
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2468
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2469
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2470
bool os::can_execute_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2471
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2472
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2474
// Reserve memory at an arbitrary address, only if that area is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2475
// available (and not reserved for something else).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2476
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2477
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2478
  const int max_tries = 10;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2479
  char* base[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2480
  size_t size[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2481
  const size_t gap = 0x000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2482
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2483
  // Assert only that the size is a multiple of the page size, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2484
  // that's all that mmap requires, and since that's all we really know
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2485
  // about at this low abstraction level.  If we need higher alignment,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2486
  // we can either pass an alignment to this method or verify alignment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2487
  // in one of the methods further up the call chain.  See bug 5044738.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2488
  assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2489
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2490
  // Repeatedly allocate blocks until the block is allocated at the
31377
229b4eb67c2b 8078513: [linux] Clean up code relevant to LinuxThreads implementation
stuefe
parents: 31357
diff changeset
  2491
  // right spot.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2492
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2493
  // Bsd mmap allows caller to pass an address as hint; give it a try first,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2494
  // if kernel honors the hint then we can return immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2495
  char * addr = anon_mmap(requested_addr, bytes, false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2496
  if (addr == requested_addr) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2497
    return requested_addr;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2498
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2499
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2500
  if (addr != NULL) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2501
    // mmap() is successful but it fails to reserve at the requested address
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2502
    anon_munmap(addr, bytes);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2503
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2504
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2505
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2506
  for (i = 0; i < max_tries; ++i) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2507
    base[i] = reserve_memory(bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2508
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2509
    if (base[i] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2510
      // Is this the block we wanted?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2511
      if (base[i] == requested_addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2512
        size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2513
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2514
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2515
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2516
      // Does this overlap the block we wanted? Give back the overlapped
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2517
      // parts and try again.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2518
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2519
      size_t top_overlap = requested_addr + (bytes + gap) - base[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2520
      if (top_overlap >= 0 && top_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2521
        unmap_memory(base[i], top_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2522
        base[i] += top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2523
        size[i] = bytes - top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2524
      } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2525
        size_t bottom_overlap = base[i] + bytes - requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2526
        if (bottom_overlap >= 0 && bottom_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2527
          unmap_memory(requested_addr, bottom_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2528
          size[i] = bytes - bottom_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2529
        } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2530
          size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2531
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2532
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2533
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2534
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2536
  // Give back the unused reserved pieces.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2537
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2538
  for (int j = 0; j < i; ++j) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2539
    if (base[j] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2540
      unmap_memory(base[j], size[j]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2541
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2542
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2543
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2544
  if (i < max_tries) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2545
    return requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2546
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2547
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2548
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2549
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2550
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2551
size_t os::read(int fd, void *buf, unsigned int nBytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2552
  RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2553
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2554
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2555
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2556
  RESTARTABLE_RETURN_INT(::pread(fd, buf, nBytes, offset));
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2557
}
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2558
22533
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2559
void os::naked_short_sleep(jlong ms) {
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2560
  struct timespec req;
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2561
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2562
  assert(ms < 1000, "Un-interruptable sleep, short time use only");
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2563
  req.tv_sec = 0;
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2564
  if (ms > 0) {
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2565
    req.tv_nsec = (ms % 1000) * 1000000;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2566
  } else {
22533
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2567
    req.tv_nsec = 1;
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2568
  }
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2569
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2570
  nanosleep(&req, NULL);
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2571
76088853a2eb 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 22528
diff changeset
  2572
  return;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2573
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2574
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2575
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2576
void os::infinite_sleep() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2577
  while (true) {    // sleep forever ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2578
    ::sleep(100);   // ... 100 seconds at a time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2579
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2580
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2581
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2582
// Used to convert frequent JVM_Yield() to nops
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2583
bool os::dont_yield() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2584
  return DontYieldALot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2585
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2586
25477
7dad9f95fd31 8047714: Fix for JDK-6546236 made Solaris os::yield() a no-op
fparain
parents: 25472
diff changeset
  2587
void os::naked_yield() {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2588
  sched_yield();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2589
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2590
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2591
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2592
// thread priority support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2593
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2594
// Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2595
// only supports dynamic priority, static priority must be zero. For real-time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2596
// applications, Bsd supports SCHED_RR which allows static priority (1-99).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2597
// However, for large multi-threaded applications, SCHED_RR is not only slower
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2598
// than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2599
// of 5 runs - Sep 2005).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2600
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2601
// The following code actually changes the niceness of kernel-thread/LWP. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2602
// has an assumption that setpriority() only modifies one kernel-thread/LWP,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2603
// not the entire user process, and user level threads are 1:1 mapped to kernel
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2604
// threads. It has always been the case, but could change in the future. For
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2605
// this reason, the code should not be used as default (ThreadPriorityPolicy=0).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2606
// It is only used when ThreadPriorityPolicy=1 and requires root privilege.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2607
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2608
#if !defined(__APPLE__)
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2609
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2610
  19,              // 0 Entry should never be used
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2611
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2612
   0,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2613
   3,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2614
   6,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2615
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2616
  10,              // 4
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2617
  15,              // 5 NormPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2618
  18,              // 6
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2619
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2620
  21,              // 7
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2621
  25,              // 8
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2622
  28,              // 9 NearMaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2623
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2624
  31,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2625
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2626
  31               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2627
};
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2628
#else
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2629
// Using Mach high-level priority assignments
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2630
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2631
   0,              // 0 Entry should never be used (MINPRI_USER)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2632
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2633
  27,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2634
  28,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2635
  29,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2636
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2637
  30,              // 4
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2638
  31,              // 5 NormPriority (BASEPRI_DEFAULT)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2639
  32,              // 6
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2640
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2641
  33,              // 7
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2642
  34,              // 8
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2643
  35,              // 9 NearMaxPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2644
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2645
  36,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2646
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2647
  36               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2648
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2649
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2650
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2651
static int prio_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2652
  if (ThreadPriorityPolicy == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2653
    // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2654
    // if effective uid is not root. Perhaps, a more elegant way of doing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2655
    // this is to test CAP_SYS_NICE capability, but that will require libcap.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2656
    if (geteuid() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2657
      if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2658
        warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2659
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2660
      ThreadPriorityPolicy = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2661
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2662
  }
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2663
  if (UseCriticalJavaThreadPriority) {
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2664
    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2665
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2666
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2667
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2668
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2669
OSReturn os::set_native_priority(Thread* thread, int newpri) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  2670
  if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2671
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2672
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2673
  // OpenBSD pthread_setprio starves low priority threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2674
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2675
#elif defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2676
  int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2677
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2678
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2679
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2680
  pthread_t self = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2681
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2682
  if (pthread_getschedparam(self, &policy, &sp) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2683
    return OS_ERR;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2684
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2685
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2686
  sp.sched_priority = newpri;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2687
  if (pthread_setschedparam(self, policy, &sp) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2688
    return OS_ERR;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2689
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2690
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2691
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2692
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2693
  int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2694
  return (ret == 0) ? OS_OK : OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2695
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2696
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2697
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2698
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  2699
  if (!UseThreadPriorities || ThreadPriorityPolicy == 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2700
    *priority_ptr = java_to_os_priority[NormPriority];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2701
    return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2702
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2703
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2704
  errno = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2705
#if defined(__OpenBSD__) || defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2706
  *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2707
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2708
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2709
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2710
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2711
  pthread_getschedparam(pthread_self(), &policy, &sp);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2712
  *priority_ptr = sp.sched_priority;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2713
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2714
  *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2715
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2716
  return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2717
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2718
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2719
// Hint to the underlying OS that a task switch would not be good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2720
// Void return because it's a hint and can fail.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2721
void os::hint_no_preempt() {}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2722
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2723
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2724
// suspend/resume support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2725
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2726
//  the low-level signal-based suspend/resume support is a remnant from the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2727
//  old VM-suspension that used to be for java-suspension, safepoints etc,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2728
//  within hotspot. Now there is a single use-case for this:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2729
//    - calling get_thread_pc() on the VMThread by the flat-profiler task
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2730
//      that runs in the watcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2731
//  The remaining code is greatly simplified from the more general suspension
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2732
//  code that used to be used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2733
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2734
//  The protocol is quite simple:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2735
//  - suspend:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2736
//      - sends a signal to the target thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2737
//      - polls the suspend state of the osthread using a yield loop
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2738
//      - target thread signal handler (SR_handler) sets suspend state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2739
//        and blocks in sigsuspend until continued
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2740
//  - resume:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2741
//      - sets target osthread state to continue
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2742
//      - sends signal to end the sigsuspend loop in the SR_handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2743
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2744
//  Note that the SR_lock plays no role in this suspend/resume protocol.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2745
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2746
static void resume_clear_context(OSThread *osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2747
  osthread->set_ucontext(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2748
  osthread->set_siginfo(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2749
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2750
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2751
static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2752
  osthread->set_ucontext(context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2753
  osthread->set_siginfo(siginfo);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2754
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2755
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2756
// Handler function invoked when a thread's execution is suspended or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2757
// resumed. We have to be careful that only async-safe functions are
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2758
// called here (Note: most pthread functions are not async safe and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2759
// should be avoided.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2760
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2761
// Note: sigwait() is a more natural fit than sigsuspend() from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2762
// interface point of view, but sigwait() prevents the signal hander
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2763
// from being run. libpthread would get very confused by not having
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2764
// its signal handlers run and prevents sigwait()'s use with the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2765
// mutex granting granting signal.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2766
//
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2767
// Currently only ever called on the VMThread or JavaThread
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2768
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2769
static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2770
  // Save and restore errno to avoid confusing native code with EINTR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2771
  // after sigsuspend.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2772
  int old_errno = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2773
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2774
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2775
  OSThread* osthread = thread->osthread();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2776
  assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2777
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2778
  os::SuspendResume::State current = osthread->sr.state();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2779
  if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2780
    suspend_save_context(osthread, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2781
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2782
    // attempt to switch the state, we assume we had a SUSPEND_REQUEST
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2783
    os::SuspendResume::State state = osthread->sr.suspended();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2784
    if (state == os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2785
      sigset_t suspend_set;  // signals for sigsuspend()
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2786
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2787
      // get current set of blocked signals and unblock resume signal
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2788
      pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2789
      sigdelset(&suspend_set, SR_signum);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2790
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2791
      sr_semaphore.signal();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2792
      // wait here until we are resumed
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2793
      while (1) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2794
        sigsuspend(&suspend_set);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2795
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2796
        os::SuspendResume::State result = osthread->sr.running();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2797
        if (result == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2798
          sr_semaphore.signal();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2799
          break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2800
        } else if (result != os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2801
          ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2802
        }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2803
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2804
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2805
    } else if (state == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2806
      // request was cancelled, continue
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2807
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2808
      ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2809
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2810
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2811
    resume_clear_context(osthread);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2812
  } else if (current == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2813
    // request was cancelled, continue
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2814
  } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2815
    // ignore
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2816
  } else {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2817
    // ignore
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2818
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2819
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2820
  errno = old_errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2821
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2822
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2823
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2824
static int SR_initialize() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2825
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2826
  char *s;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2827
  // Get signal number to use for suspend/resume
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2828
  if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2829
    int sig = ::strtol(s, 0, 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2830
    if (sig > 0 || sig < NSIG) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2831
      SR_signum = sig;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2832
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2833
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2834
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2835
  assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  2836
         "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2838
  sigemptyset(&SR_sigset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2839
  sigaddset(&SR_sigset, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2840
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2841
  // Set up signal handler for suspend/resume
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2842
  act.sa_flags = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2843
  act.sa_handler = (void (*)(int)) SR_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2844
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2845
  // SR_signum is blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2846
  // 4528190 - We also need to block pthread restart signal (32 on all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2847
  // supported Bsd platforms). Note that BsdThreads need to block
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2848
  // this signal for all threads to work properly. So we don't have
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2849
  // to use hard-coded signal number when setting up the mask.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2850
  pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2851
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2852
  if (sigaction(SR_signum, &act, 0) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2853
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2854
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2855
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2856
  // Save signal flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2857
  os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2858
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2859
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2860
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2861
static int sr_notify(OSThread* osthread) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2862
  int status = pthread_kill(osthread->pthread_id(), SR_signum);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2863
  assert_status(status == 0, status, "pthread_kill");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2864
  return status;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2865
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2866
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2867
// "Randomly" selected value for how long we want to spin
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2868
// before bailing out on suspending a thread, also how often
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2869
// we send a signal to a thread we want to resume
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2870
static const int RANDOMLY_LARGE_INTEGER = 1000000;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2871
static const int RANDOMLY_LARGE_INTEGER2 = 100;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2872
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2873
// returns true on success and false on error - really an error is fatal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2874
// but this seems the normal response to library errors
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2875
static bool do_suspend(OSThread* osthread) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2876
  assert(osthread->sr.is_running(), "thread should be running");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2877
  assert(!sr_semaphore.trywait(), "semaphore has invalid state");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2878
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2879
  // mark as suspended and send signal
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2880
  if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2881
    // failed to switch, state wasn't running?
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2882
    ShouldNotReachHere();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2883
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2884
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2885
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2886
  if (sr_notify(osthread) != 0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2887
    ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2888
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2889
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2890
  // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2891
  while (true) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2892
    if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2893
      break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2894
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2895
      // timeout
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2896
      os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2897
      if (cancelled == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2898
        return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2899
      } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2900
        // make sure that we consume the signal on the semaphore as well
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2901
        sr_semaphore.wait();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2902
        break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2903
      } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2904
        ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2905
        return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2906
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2907
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2908
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2909
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2910
  guarantee(osthread->sr.is_suspended(), "Must be suspended");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2911
  return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2912
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2913
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2914
static void do_resume(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2915
  assert(osthread->sr.is_suspended(), "thread should be suspended");
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2916
  assert(!sr_semaphore.trywait(), "invalid semaphore state");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2917
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2918
  if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2919
    // failed to switch to WAKEUP_REQUEST
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2920
    ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2921
    return;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2922
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2923
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2924
  while (true) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2925
    if (sr_notify(osthread) == 0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2926
      if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2927
        if (osthread->sr.is_running()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2928
          return;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2929
        }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2930
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2931
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2932
      ShouldNotReachHere();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2933
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2934
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2935
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2936
  guarantee(osthread->sr.is_running(), "Must be running!");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2937
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2938
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2939
///////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2940
// signal handling (except suspend/resume)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2941
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2942
// This routine may be used by user applications as a "hook" to catch signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2943
// The user-defined signal handler must pass unrecognized signals to this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2944
// routine, and if it returns true (non-zero), then the signal handler must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2945
// return immediately.  If the flag "abort_if_unrecognized" is true, then this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2946
// routine will never retun false (zero), but instead will execute a VM panic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2947
// routine kill the process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2948
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2949
// If this routine returns false, it is OK to call it again.  This allows
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2950
// the user-defined signal handler to perform checks either before or after
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2951
// the VM performs its own checks.  Naturally, the user code would be making
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2952
// a serious error if it tried to handle an exception (such as a null check
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2953
// or breakpoint) that the VM was generating for its own correct operation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2954
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2955
// This routine may recognize any of the following kinds of signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2956
//    SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2957
// It should be consulted by handlers for any of those signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2958
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2959
// The caller of this routine must pass in the three arguments supplied
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2960
// to the function referred to in the "sa_sigaction" (not the "sa_handler")
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2961
// field of the structure passed to sigaction().  This routine assumes that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2962
// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2963
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2964
// Note that the VM will print warnings if it detects conflicting signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2965
// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2966
//
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2967
extern "C" JNIEXPORT int JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2968
                                               void* ucontext,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  2969
                                               int abort_if_unrecognized);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2970
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2971
void signalHandler(int sig, siginfo_t* info, void* uc) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2972
  assert(info != NULL && uc != NULL, "it must be old kernel");
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  2973
  int orig_errno = errno;  // Preserve errno value over signal handler.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2974
  JVM_handle_bsd_signal(sig, info, uc, true);
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  2975
  errno = orig_errno;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2976
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2977
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2978
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2979
// This boolean allows users to forward their own non-matching signals
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2980
// to JVM_handle_bsd_signal, harmlessly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2981
bool os::Bsd::signal_handlers_are_installed = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2982
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2983
// For signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2984
struct sigaction os::Bsd::sigact[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2985
unsigned int os::Bsd::sigs = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2986
bool os::Bsd::libjsig_is_loaded = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2987
typedef struct sigaction *(*get_signal_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2988
get_signal_t os::Bsd::get_signal_action = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2989
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2990
struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2991
  struct sigaction *actp = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2992
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2993
  if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2994
    // Retrieve the old signal handler from libjsig
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2995
    actp = (*get_signal_action)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2996
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2997
  if (actp == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2998
    // Retrieve the preinstalled signal handler from jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2999
    actp = get_preinstalled_handler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3000
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3001
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3002
  return actp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3003
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3004
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3005
static bool call_chained_handler(struct sigaction *actp, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3006
                                 siginfo_t *siginfo, void *context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3007
  // Call the old signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3008
  if (actp->sa_handler == SIG_DFL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3009
    // It's more reasonable to let jvm treat it as an unexpected exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3010
    // instead of taking the default action.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3011
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3012
  } else if (actp->sa_handler != SIG_IGN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3013
    if ((actp->sa_flags & SA_NODEFER) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3014
      // automaticlly block the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3015
      sigaddset(&(actp->sa_mask), sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3016
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3017
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3018
    sa_handler_t hand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3019
    sa_sigaction_t sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3020
    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3021
    // retrieve the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3022
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3023
      sa = actp->sa_sigaction;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3024
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3025
      hand = actp->sa_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3026
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3027
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3028
    if ((actp->sa_flags & SA_RESETHAND) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3029
      actp->sa_handler = SIG_DFL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3030
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3031
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3032
    // try to honor the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3033
    sigset_t oset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3034
    pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3035
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3036
    // call into the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3037
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3038
      (*sa)(sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3039
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3040
      (*hand)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3041
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3042
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3043
    // restore the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3044
    pthread_sigmask(SIG_SETMASK, &oset, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3045
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3046
  // Tell jvm's signal handler the signal is taken care of.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3047
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3048
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3049
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3050
bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3051
  bool chained = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3052
  // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3053
  if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3054
    struct sigaction *actp = get_chained_signal_action(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3055
    if (actp != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3056
      chained = call_chained_handler(actp, sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3057
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3058
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3059
  return chained;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3060
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3061
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3062
struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3063
  if ((((unsigned int)1 << sig) & sigs) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3064
    return &sigact[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3065
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3066
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3067
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3068
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3069
void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3070
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3071
  sigact[sig] = oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3072
  sigs |= (unsigned int)1 << sig;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3073
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3074
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3075
// for diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3076
int os::Bsd::sigflags[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3077
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3078
int os::Bsd::get_our_sigflags(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3079
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3080
  return sigflags[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3081
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3082
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3083
void os::Bsd::set_our_sigflags(int sig, int flags) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3084
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3085
  sigflags[sig] = flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3086
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3087
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3088
void os::Bsd::set_signal_handler(int sig, bool set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3089
  // Check for overwrite.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3090
  struct sigaction oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3091
  sigaction(sig, (struct sigaction*)NULL, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3092
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3093
  void* oldhand = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3094
                ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3095
                : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3096
  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3097
      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3098
      oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3099
    if (AllowUserSignalHandlers || !set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3100
      // Do not overwrite; user takes responsibility to forward to us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3101
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3102
    } else if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3103
      // save the old handler in jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3104
      save_preinstalled_handler(sig, oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3105
      // libjsig also interposes the sigaction() call below and saves the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3106
      // old sigaction on it own.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3107
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3108
      fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3109
                    "%#lx for signal %d.", (long)oldhand, sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3110
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3111
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3112
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3113
  struct sigaction sigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3114
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3115
  sigAct.sa_handler = SIG_DFL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3116
  if (!set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3117
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3118
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3119
    sigAct.sa_sigaction = signalHandler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3120
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3121
  }
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23444
diff changeset
  3122
#ifdef __APPLE__
17868
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3123
  // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3124
  // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages"
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3125
  // if the signal handler declares it will handle it on alternate stack.
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3126
  // Notice we only declare we will handle it on alt stack, but we are not
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3127
  // actually going to use real alt stack - this is just a workaround.
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3128
  // Please see ux_exception.c, method catch_mach_exception_raise for details
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3129
  // link http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/bsd/uxkern/ux_exception.c
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3130
  if (sig == SIGSEGV) {
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3131
    sigAct.sa_flags |= SA_ONSTACK;
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3132
  }
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3133
#endif
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3134
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3135
  // Save flags, which are set by ours
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3136
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3137
  sigflags[sig] = sigAct.sa_flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3138
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3139
  int ret = sigaction(sig, &sigAct, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3140
  assert(ret == 0, "check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3141
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3142
  void* oldhand2  = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3143
                  ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3144
                  : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3145
  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3146
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3147
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3148
// install signal handlers for signals that HotSpot needs to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3149
// handle in order to support Java-level exception handling.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3150
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3151
void os::Bsd::install_signal_handlers() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3152
  if (!signal_handlers_are_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3153
    signal_handlers_are_installed = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3154
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3155
    // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3156
    typedef void (*signal_setting_t)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3157
    signal_setting_t begin_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3158
    signal_setting_t end_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3159
    begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3160
                                          dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3161
    if (begin_signal_setting != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3162
      end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3163
                                          dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3164
      get_signal_action = CAST_TO_FN_PTR(get_signal_t,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3165
                                         dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3166
      libjsig_is_loaded = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3167
      assert(UseSignalChaining, "should enable signal-chaining");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3168
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3169
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3170
      // Tell libjsig jvm is setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3171
      (*begin_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3172
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3173
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3174
    set_signal_handler(SIGSEGV, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3175
    set_signal_handler(SIGPIPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3176
    set_signal_handler(SIGBUS, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3177
    set_signal_handler(SIGILL, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3178
    set_signal_handler(SIGFPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3179
    set_signal_handler(SIGXFSZ, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3180
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3181
#if defined(__APPLE__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3182
    // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3183
    // signals caught and handled by the JVM. To work around this, we reset the mach task
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3184
    // signal handler that's placed on our process by CrashReporter. This disables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3185
    // CrashReporter-based reporting.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3186
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3187
    // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3188
    // on caught fatal signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3189
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3190
    // Additionally, gdb installs both standard BSD signal handlers, and mach exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3191
    // handlers. By replacing the existing task exception handler, we disable gdb's mach
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3192
    // exception handling, while leaving the standard BSD signal handlers functional.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3193
    kern_return_t kr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3194
    kr = task_set_exception_ports(mach_task_self(),
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3195
                                  EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3196
                                  MACH_PORT_NULL,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3197
                                  EXCEPTION_STATE_IDENTITY,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3198
                                  MACHINE_THREAD_STATE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3199
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3200
    assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3201
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3202
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3203
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3204
      // Tell libjsig jvm finishes setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3205
      (*end_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3206
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3207
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3208
    // We don't activate signal checker if libjsig is in place, we trust ourselves
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3209
    // and if UserSignalHandler is installed all bets are off
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3210
    if (CheckJNICalls) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3211
      if (libjsig_is_loaded) {
19532
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3212
        if (PrintJNIResolving) {
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3213
          tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3214
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3215
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3216
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3217
      if (AllowUserSignalHandlers) {
19532
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3218
        if (PrintJNIResolving) {
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3219
          tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3220
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3221
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3222
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3223
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3224
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3225
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3226
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3227
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3228
/////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3229
// glibc on Bsd platform uses non-documented flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3230
// to indicate, that some special sort of signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3231
// trampoline is used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3232
// We will never set this flag, and we should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3233
// ignore this flag in our diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3234
#ifdef SIGNIFICANT_SIGNAL_MASK
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3235
  #undef SIGNIFICANT_SIGNAL_MASK
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3236
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3237
#define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3238
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3239
static const char* get_signal_handler_name(address handler,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3240
                                           char* buf, int buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3241
  int offset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3242
  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3243
  if (found) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3244
    // skip directory names
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3245
    const char *p1, *p2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3246
    p1 = buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3247
    size_t len = strlen(os::file_separator());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3248
    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3249
    jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3250
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3251
    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3252
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3253
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3254
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3255
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3256
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3257
                                 char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3258
  struct sigaction sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3259
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3260
  sigaction(sig, NULL, &sa);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3261
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3262
  // See comment for SIGNIFICANT_SIGNAL_MASK define
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3263
  sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3264
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3265
  st->print("%s: ", os::exception_name(sig, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3266
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3267
  address handler = (sa.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3268
    ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3269
    : CAST_FROM_FN_PTR(address, sa.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3270
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3271
  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3272
    st->print("SIG_DFL");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3273
  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3274
    st->print("SIG_IGN");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3275
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3276
    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3277
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3278
22826
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  3279
  st->print(", sa_mask[0]=");
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  3280
  os::Posix::print_signal_set_short(st, &sa.sa_mask);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3281
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3282
  address rh = VMError::get_resetted_sighandler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3283
  // May be, handler was resetted by VMError?
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3284
  if (rh != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3285
    handler = rh;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3286
    sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3287
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3288
22826
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  3289
  st->print(", sa_flags=");
3ee6886e718d 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 22821
diff changeset
  3290
  os::Posix::print_sa_flags(st, sa.sa_flags);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3291
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3292
  // Check: is it our handler?
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3293
  if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3294
      handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3295
    // It is our signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3296
    // check for flags, reset system-used one!
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3297
    if ((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3298
      st->print(
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3299
                ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3300
                os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3301
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3302
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3303
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3304
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3305
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3306
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3307
#define DO_SIGNAL_CHECK(sig)                      \
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3308
  do {                                            \
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3309
    if (!sigismember(&check_signal_done, sig)) {  \
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3310
      os::Bsd::check_signal_handler(sig);         \
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3311
    }                                             \
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3312
  } while (0)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3313
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3314
// This method is a periodic task to check for misbehaving JNI applications
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3315
// under CheckJNI, we can add any periodic checks here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3316
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3317
void os::run_periodic_checks() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3318
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3319
  if (check_signals == false) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3320
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3321
  // SEGV and BUS if overridden could potentially prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3322
  // generation of hs*.log in the event of a crash, debugging
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3323
  // such a case can be very challenging, so we absolutely
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3324
  // check the following for a good measure:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3325
  DO_SIGNAL_CHECK(SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3326
  DO_SIGNAL_CHECK(SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3327
  DO_SIGNAL_CHECK(SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3328
  DO_SIGNAL_CHECK(SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3329
  DO_SIGNAL_CHECK(SIGPIPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3330
  DO_SIGNAL_CHECK(SIGXFSZ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3331
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3332
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3333
  // ReduceSignalUsage allows the user to override these handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3334
  // see comments at the very top and jvm_solaris.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3335
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3336
    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3337
    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3338
    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3339
    DO_SIGNAL_CHECK(BREAK_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3340
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3341
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3342
  DO_SIGNAL_CHECK(SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3343
  DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3344
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3345
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3346
typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3347
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3348
static os_sigaction_t os_sigaction = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3349
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3350
void os::Bsd::check_signal_handler(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3351
  char buf[O_BUFLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3352
  address jvmHandler = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3353
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3354
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3355
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3356
  if (os_sigaction == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3357
    // only trust the default sigaction, in case it has been interposed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3358
    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3359
    if (os_sigaction == NULL) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3360
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3361
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3362
  os_sigaction(sig, (struct sigaction*)NULL, &act);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3363
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3364
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3365
  act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3366
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3367
  address thisHandler = (act.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3368
    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3369
    : CAST_FROM_FN_PTR(address, act.sa_handler);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3370
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3371
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3372
  switch (sig) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3373
  case SIGSEGV:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3374
  case SIGBUS:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3375
  case SIGFPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3376
  case SIGPIPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3377
  case SIGILL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3378
  case SIGXFSZ:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3379
    jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3380
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3381
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3382
  case SHUTDOWN1_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3383
  case SHUTDOWN2_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3384
  case SHUTDOWN3_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3385
  case BREAK_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3386
    jvmHandler = (address)user_handler();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3387
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3388
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3389
  case INTERRUPT_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3390
    jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3391
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3392
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3393
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3394
    if (sig == SR_signum) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3395
      jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3396
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3397
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3398
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3399
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3400
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3401
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3402
  if (thisHandler != jvmHandler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3403
    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3404
    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3405
    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3406
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3407
    sigaddset(&check_signal_done, sig);
23444
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22894
diff changeset
  3408
    // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22894
diff changeset
  3409
    if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22894
diff changeset
  3410
      tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22894
diff changeset
  3411
                    exception_name(sig, buf, O_BUFLEN));
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22894
diff changeset
  3412
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3413
  } else if(os::Bsd::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Bsd::get_our_sigflags(sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3414
    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3415
    tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3416
    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3417
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3418
    sigaddset(&check_signal_done, sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3419
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3420
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3421
  // Dump all the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3422
  if (sigismember(&check_signal_done, sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3423
    print_signal_handlers(tty, buf, O_BUFLEN);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3424
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3425
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3426
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3427
extern void report_error(char* file_name, int line_no, char* title,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3428
                         char* format, ...);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3429
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3430
extern bool signal_name(int signo, char* buf, size_t len);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3431
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3432
const char* os::exception_name(int exception_code, char* buf, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3433
  if (0 < exception_code && exception_code <= SIGRTMAX) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3434
    // signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3435
    if (!signal_name(exception_code, buf, size)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3436
      jio_snprintf(buf, size, "SIG%d", exception_code);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3437
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3438
    return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3439
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3440
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3441
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3442
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3443
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3444
// this is called _before_ the most of global arguments have been parsed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3445
void os::init(void) {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3446
  char dummy;   // used to get a guess on initial stack address
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3447
//  first_hrtime = gethrtime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3448
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3449
  // With BsdThreads the JavaMain thread pid (primordial thread)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3450
  // is different than the pid of the java launcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3451
  // So, on Bsd, the launcher thread pid is passed to the VM
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3452
  // via the sun.java.launcher.pid property.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3453
  // Use this property instead of getpid() if it was correctly passed.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3454
  // See bug 6351349.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3455
  pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3456
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3457
  _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3458
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3459
  clock_tics_per_sec = CLK_TCK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3460
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3461
  init_random(1234567);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3462
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3463
  ThreadCritical::initialize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3464
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3465
  Bsd::set_page_size(getpagesize());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3466
  if (Bsd::page_size() == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3467
    fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3468
                  strerror(errno)));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3469
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3470
  init_page_sizes((size_t) Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3471
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3472
  Bsd::initialize_system_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3474
  // main_thread points to the aboriginal thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3475
  Bsd::_main_thread = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3476
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3477
  Bsd::clock_init();
21185
9d53434b1ef5 8027294: Prepare hotspot for non TOD based uptime counter
jbachorik
parents: 20683
diff changeset
  3478
  initial_time_count = javaTimeNanos();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3479
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3480
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3481
  // XXXDARWIN
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3482
  // Work around the unaligned VM callbacks in hotspot's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3483
  // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3484
  // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3485
  // alignment when doing symbol lookup. To work around this, we force early
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3486
  // binding of all symbols now, thus binding when alignment is known-good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3487
  _dyld_bind_fully_image_containing_address((const void *) &os::init);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3488
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3489
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3490
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3491
// To install functions for atexit system call
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3492
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3493
  static void perfMemory_exit_helper() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3494
    perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3495
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3496
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3497
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3498
// this is called _after_ the global arguments have been parsed
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3499
jint os::init_2(void) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3500
  // Allocate a single page and mark it as readable for safepoint polling
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3501
  address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3502
  guarantee(polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page");
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3503
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3504
  os::set_polling_page(polling_page);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3505
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3506
#ifndef PRODUCT
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3507
  if (Verbose && PrintMiscellaneous) {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3508
    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n",
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3509
               (intptr_t)polling_page);
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3510
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3511
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3513
  if (!UseMembar) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3514
    address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3515
    guarantee(mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3516
    os::set_memory_serialize_page(mem_serialize_page);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3517
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3518
#ifndef PRODUCT
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3519
    if (Verbose && PrintMiscellaneous) {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3520
      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n",
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3521
                 (intptr_t)mem_serialize_page);
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3522
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3523
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3524
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3526
  // initialize suspend/resume support - must do this before signal_sets_init()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3527
  if (SR_initialize() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3528
    perror("SR_initialize failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3529
    return JNI_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3530
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3531
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3532
  Bsd::signal_sets_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3533
  Bsd::install_signal_handlers();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3534
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3535
  // Check minimum allowable stack size for thread creation and to initialize
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3536
  // the java system classes, including StackOverflowError - depends on page
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3537
  // size.  Add a page for compiler2 recursion in main thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3538
  // Add in 2*BytesPerWord times page size to account for VM stack during
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3539
  // class initialization depending on 32 or 64 bit VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3540
  os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3541
                                    (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3542
                                    2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3543
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3544
  size_t threadStackSizeInBytes = ThreadStackSize * K;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3545
  if (threadStackSizeInBytes != 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3546
      threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3547
    tty->print_cr("\nThe stack size specified is too small, "
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3548
                  "Specify at least %dk",
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3549
                  os::Bsd::min_stack_allowed/ K);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3550
    return JNI_ERR;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3551
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3552
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3553
  // Make the stack size a multiple of the page size so that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3554
  // the yellow/red zones can be guarded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3555
  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3556
                                                vm_page_size()));
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3557
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3558
  if (MaxFDLimit) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3559
    // set the number of file descriptors to max. print out error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3560
    // if getrlimit/setrlimit fails but continue regardless.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3561
    struct rlimit nbr_files;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3562
    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3563
    if (status != 0) {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3564
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3565
        perror("os::init_2 getrlimit failed");
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3566
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3567
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3568
      nbr_files.rlim_cur = nbr_files.rlim_max;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3569
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3570
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3571
      // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3572
      // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3573
      // be used instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3574
      nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3575
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3576
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3577
      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3578
      if (status != 0) {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3579
        if (PrintMiscellaneous && (Verbose || WizardMode)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3580
          perror("os::init_2 setrlimit failed");
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3581
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3582
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3583
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3584
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3585
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3586
  // at-exit methods are called in the reverse order of their registration.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3587
  // atexit functions are called on return from main or as a result of a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3588
  // call to exit(3C). There can be only 32 of these functions registered
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3589
  // and atexit() does not set errno.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3590
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3591
  if (PerfAllowAtExitRegistration) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3592
    // only register atexit functions if PerfAllowAtExitRegistration is set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3593
    // atexit functions can be delayed until process exit time, which
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3594
    // can be problematic for embedded VM situations. Embedded VMs should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3595
    // call DestroyJavaVM() to assure that VM resources are released.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3596
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3597
    // note: perfMemory_exit_helper atexit function may be removed in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3598
    // the future if the appropriate cleanup code can be added to the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3599
    // VM_Exit VMOperation's doit method.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3600
    if (atexit(perfMemory_exit_helper) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3601
      warning("os::init2 atexit(perfMemory_exit_helper) failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3602
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3603
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3604
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3605
  // initialize thread priority policy
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3606
  prio_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3607
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3608
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3609
  // dynamically link to objective c gc registration
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3610
  void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3611
  if (handleLibObjc != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3612
    objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3613
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3614
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3615
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3616
  return JNI_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3617
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3618
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3619
// Mark the polling page as unreadable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3620
void os::make_polling_page_unreadable(void) {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3621
  if (!guard_memory((char*)_polling_page, Bsd::page_size())) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3622
    fatal("Could not disable polling page");
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3623
  }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3624
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3625
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3626
// Mark the polling page as readable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3627
void os::make_polling_page_readable(void) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  3628
  if (!bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3629
    fatal("Could not enable polling page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3630
  }
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3631
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3632
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3633
int os::active_processor_count() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3634
  return _processor_count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3635
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3636
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3637
void os::set_native_thread_name(const char *name) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3638
#if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3639
  // This is only supported in Snow Leopard and beyond
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3640
  if (name != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3641
    // Add a "Java: " prefix to the name
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3642
    char buf[MAXTHREADNAMESIZE];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3643
    snprintf(buf, sizeof(buf), "Java: %s", name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3644
    pthread_setname_np(buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3645
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3646
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3647
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3648
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3649
bool os::distribute_processes(uint length, uint* distribution) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3650
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3651
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3652
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3653
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3654
bool os::bind_to_processor(uint processor_id) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3655
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3656
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3657
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3658
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3659
void os::SuspendedThreadTask::internal_do_task() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3660
  if (do_suspend(_thread->osthread())) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3661
    SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3662
    do_task(context);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3663
    do_resume(_thread->osthread());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3664
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3665
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3666
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3667
///
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3668
class PcFetcher : public os::SuspendedThreadTask {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3669
 public:
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3670
  PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3671
  ExtendedPC result();
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3672
 protected:
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3673
  void do_task(const os::SuspendedThreadTaskContext& context);
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3674
 private:
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3675
  ExtendedPC _epc;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3676
};
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3677
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3678
ExtendedPC PcFetcher::result() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3679
  guarantee(is_done(), "task is not done yet.");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3680
  return _epc;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3681
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3682
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3683
void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3684
  Thread* thread = context.thread();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3685
  OSThread* osthread = thread->osthread();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3686
  if (osthread->ucontext() != NULL) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3687
    _epc = os::Bsd::ucontext_get_pc((ucontext_t *) context.ucontext());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3688
  } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3689
    // NULL context is unexpected, double-check this is the VMThread
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3690
    guarantee(thread->is_VM_thread(), "can only be called for VMThread");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3691
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3692
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3693
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3694
// Suspends the target using the signal mechanism and then grabs the PC before
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3695
// resuming the target. Used by the flat-profiler only
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3696
ExtendedPC os::get_thread_pc(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3697
  // Make sure that it is called by the watcher for the VMThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3698
  assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3699
  assert(thread->is_VM_thread(), "Can only be called for VMThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3700
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3701
  PcFetcher fetcher(thread);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3702
  fetcher.run();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3703
  return fetcher.result();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3704
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3705
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3706
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3707
// debug support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3708
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3709
bool os::find(address addr, outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3710
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3711
  memset(&dlinfo, 0, sizeof(dlinfo));
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3712
  if (dladdr(addr, &dlinfo) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3713
    st->print(PTR_FORMAT ": ", addr);
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3714
    if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3715
      st->print("%s+%#x", dlinfo.dli_sname,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3716
                addr - (intptr_t)dlinfo.dli_saddr);
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3717
    } else if (dlinfo.dli_fbase != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3718
      st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3719
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3720
      st->print("<absolute address>");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3721
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3722
    if (dlinfo.dli_fname != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3723
      st->print(" in %s", dlinfo.dli_fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3724
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3725
    if (dlinfo.dli_fbase != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3726
      st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3727
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3728
    st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3729
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3730
    if (Verbose) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3731
      // decode some bytes around the PC
16670
4af09aff4237 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 16669
diff changeset
  3732
      address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
4af09aff4237 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 16669
diff changeset
  3733
      address end   = clamp_address_in_page(addr+40, addr, os::vm_page_size());
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3734
      address       lowest = (address) dlinfo.dli_sname;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3735
      if (!lowest)  lowest = (address) dlinfo.dli_fbase;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3736
      if (begin < lowest)  begin = lowest;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3737
      Dl_info dlinfo2;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3738
      if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3739
          && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3740
        end = (address) dlinfo2.dli_saddr;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3741
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3742
      Disassembler::decode(begin, end, st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3743
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3744
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3745
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3746
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3747
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3748
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3749
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3750
// misc
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3751
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3752
// This does not do anything on Bsd. This is basically a hook for being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3753
// able to use structured exception handling (thread-local exception filters)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3754
// on, e.g., Win32.
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3755
void os::os_exception_wrapper(java_call_t f, JavaValue* value,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3756
                              methodHandle* method, JavaCallArguments* args,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3757
                              Thread* thread) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3758
  f(value, method, args, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3759
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3760
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3761
void os::print_statistics() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3762
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3763
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3764
int os::message_box(const char* title, const char* message) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3765
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3766
  fdStream err(defaultStream::error_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3767
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3768
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3769
  err.print_raw_cr(title);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3770
  for (i = 0; i < 78; i++) err.print_raw("-");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3771
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3772
  err.print_raw_cr(message);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3773
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3774
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3775
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3776
  char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3777
  // Prevent process from exiting upon "read error" without consuming all CPU
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3778
  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3779
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3780
  return buf[0] == 'y' || buf[0] == 'Y';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3781
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3782
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3783
int os::stat(const char *path, struct stat *sbuf) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3784
  char pathbuf[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3785
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3786
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3787
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3788
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3789
  os::native_path(strcpy(pathbuf, path));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3790
  return ::stat(pathbuf, sbuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3791
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3792
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3793
bool os::check_heap(bool force) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3794
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3795
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3796
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3797
// Is a (classpath) directory empty?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3798
bool os::dir_is_empty(const char* path) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3799
  DIR *dir = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3800
  struct dirent *ptr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3801
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3802
  dir = opendir(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3803
  if (dir == NULL) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3804
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3805
  // Scan the directory
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3806
  bool result = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3807
  char buf[sizeof(struct dirent) + MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3808
  while (result && (ptr = ::readdir(dir)) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3809
    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3810
      result = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3811
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3812
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3813
  closedir(dir);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3814
  return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3815
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3816
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3817
// This code originates from JDK's sysOpen and open64_w
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3818
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3819
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3820
int os::open(const char *path, int oflag, int mode) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3821
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3822
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3823
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3824
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3825
  int fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3826
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3827
  fd = ::open(path, oflag, mode);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3828
  if (fd == -1) return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3829
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3830
  // If the open succeeded, the file might still be a directory
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3831
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3832
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3833
    int ret = ::fstat(fd, &buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3834
    int st_mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3835
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3836
    if (ret != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3837
      if ((st_mode & S_IFMT) == S_IFDIR) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3838
        errno = EISDIR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3839
        ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3840
        return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3841
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3842
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3843
      ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3844
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3845
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3846
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3847
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3848
  // All file descriptors that are opened in the JVM and not
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3849
  // specifically destined for a subprocess should have the
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3850
  // close-on-exec flag set.  If we don't set it, then careless 3rd
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3851
  // party native code might fork and exec without closing all
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3852
  // appropriate file descriptors (e.g. as we do in closeDescriptors in
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3853
  // UNIXProcess.c), and this in turn might:
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3854
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3855
  // - cause end-of-file to fail to be detected on some file
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3856
  //   descriptors, resulting in mysterious hangs, or
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3857
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3858
  // - might cause an fopen in the subprocess to fail on a system
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3859
  //   suffering from bug 1085341.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3860
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3861
  // (Yes, the default setting of the close-on-exec flag is a Unix
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3862
  // design flaw)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3863
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3864
  // See:
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3865
  // 1085341: 32-bit stdio routines should support file descriptors >255
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3866
  // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3867
  // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3868
  //
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3869
#ifdef FD_CLOEXEC
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3870
  {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3871
    int flags = ::fcntl(fd, F_GETFD);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3872
    if (flags != -1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3873
      ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3874
    }
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3875
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3876
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3877
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3878
  return fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3879
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3880
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3881
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3882
// create binary file, rewriting existing file if required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3883
int os::create_binary_file(const char* path, bool rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3884
  int oflags = O_WRONLY | O_CREAT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3885
  if (!rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3886
    oflags |= O_EXCL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3887
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3888
  return ::open(path, oflags, S_IREAD | S_IWRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3889
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3890
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3891
// return current position of file pointer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3892
jlong os::current_file_offset(int fd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3893
  return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3894
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3895
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3896
// move file pointer to the specified offset
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3897
jlong os::seek_to_file_offset(int fd, jlong offset) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3898
  return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3899
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3900
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3901
// This code originates from JDK's sysAvailable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3902
// from src/solaris/hpi/src/native_threads/src/sys_api_td.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3903
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3904
int os::available(int fd, jlong *bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3905
  jlong cur, end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3906
  int mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3907
  struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3908
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3909
  if (::fstat(fd, &buf) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3910
    mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3911
    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3912
      // XXX: is the following call interruptible? If so, this might
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3913
      // need to go through the INTERRUPT_IO() wrapper as for other
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  3914
      // blocking, interruptible calls in this file.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3915
      int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3916
      if (::ioctl(fd, FIONREAD, &n) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3917
        *bytes = n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3918
        return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3919
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3920
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3921
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3922
  if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3923
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3924
  } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3925
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3926
  } else if (::lseek(fd, cur, SEEK_SET) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3927
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3928
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3929
  *bytes = end - cur;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3930
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3931
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3932
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3933
// Map a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3934
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3935
                        char *addr, size_t bytes, bool read_only,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3936
                        bool allow_exec) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3937
  int prot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3938
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3939
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3940
  if (read_only) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3941
    prot = PROT_READ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3942
    flags = MAP_SHARED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3943
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3944
    prot = PROT_READ | PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3945
    flags = MAP_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3946
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3947
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3948
  if (allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3949
    prot |= PROT_EXEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3950
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3951
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3952
  if (addr != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3953
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3954
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3955
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3956
  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3957
                                     fd, file_offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3958
  if (mapped_address == MAP_FAILED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3959
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3960
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3961
  return mapped_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3962
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3963
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3964
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3965
// Remap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3966
char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3967
                          char *addr, size_t bytes, bool read_only,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  3968
                          bool allow_exec) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3969
  // same as map_memory() on this OS
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3970
  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3971
                        allow_exec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3972
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3973
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3974
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3975
// Unmap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3976
bool os::pd_unmap_memory(char* addr, size_t bytes) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3977
  return munmap(addr, bytes) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3978
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3979
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3980
// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3981
// are used by JVM M&M and JVMTI to get user+sys or user CPU time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3982
// of a thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3983
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3984
// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3985
// the fast estimate available on the platform.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3986
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3987
jlong os::current_thread_cpu_time() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3988
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3989
  return os::thread_cpu_time(Thread::current(), true /* user + sys */);
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3990
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3991
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3992
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3993
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3994
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3995
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3996
jlong os::thread_cpu_time(Thread* thread) {
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3997
#ifdef __APPLE__
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3998
  return os::thread_cpu_time(thread, true /* user + sys */);
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3999
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4000
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4001
  return 0;
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4002
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4003
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4004
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4005
jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4006
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4007
  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4008
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4009
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4010
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4011
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4012
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4013
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4014
jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4015
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4016
  struct thread_basic_info tinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4017
  mach_msg_type_number_t tcount = THREAD_INFO_MAX;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4018
  kern_return_t kr;
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  4019
  thread_t mach_thread;
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  4020
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  4021
  mach_thread = thread->osthread()->thread_id();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4022
  kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4023
  if (kr != KERN_SUCCESS) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4024
    return -1;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4025
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4026
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4027
  if (user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4028
    jlong nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4029
    nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4030
    nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4031
    return nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4032
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4033
    return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4034
  }
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4035
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4036
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4037
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4038
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4039
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4040
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4041
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4042
void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4043
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4044
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4045
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4046
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4047
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4048
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4049
void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4050
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4051
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4052
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4053
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4054
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4055
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4056
bool os::is_thread_cpu_time_supported() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4057
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4058
  return true;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  4059
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4060
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4061
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4062
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4063
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4064
// System loadavg support.  Returns -1 if load average cannot be obtained.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4065
// Bsd doesn't yet have a (official) notion of processor sets,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4066
// so just return the system wide load average.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4067
int os::loadavg(double loadavg[], int nelem) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4068
  return ::getloadavg(loadavg, nelem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4069
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4070
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4071
void os::pause() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4072
  char filename[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4073
  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4074
    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4075
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4076
    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4077
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4078
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4079
  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4080
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4081
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4082
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4083
    while (::stat(filename, &buf) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4084
      (void)::poll(NULL, 0, 100);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4085
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4086
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4087
    jio_fprintf(stderr,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4088
                "Could not open pause file '%s', continuing immediately.\n", filename);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4089
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4090
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4091
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4092
27458
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4093
// Refer to the comments in os_solaris.cpp park-unpark. The next two
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4094
// comment paragraphs are worth repeating here:
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4095
//
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4096
// Assumption:
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4097
//    Only one parker can exist on an event, which is why we allocate
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4098
//    them per-thread. Multiple unparkers can coexist.
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4099
//
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4100
// _Event serves as a restricted-range semaphore.
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4101
//   -1 : thread is blocked, i.e. there is a waiter
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4102
//    0 : neutral: thread is running or ready,
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4103
//        could have been signaled after a wait started
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4104
//    1 : signaled - thread is running or ready
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4105
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4106
// Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4107
// hang indefinitely.  For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4108
// For specifics regarding the bug see GLIBC BUGID 261237 :
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4109
//    http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4110
// Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4111
// will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4112
// is used.  (The simple C test-case provided in the GLIBC bug report manifests the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4113
// hang).  The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4114
// and monitorenter when we're using 1-0 locking.  All those operations may result in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4115
// calls to pthread_cond_timedwait().  Using LD_ASSUME_KERNEL to use an older version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4116
// of libpthread avoids the problem, but isn't practical.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4117
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4118
// Possible remedies:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4119
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4120
// 1.   Establish a minimum relative wait time.  50 to 100 msecs seems to work.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4121
//      This is palliative and probabilistic, however.  If the thread is preempted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4122
//      between the call to compute_abstime() and pthread_cond_timedwait(), more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4123
//      than the minimum period may have passed, and the abstime may be stale (in the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4124
//      past) resultin in a hang.   Using this technique reduces the odds of a hang
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4125
//      but the JVM is still vulnerable, particularly on heavily loaded systems.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4126
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4127
// 2.   Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4128
//      of the usual flag-condvar-mutex idiom.  The write side of the pipe is set
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4129
//      NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4130
//      reduces to poll()+read().  This works well, but consumes 2 FDs per extant
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4131
//      thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4132
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4133
// 3.   Embargo pthread_cond_timedwait() and implement a native "chron" thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4134
//      that manages timeouts.  We'd emulate pthread_cond_timedwait() by enqueuing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4135
//      a timeout request to the chron thread and then blocking via pthread_cond_wait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4136
//      This also works well.  In fact it avoids kernel-level scalability impediments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4137
//      on certain platforms that don't handle lots of active pthread_cond_timedwait()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4138
//      timers in a graceful fashion.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4139
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4140
// 4.   When the abstime value is in the past it appears that control returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4141
//      correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4142
//      Subsequent timedwait/wait calls may hang indefinitely.  Given that, we
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4143
//      can avoid the problem by reinitializing the condvar -- by cond_destroy()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4144
//      followed by cond_init() -- after all calls to pthread_cond_timedwait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4145
//      It may be possible to avoid reinitialization by checking the return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4146
//      value from pthread_cond_timedwait().  In addition to reinitializing the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4147
//      condvar we must establish the invariant that cond_signal() is only called
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4148
//      within critical sections protected by the adjunct mutex.  This prevents
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4149
//      cond_signal() from "seeing" a condvar that's in the midst of being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4150
//      reinitialized or that is corrupt.  Sadly, this invariant obviates the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4151
//      desirable signal-after-unlock optimization that avoids futile context switching.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4152
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4153
//      I'm also concerned that some versions of NTPL might allocate an auxilliary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4154
//      structure when a condvar is used or initialized.  cond_destroy()  would
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4155
//      release the helper structure.  Our reinitialize-after-timedwait fix
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4156
//      put excessive stress on malloc/free and locks protecting the c-heap.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4157
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4158
// We currently use (4).  See the WorkAroundNTPLTimedWaitHang flag.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4159
// It may be possible to refine (4) by checking the kernel and NTPL verisons
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4160
// and only enabling the work-around for vulnerable environments.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4161
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4162
// utility to compute the abstime argument to timedwait:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4163
// millis is the relative timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4164
// abstime will be the absolute timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4165
// TODO: replace compute_abstime() with unpackTime()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4166
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4167
static struct timespec* compute_abstime(struct timespec* abstime,
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4168
                                        jlong millis) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4169
  if (millis < 0)  millis = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4170
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4171
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4172
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4173
  jlong seconds = millis / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4174
  millis %= 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4175
  if (seconds > 50000000) { // see man cond_timedwait(3T)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4176
    seconds = 50000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4177
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4178
  abstime->tv_sec = now.tv_sec  + seconds;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4179
  long       usec = now.tv_usec + millis * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4180
  if (usec >= 1000000) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4181
    abstime->tv_sec += 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4182
    usec -= 1000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4183
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4184
  abstime->tv_nsec = usec * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4185
  return abstime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4186
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4187
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4188
void os::PlatformEvent::park() {       // AKA "down()"
27458
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4189
  // Transitions for _Event:
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4190
  //   -1 => -1 : illegal
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4191
  //    1 =>  0 : pass - return immediately
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4192
  //    0 => -1 : block; then set _Event to 0 before returning
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4193
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4194
  // Invariant: Only the thread associated with the Event/PlatformEvent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4195
  // may call park().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4196
  // TODO: assert that _Assoc != NULL or _Assoc == Self
25472
381638db28e6 8047104: cleanup misc issues prior to Contended Locking reorder and cache
dcubed
parents: 25468
diff changeset
  4197
  assert(_nParked == 0, "invariant");
381638db28e6 8047104: cleanup misc issues prior to Contended Locking reorder and cache
dcubed
parents: 25468
diff changeset
  4198
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4199
  int v;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4200
  for (;;) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4201
    v = _Event;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4202
    if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4203
  }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4204
  guarantee(v >= 0, "invariant");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4205
  if (v == 0) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4206
    // Do this the hard way by blocking ...
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4207
    int status = pthread_mutex_lock(_mutex);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4208
    assert_status(status == 0, status, "mutex_lock");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4209
    guarantee(_nParked == 0, "invariant");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4210
    ++_nParked;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4211
    while (_Event < 0) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4212
      status = pthread_cond_wait(_cond, _mutex);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4213
      // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4214
      // Treat this the same as if the wait was interrupted
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4215
      if (status == ETIMEDOUT) { status = EINTR; }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4216
      assert_status(status == 0 || status == EINTR, status, "cond_wait");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4217
    }
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4218
    --_nParked;
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4219
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4220
    _Event = 0;
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4221
    status = pthread_mutex_unlock(_mutex);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4222
    assert_status(status == 0, status, "mutex_unlock");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4223
    // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4224
    // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4225
    OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4226
  }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4227
  guarantee(_Event >= 0, "invariant");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4228
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4229
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4230
int os::PlatformEvent::park(jlong millis) {
27458
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4231
  // Transitions for _Event:
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4232
  //   -1 => -1 : illegal
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4233
  //    1 =>  0 : pass - return immediately
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4234
  //    0 => -1 : block; then set _Event to 0 before returning
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4235
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4236
  guarantee(_nParked == 0, "invariant");
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4237
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4238
  int v;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4239
  for (;;) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4240
    v = _Event;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4241
    if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4242
  }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4243
  guarantee(v >= 0, "invariant");
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4244
  if (v != 0) return OS_OK;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4245
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4246
  // We do this the hard way, by blocking the thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4247
  // Consider enforcing a minimum timeout value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4248
  struct timespec abst;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4249
  compute_abstime(&abst, millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4250
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4251
  int ret = OS_TIMEOUT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4252
  int status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4253
  assert_status(status == 0, status, "mutex_lock");
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4254
  guarantee(_nParked == 0, "invariant");
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4255
  ++_nParked;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4256
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4257
  // Object.wait(timo) will return because of
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4258
  // (a) notification
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4259
  // (b) timeout
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4260
  // (c) thread.interrupt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4261
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4262
  // Thread.interrupt and object.notify{All} both call Event::set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4263
  // That is, we treat thread.interrupt as a special case of notification.
24931
4bba680186bd 8044339: Update FilterSpuriousWakeups documentation. Review "Solaris only" vm options descriptions
iignatyev
parents: 24424
diff changeset
  4264
  // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
4bba680186bd 8044339: Update FilterSpuriousWakeups documentation. Review "Solaris only" vm options descriptions
iignatyev
parents: 24424
diff changeset
  4265
  // We assume all ETIME returns are valid.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4266
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4267
  // TODO: properly differentiate simultaneous notify+interrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4268
  // In that case, we should propagate the notify to another waiter.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4269
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4270
  while (_Event < 0) {
31377
229b4eb67c2b 8078513: [linux] Clean up code relevant to LinuxThreads implementation
stuefe
parents: 31357
diff changeset
  4271
    status = pthread_cond_timedwait(_cond, _mutex, &abst);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4272
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4273
      pthread_cond_destroy(_cond);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4274
      pthread_cond_init(_cond, NULL);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4275
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4276
    assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4277
                  status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4278
                  status, "cond_timedwait");
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4279
    if (!FilterSpuriousWakeups) break;                 // previous semantics
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4280
    if (status == ETIMEDOUT) break;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4281
    // We consume and ignore EINTR and spurious wakeups.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4282
  }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4283
  --_nParked;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4284
  if (_Event >= 0) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4285
    ret = OS_OK;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4286
  }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4287
  _Event = 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4288
  status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4289
  assert_status(status == 0, status, "mutex_unlock");
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4290
  assert(_nParked == 0, "invariant");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4291
  // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4292
  // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4293
  OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4294
  return ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4295
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4296
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4297
void os::PlatformEvent::unpark() {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4298
  // Transitions for _Event:
27458
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4299
  //    0 => 1 : just return
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4300
  //    1 => 1 : just return
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4301
  //   -1 => either 0 or 1; must signal target thread
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4302
  //         That is, we can safely transition _Event from -1 to either
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4303
  //         0 or 1.
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4304
  // See also: "Semaphores in Plan 9" by Mullender & Cox
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4305
  //
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4306
  // Note: Forcing a transition from "-1" to "1" on an unpark() means
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4307
  // that it will take two back-to-back park() calls for the owning
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4308
  // thread to block. This has the benefit of forcing a spurious return
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4309
  // from the first park() call after an unpark() call which will help
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4310
  // shake out uses of park() and unpark() without condition variables.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4311
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4312
  if (Atomic::xchg(1, &_Event) >= 0) return;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4313
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4314
  // Wait for the thread associated with the event to vacate
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4315
  int status = pthread_mutex_lock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4316
  assert_status(status == 0, status, "mutex_lock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4317
  int AnyWaiters = _nParked;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4318
  assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4319
  if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4320
    AnyWaiters = 0;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4321
    pthread_cond_signal(_cond);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4322
  }
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4323
  status = pthread_mutex_unlock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4324
  assert_status(status == 0, status, "mutex_unlock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4325
  if (AnyWaiters != 0) {
27458
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4326
    // Note that we signal() *after* dropping the lock for "immortal" Events.
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4327
    // This is safe and avoids a common class of  futile wakeups.  In rare
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4328
    // circumstances this can cause a thread to return prematurely from
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4329
    // cond_{timed}wait() but the spurious wakeup is benign and the victim
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4330
    // will simply re-test the condition and re-park itself.
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4331
    // This provides particular benefit if the underlying platform does not
eb5f1b4f01e1 8061552: Contended Locking speedup PlatformEvent unpark bucket
dcubed
parents: 27400
diff changeset
  4332
    // provide wait morphing.
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4333
    status = pthread_cond_signal(_cond);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4334
    assert_status(status == 0, status, "cond_signal");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4335
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4336
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4337
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4338
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4339
// JSR166
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4340
// -------------------------------------------------------
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4341
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4342
// The solaris and bsd implementations of park/unpark are fairly
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4343
// conservative for now, but can be improved. They currently use a
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4344
// mutex/condvar pair, plus a a count.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4345
// Park decrements count if > 0, else does a condvar wait.  Unpark
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4346
// sets count to 1 and signals condvar.  Only one thread ever waits
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4347
// on the condvar. Contention seen when trying to park implies that someone
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4348
// is unparking you, so don't wait. And spurious returns are fine, so there
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4349
// is no need to track notifications.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4350
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4351
#define MAX_SECS 100000000
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4352
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4353
// This code is common to bsd and solaris and will be moved to a
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4354
// common place in dolphin.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4355
//
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4356
// The passed in time value is either a relative time in nanoseconds
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4357
// or an absolute time in milliseconds. Either way it has to be unpacked
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4358
// into suitable seconds and nanoseconds components and stored in the
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4359
// given timespec structure.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4360
// Given time is a 64-bit value and the time_t used in the timespec is only
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4361
// a signed-32-bit value (except on 64-bit Bsd) we have to watch for
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4362
// overflow if times way in the future are given. Further on Solaris versions
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4363
// prior to 10 there is a restriction (see cond_timedwait) that the specified
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4364
// number of seconds, in abstime, is less than current_time  + 100,000,000.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4365
// As it will be 28 years before "now + 100000000" will overflow we can
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4366
// ignore overflow and just impose a hard-limit on seconds using the value
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4367
// of "now + 100,000,000". This places a limit on the timeout of about 3.17
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4368
// years from "now".
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4369
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4370
static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4371
  assert(time > 0, "convertTime");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4372
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4373
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4374
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4375
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4376
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4377
  time_t max_secs = now.tv_sec + MAX_SECS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4378
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4379
  if (isAbsolute) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4380
    jlong secs = time / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4381
    if (secs > max_secs) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4382
      absTime->tv_sec = max_secs;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4383
    } else {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4384
      absTime->tv_sec = secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4385
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4386
    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4387
  } else {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4388
    jlong secs = time / NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4389
    if (secs >= MAX_SECS) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4390
      absTime->tv_sec = max_secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4391
      absTime->tv_nsec = 0;
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4392
    } else {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4393
      absTime->tv_sec = now.tv_sec + secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4394
      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4395
      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4396
        absTime->tv_nsec -= NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4397
        ++absTime->tv_sec; // note: this must be <= max_secs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4398
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4399
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4400
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4401
  assert(absTime->tv_sec >= 0, "tv_sec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4402
  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4403
  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4404
  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4405
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4406
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4407
void Parker::park(bool isAbsolute, jlong time) {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4408
  // Ideally we'd do something useful while spinning, such
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4409
  // as calling unpackTime().
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4410
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4411
  // Optional fast-path check:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4412
  // Return immediately if a permit is available.
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4413
  // We depend on Atomic::xchg() having full barrier semantics
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4414
  // since we are doing a lock-free update to _counter.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4415
  if (Atomic::xchg(0, &_counter) > 0) return;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4416
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4417
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4418
  assert(thread->is_Java_thread(), "Must be JavaThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4419
  JavaThread *jt = (JavaThread *)thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4420
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4421
  // Optional optimization -- avoid state transitions if there's an interrupt pending.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4422
  // Check interrupt before trying to wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4423
  if (Thread::is_interrupted(thread, false)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4424
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4425
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4426
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4427
  // Next, demultiplex/decode time arguments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4428
  struct timespec absTime;
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4429
  if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4430
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4431
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4432
  if (time > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4433
    unpackTime(&absTime, isAbsolute, time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4434
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4435
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4436
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4437
  // Enter safepoint region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4438
  // Beware of deadlocks such as 6317397.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4439
  // The per-thread Parker:: mutex is a classic leaf-lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4440
  // In particular a thread must never block on the Threads_lock while
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4441
  // holding the Parker:: mutex.  If safepoints are pending both the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4442
  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4443
  ThreadBlockInVM tbivm(jt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4444
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4445
  // Don't wait if cannot get lock since interference arises from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4446
  // unblocking.  Also. check interrupt before trying wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4447
  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4448
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4449
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4450
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4451
  int status;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4452
  if (_counter > 0)  { // no wait needed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4453
    _counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4454
    status = pthread_mutex_unlock(_mutex);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4455
    assert(status == 0, "invariant");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4456
    // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4457
    // correctly with each other and Java-level accesses.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4458
    OrderAccess::fence();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4459
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4460
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4461
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4462
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4463
  // Don't catch signals while blocked; let the running threads have the signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4464
  // (This allows a debugger to break into the running thread.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4465
  sigset_t oldsigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4466
  sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4467
  pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4468
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4469
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4470
  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4471
  jt->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4472
  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4474
  if (time == 0) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4475
    status = pthread_cond_wait(_cond, _mutex);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4476
  } else {
31377
229b4eb67c2b 8078513: [linux] Clean up code relevant to LinuxThreads implementation
stuefe
parents: 31357
diff changeset
  4477
    status = pthread_cond_timedwait(_cond, _mutex, &absTime);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4478
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4479
      pthread_cond_destroy(_cond);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4480
      pthread_cond_init(_cond, NULL);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4481
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4482
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4483
  assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4484
                status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4485
                status, "cond_timedwait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4486
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4487
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4488
  pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4489
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4490
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4491
  _counter = 0;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4492
  status = pthread_mutex_unlock(_mutex);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4493
  assert_status(status == 0, status, "invariant");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4494
  // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4495
  // correctly with each other and Java-level accesses.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4496
  OrderAccess::fence();
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4497
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4498
  // If externally suspended while waiting, re-suspend
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4499
  if (jt->handle_special_suspend_equivalent_condition()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4500
    jt->java_suspend_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4501
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4502
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4503
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4504
void Parker::unpark() {
25472
381638db28e6 8047104: cleanup misc issues prior to Contended Locking reorder and cache
dcubed
parents: 25468
diff changeset
  4505
  int status = pthread_mutex_lock(_mutex);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4506
  assert(status == 0, "invariant");
25472
381638db28e6 8047104: cleanup misc issues prior to Contended Locking reorder and cache
dcubed
parents: 25468
diff changeset
  4507
  const int s = _counter;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4508
  _counter = 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4509
  if (s < 1) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4510
    if (WorkAroundNPTLTimedWaitHang) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4511
      status = pthread_cond_signal(_cond);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4512
      assert(status == 0, "invariant");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4513
      status = pthread_mutex_unlock(_mutex);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4514
      assert(status == 0, "invariant");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4515
    } else {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4516
      status = pthread_mutex_unlock(_mutex);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4517
      assert(status == 0, "invariant");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4518
      status = pthread_cond_signal(_cond);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4519
      assert(status == 0, "invariant");
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4520
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4521
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4522
    pthread_mutex_unlock(_mutex);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24931
diff changeset
  4523
    assert(status == 0, "invariant");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4524
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4525
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4526
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4527
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4528
// Darwin has no "environ" in a dynamic library.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4529
#ifdef __APPLE__
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4530
  #include <crt_externs.h>
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4531
  #define environ (*_NSGetEnviron())
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4532
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4533
extern char** environ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4534
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4536
// Run the specified command in a separate process. Return its exit value,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4537
// or -1 on failure (e.g. can't fork a new process).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4538
// Unlike system(), this function can be called from signal handler. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4539
// doesn't block SIGINT et al.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4540
int os::fork_and_exec(char* cmd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4541
  const char * argv[4] = {"sh", "-c", cmd, NULL};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4542
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4543
  // fork() in BsdThreads/NPTL is not async-safe. It needs to run
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4544
  // pthread_atfork handlers and reset pthread library. All we need is a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4545
  // separate process to execve. Make a direct syscall to fork process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4546
  // On IA64 there's no fork syscall, we have to use fork() and hope for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4547
  // the best...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4548
  pid_t pid = fork();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4549
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4550
  if (pid < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4551
    // fork failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4552
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4553
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4554
  } else if (pid == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4555
    // child process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4556
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4557
    // execve() in BsdThreads will call pthread_kill_other_threads_np()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4558
    // first to kill every thread on the thread list. Because this list is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4559
    // not reset by fork() (see notes above), execve() will instead kill
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4560
    // every thread in the parent process. We know this is the only thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4561
    // in the new process, so make a system call directly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4562
    // IA64 should use normal execve() from glibc to match the glibc fork()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4563
    // above.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4564
    execve("/bin/sh", (char* const*)argv, environ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4566
    // execve failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4567
    _exit(-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4568
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4569
  } else  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4570
    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4571
    // care about the actual exit code, for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4572
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4573
    int status;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4574
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4575
    // Wait for the child process to exit.  This returns immediately if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4576
    // the child has already exited. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4577
    while (waitpid(pid, &status, 0) < 0) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4578
      switch (errno) {
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4579
      case ECHILD: return 0;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4580
      case EINTR: break;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4581
      default: return -1;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4582
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4583
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4584
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4585
    if (WIFEXITED(status)) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4586
      // The child exited normally; get its exit code.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4587
      return WEXITSTATUS(status);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4588
    } else if (WIFSIGNALED(status)) {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4589
      // The child exited because of a signal
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4590
      // The best value to return is 0x80 + signal number,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4591
      // because that is what all Unix shells do, and because
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4592
      // it allows callers to distinguish between process exit and
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4593
      // process death by signal.
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4594
      return 0x80 + WTERMSIG(status);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4595
    } else {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4596
      // Unknown exit code; pass it through
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4597
      return status;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4598
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4599
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4600
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4601
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4602
// is_headless_jre()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4603
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4604
// Test for the existence of xawt/libmawt.so or libawt_xawt.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4605
// in order to report if we are running in a headless jre
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4606
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4607
// Since JDK8 xawt/libmawt.so was moved into the same directory
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4608
// as libawt.so, and renamed libawt_xawt.so
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4609
//
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4610
bool os::is_headless_jre() {
21123
1370c7b2f97c 8025673: [macosx] Disable X11 AWT toolkit
dholmes
parents: 20683
diff changeset
  4611
#ifdef __APPLE__
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4612
  // We no longer build headless-only on Mac OS X
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4613
  return false;
21123
1370c7b2f97c 8025673: [macosx] Disable X11 AWT toolkit
dholmes
parents: 20683
diff changeset
  4614
#else
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4615
  struct stat statbuf;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4616
  char buf[MAXPATHLEN];
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4617
  char libmawtpath[MAXPATHLEN];
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4618
  const char *xawtstr  = "/xawt/libmawt" JNI_LIB_SUFFIX;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4619
  const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4620
  char *p;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4621
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4622
  // Get path to libjvm.so
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4623
  os::jvm_path(buf, sizeof(buf));
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4624
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4625
  // Get rid of libjvm.so
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4626
  p = strrchr(buf, '/');
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4627
  if (p == NULL) {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4628
    return false;
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4629
  } else {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4630
    *p = '\0';
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4631
  }
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4632
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4633
  // Get rid of client or server
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4634
  p = strrchr(buf, '/');
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4635
  if (p == NULL) {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4636
    return false;
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4637
  } else {
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4638
    *p = '\0';
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
  4639
  }
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4640
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4641
  // check xawt/libmawt.so
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4642
  strcpy(libmawtpath, buf);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4643
  strcat(libmawtpath, xawtstr);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4644
  if (::stat(libmawtpath, &statbuf) == 0) return false;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4645
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4646
  // check libawt_xawt.so
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4647
  strcpy(libmawtpath, buf);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4648
  strcat(libmawtpath, new_xawtstr);
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4649
  if (::stat(libmawtpath, &statbuf) == 0) return false;
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4650
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25946
diff changeset
  4651
  return true;
21123
1370c7b2f97c 8025673: [macosx] Disable X11 AWT toolkit
dholmes
parents: 20683
diff changeset
  4652
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4653
}
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4654
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4655
// Get the default path to the core file
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4656
// Returns the length of the string
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4657
int os::get_core_path(char* buffer, size_t bufferSize) {
28172
19ae5c844e75 8059586: hs_err report should treat redirected core pattern
dholmes
parents: 27926
diff changeset
  4658
  int n = jio_snprintf(buffer, bufferSize, "/cores/core.%d", current_process_id());
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4659
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4660
  // Truncate if theoretical string was longer than bufferSize
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4661
  n = MIN2(n, (int)bufferSize);
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4662
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4663
  return n;
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4664
}
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  4665
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4666
#ifndef PRODUCT
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4667
void TestReserveMemorySpecial_test() {
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4668
  // No tests available for this platform
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4669
}
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4670
#endif