hotspot/src/os/bsd/vm/os_bsd.cpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 19546 f6b7c9e96ea3
child 20373 5d68702ea998
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     1
/*
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
     2
 * Copyright (c) 1999, 2013, 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"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    39
#include "os_share_bsd.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    40
#include "prims/jniFastGetField.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    41
#include "prims/jvm.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    42
#include "prims/jvm_misc.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    43
#include "runtime/arguments.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    44
#include "runtime/extendedPC.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    45
#include "runtime/globals.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    46
#include "runtime/interfaceSupport.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    47
#include "runtime/java.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    48
#include "runtime/javaCalls.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    49
#include "runtime/mutexLocker.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    50
#include "runtime/objectMonitor.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    51
#include "runtime/osThread.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    52
#include "runtime/perfMemory.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    53
#include "runtime/sharedRuntime.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    54
#include "runtime/statSampler.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    55
#include "runtime/stubRoutines.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14471
diff changeset
    56
#include "runtime/thread.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    57
#include "runtime/threadCritical.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    58
#include "runtime/timer.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    59
#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
    60
#include "services/memTracker.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    61
#include "services/runtimeService.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    62
#include "utilities/decoder.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    63
#include "utilities/defaultStream.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    64
#include "utilities/events.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    65
#include "utilities/growableArray.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    66
#include "utilities/vmError.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    67
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    68
// put OS-includes here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    69
# include <sys/types.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    70
# include <sys/mman.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    71
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    72
# include <sys/select.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    73
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    74
# include <signal.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    75
# include <errno.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    76
# include <dlfcn.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    77
# include <stdio.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    78
# include <unistd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    79
# include <sys/resource.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    80
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    81
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    82
# include <sys/time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    83
# include <sys/times.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    84
# include <sys/utsname.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    85
# include <sys/socket.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    86
# include <sys/wait.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    87
# include <time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    88
# include <pwd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    89
# include <poll.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    90
# include <semaphore.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    91
# include <fcntl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    92
# include <string.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    93
# include <sys/param.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    94
# include <sys/sysctl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    95
# include <sys/ipc.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    96
# include <sys/shm.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    97
#ifndef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    98
# include <link.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    99
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   100
# include <stdint.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   101
# include <inttypes.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   102
# include <sys/ioctl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   103
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   104
#if defined(__FreeBSD__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   105
# include <elf.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   106
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   107
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   108
#ifdef __APPLE__
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   109
# include <mach/mach.h> // semaphore_* API
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   110
# include <mach-o/dyld.h>
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   111
# include <sys/proc_info.h>
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   112
# include <objc/objc-auto.h>
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   113
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   114
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   115
#ifndef MAP_ANONYMOUS
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   116
#define MAP_ANONYMOUS MAP_ANON
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   117
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   118
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   119
#define MAX_PATH    (2 * K)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   120
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   121
// for timer info max values which include all bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   122
#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   123
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   124
#define LARGEPAGES_BIT (1 << 6)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   125
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   126
// global variables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   127
julong os::Bsd::_physical_memory = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   128
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   129
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   130
int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   131
pthread_t os::Bsd::_main_thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   132
int os::Bsd::_page_size = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   133
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   134
static jlong initial_time_count=0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   135
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   136
static int clock_tics_per_sec = 100;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   137
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   138
// For diagnostics to print a message once. see run_periodic_checks
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   139
static sigset_t check_signal_done;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   140
static bool check_signals = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   141
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   142
static pid_t _initial_pid = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   143
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   144
/* Signal number used to suspend/resume a thread */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   145
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   146
/* do not use any signal number less than SIGSEGV, see 4355769 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   147
static int SR_signum = SIGUSR2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   148
sigset_t SR_sigset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   149
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   150
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   151
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   152
// utility functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   153
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   154
static int SR_initialize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   155
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   156
julong os::available_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   157
  return Bsd::available_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   158
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   159
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   160
julong os::Bsd::available_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   161
  // XXXBSD: this is just a stopgap implementation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   162
  return physical_memory() >> 2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   163
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   164
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   165
julong os::physical_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   166
  return Bsd::physical_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   167
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   168
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   169
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   170
// environment support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   171
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   172
bool os::getenv(const char* name, char* buf, int len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   173
  const char* val = ::getenv(name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   174
  if (val != NULL && strlen(val) < (size_t)len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   175
    strcpy(buf, val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   176
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   177
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   178
  if (len > 0) buf[0] = 0;  // return a null string
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   179
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   180
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   181
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   182
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   183
// Return true if user is running as root.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   184
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   185
bool os::have_special_privileges() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   186
  static bool init = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   187
  static bool privileges = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   188
  if (!init) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   189
    privileges = (getuid() != geteuid()) || (getgid() != getegid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   190
    init = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   191
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   192
  return privileges;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   193
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   194
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   195
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   196
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   197
// Cpu architecture string
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   198
#if   defined(ZERO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   199
static char cpu_arch[] = ZERO_LIBARCH;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   200
#elif defined(IA64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   201
static char cpu_arch[] = "ia64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   202
#elif defined(IA32)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   203
static char cpu_arch[] = "i386";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   204
#elif defined(AMD64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   205
static char cpu_arch[] = "amd64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   206
#elif defined(ARM)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   207
static char cpu_arch[] = "arm";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   208
#elif defined(PPC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   209
static char cpu_arch[] = "ppc";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   210
#elif defined(SPARC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   211
#  ifdef _LP64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   212
static char cpu_arch[] = "sparcv9";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   213
#  else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   214
static char cpu_arch[] = "sparc";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   215
#  endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   216
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   217
#error Add appropriate cpu_arch setting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   218
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   219
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   220
// Compiler variant
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   221
#ifdef COMPILER2
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   222
#define COMPILER_VARIANT "server"
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   223
#else
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   224
#define COMPILER_VARIANT "client"
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   225
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   226
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   227
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   228
void os::Bsd::initialize_system_info() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   229
  int mib[2];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   230
  size_t len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   231
  int cpu_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   232
  julong mem_val;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   233
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   234
  /* get processors count via hw.ncpus sysctl */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   235
  mib[0] = CTL_HW;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   236
  mib[1] = HW_NCPU;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   237
  len = sizeof(cpu_val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   238
  if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   239
       assert(len == sizeof(cpu_val), "unexpected data size");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   240
       set_processor_count(cpu_val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   241
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   242
  else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   243
       set_processor_count(1);   // fallback
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   244
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   245
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   246
  /* get physical memory via hw.memsize sysctl (hw.memsize is used
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   247
   * since it returns a 64 bit value)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   248
   */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   249
  mib[0] = CTL_HW;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   250
  mib[1] = HW_MEMSIZE;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   251
  len = sizeof(mem_val);
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   252
  if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   253
       assert(len == sizeof(mem_val), "unexpected data size");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   254
       _physical_memory = mem_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   255
  } else {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   256
       _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
   257
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   258
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   259
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   260
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   261
       // limit _physical_memory memory view on OpenBSD since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   262
       // datasize rlimit restricts us anyway.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   263
       struct rlimit limits;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   264
       getrlimit(RLIMIT_DATA, &limits);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   265
       _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   266
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   267
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   268
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   269
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   270
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   271
static const char *get_home() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   272
  const char *home_dir = ::getenv("HOME");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   273
  if ((home_dir == NULL) || (*home_dir == '\0')) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   274
    struct passwd *passwd_info = getpwuid(geteuid());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   275
    if (passwd_info != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   276
      home_dir = passwd_info->pw_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   277
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   278
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   279
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   280
  return home_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   281
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   282
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   283
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   284
void os::init_system_properties_values() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   285
//  char arch[12];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   286
//  sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   287
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   288
  // The next steps are taken in the product version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   289
  //
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   290
  // Obtain the JAVA_HOME value from the location of libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   291
  // This library should be located at:
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   292
  // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   293
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   294
  // 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
   295
  // assume libjvm.so is installed in a JDK and we use this path.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   296
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   297
  // Otherwise exit with message: "Could not create the Java virtual machine."
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   298
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   299
  // The following extra steps are taken in the debugging version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   300
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   301
  // If "/jre/lib/" does NOT appear at the right place in the path
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   302
  // instead of exit check for $JAVA_HOME environment variable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   303
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   304
  // 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
   305
  // 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
   306
  // it looks like libjvm.so is installed there
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   307
  // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   308
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   309
  // Otherwise exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   310
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   311
  // Important note: if the location of libjvm.so changes this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   312
  // code needs to be changed accordingly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   313
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   314
  // The next few definitions allow the code to be verbatim:
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   315
#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   316
#define getenv(n) ::getenv(n)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   317
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   318
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   319
 * See ld(1):
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   320
 *      The linker uses the following search paths to locate required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   321
 *      shared libraries:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   322
 *        1: ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   323
 *        ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   324
 *        7: The default directories, normally /lib and /usr/lib.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   325
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   326
#ifndef DEFAULT_LIBPATH
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   327
#define DEFAULT_LIBPATH "/lib:/usr/lib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   328
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   329
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   330
#define EXTENSIONS_DIR  "/lib/ext"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   331
#define ENDORSED_DIR    "/lib/endorsed"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   332
#define REG_DIR         "/usr/java/packages"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   333
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   334
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   335
#define SYS_EXTENSIONS_DIR   "/Library/Java/Extensions"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   336
#define SYS_EXTENSIONS_DIRS  SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   337
        const char *user_home_dir = get_home();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   338
        // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   339
        int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   340
            sizeof(SYS_EXTENSIONS_DIRS);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   341
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   342
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   343
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   344
    /* sysclasspath, java_home, dll_dir */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   345
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   346
        char *home_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   347
        char *dll_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   348
        char *pslash;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   349
        char buf[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   350
        os::jvm_path(buf, sizeof(buf));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   351
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   352
        // Found the full path to libjvm.so.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   353
        // Now cut the path to <java_home>/jre if we can.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   354
        *(strrchr(buf, '/')) = '\0';  /* get rid of /libjvm.so */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   355
        pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   356
        if (pslash != NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   357
            *pslash = '\0';           /* get rid of /{client|server|hotspot} */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   358
        dll_path = malloc(strlen(buf) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   359
        if (dll_path == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   360
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   361
        strcpy(dll_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   362
        Arguments::set_dll_dir(dll_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   363
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   364
        if (pslash != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   365
            pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   366
            if (pslash != NULL) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   367
                *pslash = '\0';       /* get rid of /<arch> (/lib on macosx) */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   368
#ifndef __APPLE__
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   369
                pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   370
                if (pslash != NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   371
                    *pslash = '\0';   /* get rid of /lib */
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   372
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   373
            }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   374
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   375
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   376
        home_path = malloc(strlen(buf) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   377
        if (home_path == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   378
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   379
        strcpy(home_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   380
        Arguments::set_java_home(home_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   381
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   382
        if (!set_boot_path('/', ':'))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   383
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   384
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   385
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   386
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   387
     * Where to look for native libraries
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   388
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   389
     * Note: Due to a legacy implementation, most of the library path
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   390
     * is set in the launcher.  This was to accomodate linking restrictions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   391
     * on legacy Bsd implementations (which are no longer supported).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   392
     * Eventually, all the library path setting will be done here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   393
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   394
     * However, to prevent the proliferation of improperly built native
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   395
     * libraries, the new path component /usr/java/packages is added here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   396
     * Eventually, all the library path setting will be done here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   397
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   398
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   399
        char *ld_library_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   400
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   401
        /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   402
         * Construct the invariant part of ld_library_path. Note that the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   403
         * space for the colon and the trailing null are provided by the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   404
         * nulls included by the sizeof operator (so actually we allocate
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   405
         * a byte more than necessary).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   406
         */
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   407
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   408
        ld_library_path = (char *) malloc(system_ext_size);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   409
        sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   410
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   411
        ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   412
            strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   413
        sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   414
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   415
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   416
        /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   417
         * Get the user setting of LD_LIBRARY_PATH, and prepended it.  It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   418
         * should always exist (until the legacy problem cited above is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   419
         * addressed).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   420
         */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   421
#ifdef __APPLE__
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   422
        // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   423
        char *l = getenv("JAVA_LIBRARY_PATH");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   424
        if (l != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   425
            char *t = ld_library_path;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   426
            /* That's +1 for the colon and +1 for the trailing '\0' */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   427
            ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   428
            sprintf(ld_library_path, "%s:%s", l, t);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   429
            free(t);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   430
        }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   431
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   432
        char *v = getenv("DYLD_LIBRARY_PATH");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   433
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   434
        char *v = getenv("LD_LIBRARY_PATH");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   435
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   436
        if (v != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   437
            char *t = ld_library_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   438
            /* That's +1 for the colon and +1 for the trailing '\0' */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   439
            ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   440
            sprintf(ld_library_path, "%s:%s", v, t);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   441
            free(t);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   442
        }
11880
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   443
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   444
#ifdef __APPLE__
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   445
        // Apple's Java6 has "." at the beginning of java.library.path.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   446
        // OpenJDK on Windows has "." at the end of java.library.path.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   447
        // OpenJDK on Linux and Solaris don't have "." in java.library.path
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   448
        // at all. To ease the transition from Apple's Java6 to OpenJDK7,
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   449
        // "." is appended to the end of java.library.path. Yes, this
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   450
        // could cause a change in behavior, but Apple's Java6 behavior
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   451
        // can be achieved by putting "." at the beginning of the
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   452
        // JAVA_LIBRARY_PATH environment variable.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   453
        {
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   454
            char *t = ld_library_path;
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   455
            // that's +3 for appending ":." and the trailing '\0'
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   456
            ld_library_path = (char *) malloc(strlen(t) + 3);
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   457
            sprintf(ld_library_path, "%s:%s", t, ".");
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   458
            free(t);
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   459
        }
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   460
#endif
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   461
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   462
        Arguments::set_library_path(ld_library_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   463
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   464
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   465
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   466
     * Extensions directories.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   467
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   468
     * Note that the space for the colon and the trailing null are provided
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   469
     * by the nulls included by the sizeof operator (so actually one byte more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   470
     * than necessary is allocated).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   471
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   472
    {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   473
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   474
        char *buf = malloc(strlen(Arguments::get_java_home()) +
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   475
            sizeof(EXTENSIONS_DIR) + system_ext_size);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   476
        sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   477
            SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   478
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   479
        char *buf = malloc(strlen(Arguments::get_java_home()) +
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   480
            sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   481
        sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   482
            Arguments::get_java_home());
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   483
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   484
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   485
        Arguments::set_ext_dirs(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   486
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   487
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   488
    /* Endorsed standards default directory. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   489
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   490
        char * buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   491
        buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   492
        sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   493
        Arguments::set_endorsed_dirs(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   494
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   495
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   496
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   497
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   498
#undef SYS_EXTENSIONS_DIR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   499
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   500
#undef malloc
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   501
#undef getenv
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   502
#undef EXTENSIONS_DIR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   503
#undef ENDORSED_DIR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   504
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   505
  // Done
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   506
  return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   507
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   508
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   509
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   510
// breakpoint support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   511
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   512
void os::breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   513
  BREAKPOINT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   514
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   515
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   516
extern "C" void breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   517
  // use debugger to set breakpoint here
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
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   521
// signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   522
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   523
debug_only(static bool signal_sets_initialized = false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   524
static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   526
bool os::Bsd::is_sig_ignored(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   527
      struct sigaction oact;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   528
      sigaction(sig, (struct sigaction*)NULL, &oact);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   529
      void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oact.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   530
                                     : CAST_FROM_FN_PTR(void*,  oact.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   531
      if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   532
           return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   533
      else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   534
           return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   535
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   536
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   537
void os::Bsd::signal_sets_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   538
  // Should also have an assertion stating we are still single-threaded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   539
  assert(!signal_sets_initialized, "Already initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   540
  // Fill in signals that are necessarily unblocked for all threads in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   541
  // the VM. Currently, we unblock the following signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   542
  // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   543
  //                         by -Xrs (=ReduceSignalUsage));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   544
  // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   545
  // other threads. The "ReduceSignalUsage" boolean tells us not to alter
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   546
  // the dispositions or masks wrt these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   547
  // Programs embedding the VM that want to use the above signals for their
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   548
  // own purposes must, at this time, use the "-Xrs" option to prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   549
  // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   550
  // (See bug 4345157, and other related bugs).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   551
  // In reality, though, unblocking these signals is really a nop, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   552
  // these signals are not blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   553
  sigemptyset(&unblocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   554
  sigemptyset(&allowdebug_blocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   555
  sigaddset(&unblocked_sigs, SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   556
  sigaddset(&unblocked_sigs, SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   557
  sigaddset(&unblocked_sigs, SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   558
  sigaddset(&unblocked_sigs, SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   559
  sigaddset(&unblocked_sigs, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   560
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   561
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   562
   if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   563
      sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   564
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   565
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   566
   if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   567
      sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   568
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   569
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   570
   if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   571
      sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   572
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   573
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   574
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   575
  // Fill in signals that are blocked by all but the VM thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   576
  sigemptyset(&vm_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   577
  if (!ReduceSignalUsage)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   578
    sigaddset(&vm_sigs, BREAK_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   579
  debug_only(signal_sets_initialized = true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   580
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   581
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   582
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   583
// These are signals that are unblocked while a thread is running Java.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   584
// (For some reason, they get blocked by default.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   585
sigset_t* os::Bsd::unblocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   586
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   587
  return &unblocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   588
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   589
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   590
// These are the signals that are blocked while a (non-VM) thread is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   591
// running Java. Only the VM thread handles these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   592
sigset_t* os::Bsd::vm_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   593
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   594
  return &vm_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   595
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   596
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   597
// These are signals that are blocked during cond_wait to allow debugger in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   598
sigset_t* os::Bsd::allowdebug_blocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   599
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   600
  return &allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   601
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   602
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   603
void os::Bsd::hotspot_sigmask(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   604
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   605
  //Save caller's signal mask before setting VM signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   606
  sigset_t caller_sigmask;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   607
  pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   608
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   609
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   610
  osthread->set_caller_sigmask(caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   611
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   612
  pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   613
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   614
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   615
    if (thread->is_VM_thread()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   616
      // Only the VM thread handles BREAK_SIGNAL ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   617
      pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   618
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   619
      // ... all other threads block BREAK_SIGNAL
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   620
      pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   621
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   622
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   623
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   624
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   625
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   626
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   627
// create new thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   628
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   629
// check if it's safe to start a new thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   630
static bool _thread_safety_check(Thread* thread) {
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   631
  return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   632
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   633
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   634
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   635
// library handle for calling objc_registerThreadWithCollector()
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   636
// without static linking to the libobjc library
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   637
#define OBJC_LIB "/usr/lib/libobjc.dylib"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   638
#define OBJC_GCREGISTER "objc_registerThreadWithCollector"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   639
typedef void (*objc_registerThreadWithCollector_t)();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   640
extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   641
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   642
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   643
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   644
#ifdef __APPLE__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   645
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
   646
  // 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
   647
  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
   648
  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
   649
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   650
  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
   651
              (thread_info_t) &m_ident_info, &count);
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   652
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   653
  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
   654
}
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   655
#endif
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   656
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   657
// Thread start routine for all newly created threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   658
static void *java_start(Thread *thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   659
  // Try to randomize the cache line index of hot stack frames.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   660
  // This helps when threads of the same stack traces evict each other's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   661
  // cache lines. The threads can be either from the same JVM instance, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   662
  // from different JVM instances. The benefit is especially true for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   663
  // processors with hyperthreading technology.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   664
  static int counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   665
  int pid = os::current_process_id();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   666
  alloca(((pid ^ counter++) & 7) * 128);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   667
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   668
  ThreadLocalStorage::set_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   669
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   670
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   671
  Monitor* sync = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   672
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   673
  // non floating stack BsdThreads needs extra check, see above
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   674
  if (!_thread_safety_check(thread)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   675
    // notify parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   676
    MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   677
    osthread->set_state(ZOMBIE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   678
    sync->notify_all();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   679
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   680
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
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__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   683
  // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   684
  mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   685
  guarantee(thread_id != 0, "thread id missing from pthreads");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   686
  osthread->set_thread_id(thread_id);
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   687
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   688
  uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   689
  guarantee(unique_thread_id != 0, "unique thread id was not found");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   690
  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
   691
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   692
  // thread_id is pthread_id on BSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   693
  osthread->set_thread_id(::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
   694
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   695
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   696
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   697
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   698
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   699
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   700
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   701
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   702
  // register thread with objc gc
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   703
  if (objc_registerThreadWithCollectorFunction != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   704
    objc_registerThreadWithCollectorFunction();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   705
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   706
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   707
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   708
  // handshaking with parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   709
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   710
    MutexLockerEx ml(sync, 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
    // notify parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   713
    osthread->set_state(INITIALIZED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   714
    sync->notify_all();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   715
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   716
    // wait until os::start_thread()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   717
    while (osthread->get_state() == INITIALIZED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   718
      sync->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   719
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   720
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   721
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   722
  // call one more level start routine
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   723
  thread->run();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   724
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   725
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   726
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   727
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   728
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   729
  assert(thread->osthread() == NULL, "caller responsible");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   730
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   731
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   732
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   733
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   734
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   735
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   736
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   737
  // set the correct thread state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   738
  osthread->set_thread_type(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   739
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   740
  // Initial state is ALLOCATED but not INITIALIZED
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   741
  osthread->set_state(ALLOCATED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   742
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   743
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   744
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   745
  // init thread attributes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   746
  pthread_attr_t attr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   747
  pthread_attr_init(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   748
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   749
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   750
  // stack size
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   751
  if (os::Bsd::supports_variable_stack_size()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   752
    // calculate stack size if it's not specified by caller
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   753
    if (stack_size == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   754
      stack_size = os::Bsd::default_stack_size(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   755
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   756
      switch (thr_type) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   757
      case os::java_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   758
        // Java threads use ThreadStackSize which default value can be
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   759
        // changed with the flag -Xss
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   760
        assert (JavaThread::stack_size_at_create() > 0, "this should be set");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   761
        stack_size = JavaThread::stack_size_at_create();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   762
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   763
      case os::compiler_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   764
        if (CompilerThreadStackSize > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   765
          stack_size = (size_t)(CompilerThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   766
          break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   767
        } // else fall through:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   768
          // use VMThreadStackSize if CompilerThreadStackSize is not defined
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   769
      case os::vm_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   770
      case os::pgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   771
      case os::cgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   772
      case os::watcher_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   773
        if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   774
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   775
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   776
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   777
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   778
    stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   779
    pthread_attr_setstacksize(&attr, stack_size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   780
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   781
    // let pthread_create() pick the default value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   782
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   783
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   784
  ThreadState state;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   785
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   786
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   787
    pthread_t tid;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   788
    int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   789
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   790
    pthread_attr_destroy(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   791
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   792
    if (ret != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   793
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   794
        perror("pthread_create()");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   795
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   796
      // Need to clean up stuff we've allocated so far
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   797
      thread->set_osthread(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   798
      delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   799
      return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   800
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   801
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   802
    // Store pthread info into the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   803
    osthread->set_pthread_id(tid);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   804
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   805
    // Wait until child thread is either initialized or aborted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   806
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   807
      Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   808
      MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   809
      while ((state = osthread->get_state()) == ALLOCATED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   810
        sync_with_child->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   811
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   812
    }
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   816
  // Aborted due to thread limit being reached
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   817
  if (state == ZOMBIE) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   818
      thread->set_osthread(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   819
      delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   820
      return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   821
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   822
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   823
  // The thread is returned suspended (in state INITIALIZED),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   824
  // and is started higher up in the call chain
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   825
  assert(state == INITIALIZED, "race condition");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   826
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   827
}
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
// attach existing thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   831
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   832
// bootstrap the main thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   833
bool os::create_main_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   834
  assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   835
  return create_attached_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   836
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   838
bool os::create_attached_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   839
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   840
    thread->verify_not_published();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   841
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   842
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   843
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   844
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   845
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   846
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   847
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   848
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   849
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   850
  // 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
   851
#ifdef __APPLE__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   852
  // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   853
  mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   854
  guarantee(thread_id != 0, "just checking");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   855
  osthread->set_thread_id(thread_id);
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   856
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   857
  uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   858
  guarantee(unique_thread_id != 0, "just checking");
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
   859
  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
   860
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   861
  osthread->set_thread_id(::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
   862
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   863
  osthread->set_pthread_id(::pthread_self());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   864
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   865
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   866
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   867
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   868
  // Initial thread state is RUNNABLE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   869
  osthread->set_state(RUNNABLE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   870
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   871
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   872
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   873
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   874
  // and save the caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   875
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   876
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   877
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   878
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   879
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   880
void os::pd_start_thread(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   881
  OSThread * osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   882
  assert(osthread->get_state() != INITIALIZED, "just checking");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   883
  Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   884
  MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   885
  sync_with_child->notify();
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
// Free Bsd resources related to the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   889
void os::free_thread(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   890
  assert(osthread != NULL, "osthread not set");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   891
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   892
  if (Thread::current()->osthread() == osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   893
    // Restore caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   894
    sigset_t sigmask = osthread->caller_sigmask();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   895
    pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   896
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   897
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   898
  delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   899
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   900
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   901
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   902
// thread local storage
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   903
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   904
int os::allocate_thread_local_storage() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   905
  pthread_key_t key;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   906
  int rslt = pthread_key_create(&key, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   907
  assert(rslt == 0, "cannot allocate thread local storage");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   908
  return (int)key;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   909
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   910
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   911
// 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
   912
// on VM exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   913
void os::free_thread_local_storage(int index) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   914
  int rslt = pthread_key_delete((pthread_key_t)index);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   915
  assert(rslt == 0, "invalid index");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   916
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   917
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   918
void os::thread_local_storage_at_put(int index, void* value) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   919
  int rslt = pthread_setspecific((pthread_key_t)index, value);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   920
  assert(rslt == 0, "pthread_setspecific failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   921
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   922
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   923
extern "C" Thread* get_thread() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   924
  return ThreadLocalStorage::thread();
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   928
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   929
// time support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   930
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   931
// Time since start-up in seconds to a fine granularity.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   932
// Used by VMSelfDestructTimer and the MemProfiler.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   933
double os::elapsedTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   934
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   935
  return (double)(os::elapsed_counter()) * 0.000001;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   936
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   937
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   938
jlong os::elapsed_counter() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   939
  timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   940
  int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   941
  return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   942
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   943
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   944
jlong os::elapsed_frequency() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   945
  return (1000 * 1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   946
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   947
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17134
diff changeset
   948
bool os::supports_vtime() { return true; }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   949
bool os::enable_vtime()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   950
bool os::vtime_enabled()  { return false; }
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17134
diff changeset
   951
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   952
double os::elapsedVTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   953
  // better than nothing, but not much
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   954
  return elapsedTime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   955
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   956
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   957
jlong os::javaTimeMillis() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   958
  timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   959
  int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   960
  assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   961
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   962
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   963
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   964
#ifndef CLOCK_MONOTONIC
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   965
#define CLOCK_MONOTONIC (1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   966
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   967
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   968
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   969
void os::Bsd::clock_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   970
        // XXXDARWIN: Investigate replacement monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   971
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   972
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   973
void os::Bsd::clock_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   974
  struct timespec res;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   975
  struct timespec tp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   976
  if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   977
      ::clock_gettime(CLOCK_MONOTONIC, &tp)  == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   978
    // yes, monotonic clock is supported
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   979
    _clock_gettime = ::clock_gettime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   980
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   981
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   982
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   983
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   984
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   985
jlong os::javaTimeNanos() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   986
  if (Bsd::supports_monotonic_clock()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   987
    struct timespec tp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   988
    int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   989
    assert(status == 0, "gettime error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   990
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   991
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   992
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   993
    timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   994
    int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   995
    assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   996
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   997
    return 1000 * usecs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   998
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   999
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1000
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1001
void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1002
  if (Bsd::supports_monotonic_clock()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1003
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1004
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1005
    // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1006
    info_ptr->may_skip_backward = false;      // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1007
    info_ptr->may_skip_forward = false;       // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1008
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1009
    // gettimeofday - based on time in seconds since the Epoch thus does not wrap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1010
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1011
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1012
    // gettimeofday is a real time clock so it skips
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1013
    info_ptr->may_skip_backward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1014
    info_ptr->may_skip_forward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1015
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1016
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1017
  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1018
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1019
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1020
// Return the real, user, and system times in seconds from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1021
// arbitrary fixed point in the past.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1022
bool os::getTimesSecs(double* process_real_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1023
                      double* process_user_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1024
                      double* process_system_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1025
  struct tms ticks;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1026
  clock_t real_ticks = times(&ticks);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1027
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1028
  if (real_ticks == (clock_t) (-1)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1029
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1030
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1031
    double ticks_per_second = (double) clock_tics_per_sec;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1032
    *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1033
    *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1034
    *process_real_time = ((double) real_ticks) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1035
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1036
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1037
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1038
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1039
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1040
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1041
char * os::local_time_string(char *buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1042
  struct tm t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1043
  time_t long_time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1044
  time(&long_time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1045
  localtime_r(&long_time, &t);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1046
  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1047
               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1048
               t.tm_hour, t.tm_min, t.tm_sec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1049
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1050
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1051
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1052
struct tm* os::localtime_pd(const time_t* clock, struct tm*  res) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1053
  return localtime_r(clock, res);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1054
}
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
// runtime exit support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1058
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1059
// Note: os::shutdown() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1060
// called from signal handler. Before adding something to os::shutdown(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1061
// sure it is async-safe and can handle partially initialized VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1062
void os::shutdown() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1063
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1064
  // allow PerfMemory to attempt cleanup of any persistent resources
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1065
  perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1066
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1067
  // needs to remove object in file system
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1068
  AttachListener::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1069
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1070
  // flush buffered output, finish log files
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1071
  ostream_abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1072
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1073
  // Check for abort hook
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1074
  abort_hook_t abort_hook = Arguments::abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1075
  if (abort_hook != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1076
    abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1077
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1078
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1079
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1080
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1081
// Note: os::abort() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1082
// called from signal handler. Before adding something to os::abort(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1083
// sure it is async-safe and can handle partially initialized VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1084
void os::abort(bool dump_core) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1085
  os::shutdown();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1086
  if (dump_core) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1087
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1088
    fdStream out(defaultStream::output_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1089
    out.print_raw("Current thread is ");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1090
    char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1091
    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1092
    out.print_raw_cr(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1093
    out.print_raw_cr("Dumping core ...");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1094
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1095
    ::abort(); // dump core
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1096
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1097
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1098
  ::exit(1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1099
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1100
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1101
// Die immediately, no exit hook, no abort hook, no cleanup.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1102
void os::die() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1103
  // _exit() on BsdThreads only kills current thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1104
  ::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1105
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1106
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1107
// unused on bsd for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1108
void os::set_error_file(const char *logfile) {}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1109
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1110
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1111
// This method is a copy of JDK's sysGetLastErrorString
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1112
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1113
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1114
size_t os::lasterror(char *buf, size_t len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1115
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1116
  if (errno == 0)  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1117
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1118
  const char *s = ::strerror(errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1119
  size_t n = ::strlen(s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1120
  if (n >= len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1121
    n = len - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1122
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1123
  ::strncpy(buf, s, n);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1124
  buf[n] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1125
  return n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1126
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1127
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
  1128
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
  1129
#ifdef __APPLE__
19531
52a6c996331d 8022808: Kitchensink hangs on macos
sla
parents: 18683
diff changeset
  1130
  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
  1131
#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
  1132
  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
  1133
#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
  1134
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1135
int os::current_process_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1136
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1137
  // Under the old bsd thread library, bsd gives each thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1138
  // its own process id. Because of this each thread will return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1139
  // a different pid if this method were to return the result
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1140
  // of getpid(2). Bsd provides no api that returns the pid
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1141
  // of the launcher thread for the vm. This implementation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1142
  // returns a unique pid, the pid of the launcher thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1143
  // that starts the vm 'process'.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1144
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1145
  // Under the NPTL, getpid() returns the same pid as the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1146
  // launcher thread rather than a unique pid per thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1147
  // Use gettid() if you want the old pre NPTL behaviour.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1148
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1149
  // if you are looking for the result of a call to getpid() that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1150
  // returns a unique pid for the calling thread, then look at the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1151
  // OSThread::thread_id() method in osThread_bsd.hpp file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1152
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1153
  return (int)(_initial_pid ? _initial_pid : getpid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1154
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1155
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1156
// DLL functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1157
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1158
#define JNI_LIB_PREFIX "lib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1159
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1160
#define JNI_LIB_SUFFIX ".dylib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1161
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1162
#define JNI_LIB_SUFFIX ".so"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1163
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1164
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1165
const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1166
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1167
// This must be hard coded because it's the system's temporary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1168
// directory not the java application's temp directory, ala java.io.tmpdir.
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1169
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1170
// macosx has a secure per-user temporary directory
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1171
char temp_path_storage[PATH_MAX];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1172
const char* os::get_temp_directory() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1173
  static char *temp_path = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1174
  if (temp_path == NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1175
    int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1176
    if (pathSize == 0 || pathSize > PATH_MAX) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1177
      strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1178
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1179
    temp_path = temp_path_storage;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1180
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1181
  return temp_path;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1182
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1183
#else /* __APPLE__ */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1184
const char* os::get_temp_directory() { return "/tmp"; }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1185
#endif /* __APPLE__ */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1186
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1187
static bool file_exists(const char* filename) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1188
  struct stat statbuf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1189
  if (filename == NULL || strlen(filename) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1190
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1191
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1192
  return os::stat(filename, &statbuf) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1193
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1194
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1195
bool os::dll_build_name(char* buffer, size_t buflen,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1196
                        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
  1197
  bool retval = false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1198
  // Copied from libhpi
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1199
  const size_t pnamelen = pname ? strlen(pname) : 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1200
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1201
  // Return error on buffer overflow.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1202
  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
  1203
    return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1204
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1205
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1206
  if (pnamelen == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1207
    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
  1208
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1209
  } else if (strchr(pname, *os::path_separator()) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1210
    int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1211
    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
  1212
    if (pelements == NULL) {
16672
dcubed
parents: 16605 16670
diff changeset
  1213
      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
  1214
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1215
    for (int i = 0 ; i < n ; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1216
      // Really shouldn't be NULL, but check can't hurt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1217
      if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1218
        continue; // skip the empty path values
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1219
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1220
      snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1221
          pelements[i], fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1222
      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
  1223
        retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1224
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1225
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1226
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1227
    // release the storage
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1228
    for (int i = 0 ; i < n ; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1229
      if (pelements[i] != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1230
        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1231
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1232
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1233
    if (pelements != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1234
      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1235
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1236
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1237
    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
  1238
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1239
  }
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1240
  return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1241
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1242
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1243
// check if addr is inside libjvm.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1244
bool os::address_is_in_vm(address addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1245
  static address libjvm_base_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1246
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1247
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1248
  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
  1249
    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
  1250
      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
  1251
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1252
    assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1253
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1254
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1255
  if (dladdr((void *)addr, &dlinfo) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1256
    if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1257
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1258
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1259
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1260
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1261
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1262
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1263
#define MACH_MAXSYMLEN 256
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1264
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1265
bool os::dll_address_to_function_name(address addr, char *buf,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1266
                                      int buflen, int *offset) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1267
  // 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
  1268
  assert(buf != NULL, "sanity check");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1269
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1270
  Dl_info dlinfo;
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1271
  char localbuf[MACH_MAXSYMLEN];
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1272
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1273
  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
  1274
    // 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
  1275
    if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1276
      if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1277
        jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1278
      }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1279
      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
  1280
      return true;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1281
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1282
    // 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
  1283
    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
  1284
      if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1285
                          buf, buflen, offset, dlinfo.dli_fname)) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1286
         return true;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1287
      }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1288
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1289
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1290
    // Handle non-dynamic manually:
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1291
    if (dlinfo.dli_fbase != NULL &&
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1292
        Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1293
                        dlinfo.dli_fbase)) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1294
      if (!Decoder::demangle(localbuf, buf, buflen)) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1295
        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
  1296
      }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1297
      return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1298
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1299
  }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1300
  buf[0] = '\0';
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1301
  if (offset != NULL) *offset = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1302
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1303
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1304
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1305
// ported from solaris version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1306
bool os::dll_address_to_library_name(address addr, char* buf,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1307
                                     int buflen, int* offset) {
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1308
  // 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
  1309
  assert(buf != NULL, "sanity check");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1310
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1311
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1312
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1313
  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
  1314
    if (dlinfo.dli_fname != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1315
      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
  1316
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1317
    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
  1318
      *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
  1319
    }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1320
    return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1321
  }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1322
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1323
  buf[0] = '\0';
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1324
  if (offset) *offset = -1;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1325
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1326
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1327
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1328
// Loads .dll/.so and
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1329
// 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
  1330
// same architecture as Hotspot is running on
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1331
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1332
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1333
void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1334
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1335
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1336
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1337
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1338
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1339
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1340
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1341
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1342
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1343
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1344
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1345
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1346
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1347
void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1348
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1349
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1350
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1351
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1352
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1353
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1354
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1355
  Elf32_Ehdr elf_head;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1356
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1357
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1358
  // It may or may not be overwritten below
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1359
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1360
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1361
  int diag_msg_max_length=ebuflen-strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1362
  char* diag_msg_buf=ebuf+strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1363
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1364
  if (diag_msg_max_length==0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1365
    // No more space in ebuf for additional diagnostics message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1366
    return NULL;
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1370
  int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1371
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1372
  if (file_descriptor < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1373
    // Can't open library, report dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1374
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1375
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1376
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1377
  bool failed_to_read_elf_head=
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1378
    (sizeof(elf_head)!=
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1379
        (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1380
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1381
  ::close(file_descriptor);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1382
  if (failed_to_read_elf_head) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1383
    // file i/o error - report dlerror() msg
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1384
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1385
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1386
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1387
  typedef struct {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1388
    Elf32_Half  code;         // Actual value as defined in elf.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1389
    Elf32_Half  compat_class; // Compatibility of archs at VM's sense
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1390
    char        elf_class;    // 32 or 64 bit
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1391
    char        endianess;    // MSB or LSB
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1392
    char*       name;         // String representation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1393
  } arch_t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1394
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1395
  #ifndef EM_486
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1396
  #define EM_486          6               /* Intel 80486 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1397
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1398
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1399
  #ifndef EM_MIPS_RS3_LE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1400
  #define EM_MIPS_RS3_LE  10              /* MIPS */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1401
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1402
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1403
  #ifndef EM_PPC64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1404
  #define EM_PPC64        21              /* PowerPC64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1405
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1406
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1407
  #ifndef EM_S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1408
  #define EM_S390         22              /* IBM System/390 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1409
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1410
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1411
  #ifndef EM_IA_64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1412
  #define EM_IA_64        50              /* HP/Intel IA-64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1413
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1414
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1415
  #ifndef EM_X86_64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1416
  #define EM_X86_64       62              /* AMD x86-64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1417
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1418
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1419
  static const arch_t arch_array[]={
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1420
    {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1421
    {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1422
    {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1423
    {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1424
    {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1425
    {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1426
    {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1427
    {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1428
    {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1429
    {EM_ARM,         EM_ARM,     ELFCLASS32,   ELFDATA2LSB, (char*)"ARM"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1430
    {EM_S390,        EM_S390,    ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1431
    {EM_ALPHA,       EM_ALPHA,   ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1432
    {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1433
    {EM_MIPS,        EM_MIPS,    ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1434
    {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1435
    {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1436
  };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1437
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1438
  #if  (defined IA32)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1439
    static  Elf32_Half running_arch_code=EM_386;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1440
  #elif   (defined AMD64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1441
    static  Elf32_Half running_arch_code=EM_X86_64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1442
  #elif  (defined IA64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1443
    static  Elf32_Half running_arch_code=EM_IA_64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1444
  #elif  (defined __sparc) && (defined _LP64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1445
    static  Elf32_Half running_arch_code=EM_SPARCV9;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1446
  #elif  (defined __sparc) && (!defined _LP64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1447
    static  Elf32_Half running_arch_code=EM_SPARC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1448
  #elif  (defined __powerpc64__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1449
    static  Elf32_Half running_arch_code=EM_PPC64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1450
  #elif  (defined __powerpc__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1451
    static  Elf32_Half running_arch_code=EM_PPC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1452
  #elif  (defined ARM)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1453
    static  Elf32_Half running_arch_code=EM_ARM;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1454
  #elif  (defined S390)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1455
    static  Elf32_Half running_arch_code=EM_S390;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1456
  #elif  (defined ALPHA)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1457
    static  Elf32_Half running_arch_code=EM_ALPHA;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1458
  #elif  (defined MIPSEL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1459
    static  Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1460
  #elif  (defined PARISC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1461
    static  Elf32_Half running_arch_code=EM_PARISC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1462
  #elif  (defined MIPS)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1463
    static  Elf32_Half running_arch_code=EM_MIPS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1464
  #elif  (defined M68K)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1465
    static  Elf32_Half running_arch_code=EM_68K;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1466
  #else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1467
    #error Method os::dll_load requires that one of following is defined:\
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1468
         IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1469
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1470
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1471
  // Identify compatability class for VM's architecture and library's architecture
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1472
  // Obtain string descriptions for architectures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1474
  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
  1475
  int running_arch_index=-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1476
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1477
  for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1478
    if (running_arch_code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1479
      running_arch_index    = i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1480
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1481
    if (lib_arch.code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1482
      lib_arch.compat_class = arch_array[i].compat_class;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1483
      lib_arch.name         = arch_array[i].name;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1484
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1485
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1486
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1487
  assert(running_arch_index != -1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1488
    "Didn't find running architecture code (running_arch_code) in arch_array");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1489
  if (running_arch_index == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1490
    // Even though running architecture detection failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1491
    // we may still continue with reporting dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1492
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1493
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1494
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1495
  if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1496
    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1497
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1498
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1499
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1500
#ifndef S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1501
  if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1502
    ::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
  1503
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1504
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1505
#endif // !S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1506
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1507
  if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1508
    if ( lib_arch.name!=NULL ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1509
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1510
        " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1511
        lib_arch.name, arch_array[running_arch_index].name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1512
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1513
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1514
      " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1515
        lib_arch.code,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1516
        arch_array[running_arch_index].name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1517
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1518
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1519
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1520
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1521
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1522
#endif /* !__APPLE__ */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1523
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1524
// XXX: Do we need a lock around this as per Linux?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1525
void* os::dll_lookup(void* handle, const char* name) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1526
  return dlsym(handle, name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1527
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1528
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1529
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1530
static bool _print_ascii_file(const char* filename, outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1531
  int fd = ::open(filename, O_RDONLY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1532
  if (fd == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1533
     return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1534
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1536
  char buf[32];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1537
  int bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1538
  while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1539
    st->print_raw(buf, bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1540
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1541
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1542
  ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1543
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1544
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1545
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1546
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1547
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
  1548
  st->print_cr("Dynamic libraries:");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1549
#ifdef RTLD_DI_LINKMAP
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1550
  Dl_info dli;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1551
  void *handle;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1552
  Link_map *map;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1553
  Link_map *p;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1554
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1555
  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
  1556
      dli.dli_fname == NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1557
    st->print_cr("Error: Cannot print dynamic libraries.");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1558
    return;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1559
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1560
  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
  1561
  if (handle == NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1562
    st->print_cr("Error: Cannot print dynamic libraries.");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1563
    return;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1564
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1565
  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
  1566
  if (map == NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1567
    st->print_cr("Error: Cannot print dynamic libraries.");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1568
    return;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1569
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1570
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1571
  while (map->l_prev != NULL)
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1572
    map = map->l_prev;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1573
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1574
  while (map != NULL) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1575
    st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1576
    map = map->l_next;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1577
  }
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1578
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1579
  dlclose(handle);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1580
#elif defined(__APPLE__)
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1581
  uint32_t count;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1582
  uint32_t i;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1583
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1584
  count = _dyld_image_count();
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1585
  for (i = 1; i < count; i++) {
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1586
    const char *name = _dyld_get_image_name(i);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1587
    intptr_t slide = _dyld_get_image_vmaddr_slide(i);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1588
    st->print_cr(PTR_FORMAT " \t%s", slide, name);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1589
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1590
#else
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1591
  st->print_cr("Error: Cannot print dynamic libraries.");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1592
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1593
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1594
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1595
void os::print_os_info_brief(outputStream* st) {
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1596
  st->print("Bsd");
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1597
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1598
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1599
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1600
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1601
void os::print_os_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1602
  st->print("OS:");
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1603
  st->print("Bsd");
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1604
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1605
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1606
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1607
  os::Posix::print_rlimit_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1608
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1609
  os::Posix::print_load_average(st);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1610
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1611
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1612
void os::pd_print_cpu_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1613
  // Nothing to do for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1614
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1615
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1616
void os::print_memory_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1617
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1618
  st->print("Memory:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1619
  st->print(" %dk page", os::vm_page_size()>>10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1620
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1621
  st->print(", physical " UINT64_FORMAT "k",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1622
            os::physical_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1623
  st->print("(" UINT64_FORMAT "k free)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1624
            os::available_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1625
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1626
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1627
  // meminfo
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1628
  st->print("\n/proc/meminfo:\n");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1629
  _print_ascii_file("/proc/meminfo", st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1630
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1631
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1632
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1633
// Taken from /usr/include/bits/siginfo.h  Supposed to be architecture specific
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1634
// but they're the same for all the bsd arch that we support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1635
// and they're the same for solaris but there's no common place to put this.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1636
const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1637
                          "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1638
                          "ILL_COPROC", "ILL_BADSTK" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1639
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1640
const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1641
                          "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1642
                          "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1643
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1644
const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1645
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1646
const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1647
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1648
void os::print_siginfo(outputStream* st, void* siginfo) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1649
  st->print("siginfo:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1650
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1651
  const int buflen = 100;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1652
  char buf[buflen];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1653
  siginfo_t *si = (siginfo_t*)siginfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1654
  st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1655
  if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1656
    st->print("si_errno=%s", buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1657
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1658
    st->print("si_errno=%d", si->si_errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1659
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1660
  const int c = si->si_code;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1661
  assert(c > 0, "unexpected si_code");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1662
  switch (si->si_signo) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1663
  case SIGILL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1664
    st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1665
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1666
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1667
  case SIGFPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1668
    st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1669
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1670
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1671
  case SIGSEGV:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1672
    st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1673
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1674
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1675
  case SIGBUS:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1676
    st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1677
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1678
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1679
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1680
    st->print(", si_code=%d", si->si_code);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1681
    // no si_addr
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1682
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1683
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1684
  if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1685
      UseSharedSpaces) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1686
    FileMapInfo* mapinfo = FileMapInfo::current_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1687
    if (mapinfo->is_in_shared_space(si->si_addr)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1688
      st->print("\n\nError accessing class data sharing archive."   \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1689
                " Mapped file inaccessible during execution, "      \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1690
                " possible disk/network problem.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1691
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1692
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1693
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1694
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1695
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1696
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1697
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1698
                                 char* buf, size_t buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1699
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1700
void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1701
  st->print_cr("Signal Handlers:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1702
  print_signal_handler(st, SIGSEGV, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1703
  print_signal_handler(st, SIGBUS , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1704
  print_signal_handler(st, SIGFPE , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1705
  print_signal_handler(st, SIGPIPE, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1706
  print_signal_handler(st, SIGXFSZ, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1707
  print_signal_handler(st, SIGILL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1708
  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1709
  print_signal_handler(st, SR_signum, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1710
  print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1711
  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1712
  print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1713
  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1714
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1715
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1716
static char saved_jvm_path[MAXPATHLEN] = {0};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1717
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1718
// Find the full path to the current module, libjvm
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1719
void os::jvm_path(char *buf, jint buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1720
  // Error checking.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1721
  if (buflen < MAXPATHLEN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1722
    assert(false, "must use a large-enough buffer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1723
    buf[0] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1724
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1725
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1726
  // Lazy resolve the path to current module.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1727
  if (saved_jvm_path[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1728
    strcpy(buf, saved_jvm_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1729
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1730
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1732
  char dli_fname[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1733
  bool ret = dll_address_to_library_name(
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1734
                CAST_FROM_FN_PTR(address, os::jvm_path),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1735
                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
  1736
  assert(ret, "cannot locate libjvm");
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1737
  char *rp = NULL;
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1738
  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
  1739
    rp = realpath(dli_fname, buf);
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  1740
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1741
  if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1742
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1743
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1744
  if (Arguments::created_by_gamma_launcher()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1745
    // Support for the gamma launcher.  Typical value for buf is
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1746
    // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm".  If "/jre/lib/" appears at
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1747
    // the right place in the string, then assume we are installed in a JDK and
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1748
    // we're done.  Otherwise, check for a JAVA_HOME environment variable and
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1749
    // construct a path to the JVM being overridden.
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1750
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1751
    const char *p = buf + strlen(buf) - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1752
    for (int count = 0; p > buf && count < 5; ++count) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1753
      for (--p; p > buf && *p != '/'; --p)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1754
        /* empty */ ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1755
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1756
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1757
    if (strncmp(p, "/jre/lib/", 9) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1758
      // Look for JAVA_HOME in the environment.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1759
      char* java_home_var = ::getenv("JAVA_HOME");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1760
      if (java_home_var != NULL && java_home_var[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1761
        char* jrelib_p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1762
        int len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1763
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1764
        // Check the current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1765
        p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1766
        assert(strstr(p, "/libjvm") == p, "invalid library name");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1767
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1768
        rp = realpath(java_home_var, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1769
        if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1770
          return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1771
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1772
        // determine if this is a legacy image or modules image
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1773
        // modules image doesn't have "jre" subdirectory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1774
        len = strlen(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1775
        jrelib_p = buf + len;
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1776
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1777
        // Add the appropriate library subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1778
        snprintf(jrelib_p, buflen-len, "/jre/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1779
        if (0 != access(buf, F_OK)) {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1780
          snprintf(jrelib_p, buflen-len, "/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1781
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1782
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1783
        // Add the appropriate client or server subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1784
        len = strlen(buf);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1785
        jrelib_p = buf + len;
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1786
        snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1787
        if (0 != access(buf, F_OK)) {
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1788
          snprintf(jrelib_p, buflen-len, "");
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1789
        }
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1790
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1791
        // 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
  1792
        // to complete the path to JVM being overridden.  Otherwise fallback
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1793
        // to the path to the current library.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1794
        if (0 == access(buf, F_OK)) {
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1795
          // Use current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1796
          len = strlen(buf);
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1797
          snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1798
        } else {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1799
          // Fall back to path of current library
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1800
          rp = realpath(dli_fname, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1801
          if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1802
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1803
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1804
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1805
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1806
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1807
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1808
  strcpy(saved_jvm_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1809
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1810
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1811
void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1812
  // no prefix required, not even "_"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1813
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1814
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1815
void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1816
  // no suffix required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1817
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1818
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1819
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1820
// sun.misc.Signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1821
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1822
static volatile jint sigint_count = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1823
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1824
static void
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1825
UserHandler(int sig, void *siginfo, void *context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1826
  // 4511530 - sem_post is serialized and handled by the manager thread. When
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1827
  // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1828
  // don't want to flood the manager thread with sem_post requests.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1829
  if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1830
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1831
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1832
  // Ctrl-C is pressed during error reporting, likely because the error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1833
  // handler fails to abort. Let VM die immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1834
  if (sig == SIGINT && is_error_reported()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1835
     os::die();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1836
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1838
  os::signal_notify(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1839
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1840
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1841
void* os::user_handler() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1842
  return CAST_FROM_FN_PTR(void*, UserHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1843
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1844
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1845
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1846
  typedef void (*sa_handler_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1847
  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1848
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1849
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1850
void* os::signal(int signal_number, void* handler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1851
  struct sigaction sigAct, oldSigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1852
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1853
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1854
  sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1855
  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1856
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1857
  if (sigaction(signal_number, &sigAct, &oldSigAct)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1858
    // -1 means registration failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1859
    return (void *)-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1860
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1861
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1862
  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1863
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1864
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1865
void os::signal_raise(int signal_number) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1866
  ::raise(signal_number);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1867
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1868
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1869
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1870
 * The following code is moved from os.cpp for making this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1871
 * code platform specific, which it is by its very nature.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1872
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1873
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1874
// Will be modified when max signal is changed to be dynamic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1875
int os::sigexitnum_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1876
  return NSIG;
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
// a counter for each possible signal value
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1880
static volatile jint pending_signals[NSIG+1] = { 0 };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1881
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1882
// Bsd(POSIX) specific hand shaking semaphore.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1883
#ifdef __APPLE__
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1884
typedef semaphore_t os_semaphore_t;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1885
#define SEM_INIT(sem, value)    semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1886
#define SEM_WAIT(sem)           semaphore_wait(sem)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1887
#define SEM_POST(sem)           semaphore_signal(sem)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1888
#define SEM_DESTROY(sem)        semaphore_destroy(mach_task_self(), sem)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1889
#else
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1890
typedef sem_t os_semaphore_t;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1891
#define SEM_INIT(sem, value)    sem_init(&sem, 0, value)
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1892
#define SEM_WAIT(sem)           sem_wait(&sem)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1893
#define SEM_POST(sem)           sem_post(&sem)
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1894
#define SEM_DESTROY(sem)        sem_destroy(&sem)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1895
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1896
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1897
class Semaphore : public StackObj {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1898
  public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1899
    Semaphore();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1900
    ~Semaphore();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1901
    void signal();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1902
    void wait();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1903
    bool trywait();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1904
    bool timedwait(unsigned int sec, int nsec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1905
  private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1906
    jlong currenttime() const;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1907
    semaphore_t _semaphore;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1908
};
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1909
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1910
Semaphore::Semaphore() : _semaphore(0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1911
  SEM_INIT(_semaphore, 0);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1912
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1913
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1914
Semaphore::~Semaphore() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1915
  SEM_DESTROY(_semaphore);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1916
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1917
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1918
void Semaphore::signal() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1919
  SEM_POST(_semaphore);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1920
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1921
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1922
void Semaphore::wait() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1923
  SEM_WAIT(_semaphore);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1924
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1925
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1926
jlong Semaphore::currenttime() const {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1927
    struct timeval tv;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1928
    gettimeofday(&tv, NULL);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1929
    return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1930
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1931
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1932
#ifdef __APPLE__
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1933
bool Semaphore::trywait() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1934
  return timedwait(0, 0);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1935
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1936
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1937
bool Semaphore::timedwait(unsigned int sec, int nsec) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1938
  kern_return_t kr = KERN_ABORTED;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1939
  mach_timespec_t waitspec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1940
  waitspec.tv_sec = sec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1941
  waitspec.tv_nsec = nsec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1942
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1943
  jlong starttime = currenttime();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1944
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1945
  kr = semaphore_timedwait(_semaphore, waitspec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1946
  while (kr == KERN_ABORTED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1947
    jlong totalwait = (sec * NANOSECS_PER_SEC) + nsec;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1948
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1949
    jlong current = currenttime();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1950
    jlong passedtime = current - starttime;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1951
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1952
    if (passedtime >= totalwait) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1953
      waitspec.tv_sec = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1954
      waitspec.tv_nsec = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1955
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1956
      jlong waittime = totalwait - (current - starttime);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1957
      waitspec.tv_sec = waittime / NANOSECS_PER_SEC;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1958
      waitspec.tv_nsec = waittime % NANOSECS_PER_SEC;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1959
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1960
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1961
    kr = semaphore_timedwait(_semaphore, waitspec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1962
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1963
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1964
  return kr == KERN_SUCCESS;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1965
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1966
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1967
#else
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1968
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1969
bool Semaphore::trywait() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1970
  return sem_trywait(&_semaphore) == 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1971
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1972
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1973
bool Semaphore::timedwait(unsigned int sec, int nsec) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1974
  struct timespec ts;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1975
  jlong endtime = unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1976
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1977
  while (1) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1978
    int result = sem_timedwait(&_semaphore, &ts);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1979
    if (result == 0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1980
      return true;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1981
    } else if (errno == EINTR) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1982
      continue;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1983
    } else if (errno == ETIMEDOUT) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1984
      return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1985
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1986
      return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1987
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1988
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1989
}
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
#endif // __APPLE__
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1992
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1993
static os_semaphore_t sig_sem;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1994
static Semaphore sr_semaphore;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  1995
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1996
void os::signal_init_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1997
  // Initialize signal structures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1998
  ::memset((void*)pending_signals, 0, sizeof(pending_signals));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1999
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2000
  // Initialize signal semaphore
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2001
  ::SEM_INIT(sig_sem, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2002
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2003
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2004
void os::signal_notify(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2005
  Atomic::inc(&pending_signals[sig]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2006
  ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2007
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2008
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2009
static int check_pending_signals(bool wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2010
  Atomic::store(0, &sigint_count);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2011
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2012
    for (int i = 0; i < NSIG + 1; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2013
      jint n = pending_signals[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2014
      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2015
        return i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2016
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2017
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2018
    if (!wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2019
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2020
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2021
    JavaThread *thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2022
    ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2023
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2024
    bool threadIsSuspended;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2025
    do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2026
      thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2027
      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2028
      ::SEM_WAIT(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2029
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2030
      // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2031
      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2032
      if (threadIsSuspended) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2033
        //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2034
        // The semaphore has been incremented, but while we were waiting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2035
        // another thread suspended us. We don't want to continue running
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2036
        // while suspended because that would surprise the thread that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2037
        // suspended us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2038
        //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2039
        ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2040
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2041
        thread->java_suspend_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2042
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2043
    } while (threadIsSuspended);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2044
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2045
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2046
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2047
int os::signal_lookup() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2048
  return check_pending_signals(false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2049
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2050
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2051
int os::signal_wait() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2052
  return check_pending_signals(true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2053
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2054
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2055
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2056
// Virtual Memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2057
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2058
int os::vm_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2059
  // Seems redundant as all get out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2060
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2061
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2062
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2063
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2064
// Solaris allocates memory by pages.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2065
int os::vm_allocation_granularity() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2066
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2067
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2068
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2069
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2070
// Rationale behind this function:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2071
//  current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2072
//  mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2073
//  samples for JITted code. Here we create private executable mapping over the code cache
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2074
//  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
  2075
//  info for the reporting script by storing timestamp and location of symbol
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2076
void bsd_wrap_code(char* base, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2077
  static volatile jint cnt = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2078
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2079
  if (!UseOprofile) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2080
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2081
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2082
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2083
  char buf[PATH_MAX + 1];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2084
  int num = Atomic::add(1, &cnt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2085
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2086
  snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2087
           os::get_temp_directory(), os::current_process_id(), num);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2088
  unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2089
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2090
  int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2091
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2092
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2093
    off_t rv = ::lseek(fd, size-2, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2094
    if (rv != (off_t)-1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2095
      if (::write(fd, "", 1) == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2096
        mmap(base, size,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2097
             PROT_READ|PROT_WRITE|PROT_EXEC,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2098
             MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2099
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2100
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2101
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2102
    unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2103
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2104
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2105
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2106
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
  2107
                                    int err) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2108
  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
  2109
          ", %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
  2110
          strerror(err), err);
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2111
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2112
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2113
// NOTE: Bsd kernel does not really reserve the pages for us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2114
//       All it does is to check if there are enough free pages
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2115
//       left at the time of mmap(). This could be a potential
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2116
//       problem.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2117
bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2118
  int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2119
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2120
  // 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
  2121
  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
  2122
    return true;
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2123
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2124
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2125
  uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2126
                                   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
  2127
  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
  2128
    return true;
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2129
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2130
#endif
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2131
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2132
  // 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
  2133
  // 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
  2134
  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
  2135
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2136
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2137
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2138
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2139
bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2140
                       bool exec) {
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2141
  // 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
  2142
  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
  2143
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2144
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2145
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
  2146
                                  const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2147
  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
  2148
  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
  2149
    // 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
  2150
    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
  2151
    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
  2152
  }
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2153
}
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2154
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2155
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
  2156
                                  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
  2157
                                  const char* mesg) {
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  2158
  // 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
  2159
  pd_commit_memory_or_exit(addr, size, exec, mesg);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2160
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2161
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2162
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
  2163
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2164
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2165
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
  2166
  ::madvise(addr, bytes, MADV_DONTNEED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2167
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2168
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2169
void os::numa_make_global(char *addr, size_t bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2170
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2171
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2172
void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
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
bool os::numa_topology_changed()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2176
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2177
size_t os::numa_get_groups_num() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2178
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2179
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2180
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2181
int os::numa_get_group_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2182
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2183
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2184
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2185
size_t os::numa_get_leaf_groups(int *ids, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2186
  if (size > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2187
    ids[0] = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2188
    return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2189
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2190
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2191
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2192
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2193
bool os::get_page_info(char *start, page_info* info) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2194
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2195
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2196
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2197
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
  2198
  return end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2199
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2200
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2201
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2202
bool os::pd_uncommit_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2203
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2204
  // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2205
  return ::mprotect(addr, size, PROT_NONE) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2206
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2207
  uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2208
                MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2209
  return res  != (uintptr_t) MAP_FAILED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2210
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2211
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2212
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2213
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
  2214
  return os::commit_memory(addr, size, !ExecMem);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2215
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2216
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2217
// If this is a growable mapping, remove the guard pages entirely by
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2218
// munmap()ping them.  If not, just call uncommit_memory().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2219
bool os::remove_stack_guard_pages(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2220
  return os::uncommit_memory(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2221
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2222
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2223
static address _highest_vm_reserved_address = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2224
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2225
// If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2226
// at 'requested_addr'. If there are existing memory mappings at the same
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2227
// location, however, they will be overwritten. If 'fixed' is false,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2228
// 'requested_addr' is only treated as a hint, the return value may or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2229
// may not start from the requested address. Unlike Bsd mmap(), this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2230
// function returns NULL to indicate failure.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2231
static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2232
  char * addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2233
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2234
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2235
  flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2236
  if (fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2237
    assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2238
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2239
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2240
17083
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2241
  // 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
  2242
  // touch an uncommitted page. Otherwise, the read/write might
14000894ef39 8012015: Use PROT_NONE when reserving memory
mikael
parents: 16672
diff changeset
  2243
  // 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
  2244
  addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2245
                       flags, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2246
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2247
  if (addr != MAP_FAILED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2248
    // anon_mmap() should only get called during VM initialization,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2249
    // don't need lock (actually we can skip locking even it can be called
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2250
    // from multiple threads, because _highest_vm_reserved_address is just a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2251
    // hint about the upper limit of non-stack memory regions.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2252
    if ((address)addr + bytes > _highest_vm_reserved_address) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2253
      _highest_vm_reserved_address = (address)addr + bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2254
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2255
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2256
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2257
  return addr == MAP_FAILED ? NULL : addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2258
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2259
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2260
// Don't update _highest_vm_reserved_address, because there might be memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2261
// regions above addr + size. If so, releasing a memory region only creates
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2262
// a hole in the address space, it doesn't help prevent heap-stack collision.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2263
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2264
static int anon_munmap(char * addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2265
  return ::munmap(addr, size) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2266
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2267
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2268
char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2269
                         size_t alignment_hint) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2270
  return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2271
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2272
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2273
bool os::pd_release_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2274
  return anon_munmap(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2275
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2276
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2277
static bool bsd_mprotect(char* addr, size_t size, int prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2278
  // Bsd wants the mprotect address argument to be page aligned.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2279
  char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2280
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2281
  // According to SUSv3, mprotect() should only be used with mappings
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2282
  // established by mmap(), and mmap() always maps whole pages. Unaligned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2283
  // 'addr' likely indicates problem in the VM (e.g. trying to change
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2284
  // protection of malloc'ed or statically allocated memory). Check the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2285
  // caller if you hit this assert.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2286
  assert(addr == bottom, "sanity check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2287
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2288
  size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2289
  return ::mprotect(bottom, size, prot) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2290
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2291
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2292
// Set protections specified
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2293
bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2294
                        bool is_committed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2295
  unsigned int p = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2296
  switch (prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2297
  case MEM_PROT_NONE: p = PROT_NONE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2298
  case MEM_PROT_READ: p = PROT_READ; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2299
  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2300
  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2301
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2302
    ShouldNotReachHere();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2303
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2304
  // is_committed is unused.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2305
  return bsd_mprotect(addr, bytes, p);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2306
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2307
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2308
bool os::guard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2309
  return bsd_mprotect(addr, size, PROT_NONE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2310
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2311
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2312
bool os::unguard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2313
  return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2314
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2315
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2316
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
  2317
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2318
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2319
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2320
// Large page support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2321
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2322
static size_t _large_page_size = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2323
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2324
void os::large_page_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2325
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2326
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2327
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  2328
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
  2329
  fatal("This code is not used or maintained.");
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  2330
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2331
  // "exec" is passed in but not used.  Creating the shared image for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2332
  // the code cache doesn't have an SHM_X executable permission to check.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2333
  assert(UseLargePages && UseSHM, "only for SHM large pages");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2334
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2335
  key_t key = IPC_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2336
  char *addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2337
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2338
  bool warn_on_failure = UseLargePages &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2339
                        (!FLAG_IS_DEFAULT(UseLargePages) ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2340
                         !FLAG_IS_DEFAULT(LargePageSizeInBytes)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2341
                        );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2342
  char msg[128];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2343
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2344
  // Create a large shared memory region to attach to based on size.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2345
  // Currently, size is the total size of the heap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2346
  int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2347
  if (shmid == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2348
     // Possible reasons for shmget failure:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2349
     // 1. shmmax is too small for Java heap.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2350
     //    > check shmmax value: cat /proc/sys/kernel/shmmax
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2351
     //    > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2352
     // 2. not enough large page memory.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2353
     //    > check available large pages: cat /proc/meminfo
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2354
     //    > increase amount of large pages:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2355
     //          echo new_value > /proc/sys/vm/nr_hugepages
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2356
     //      Note 1: different Bsd may use different name for this property,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2357
     //            e.g. on Redhat AS-3 it is "hugetlb_pool".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2358
     //      Note 2: it's possible there's enough physical memory available but
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2359
     //            they are so fragmented after a long run that they can't
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2360
     //            coalesce into large pages. Try to reserve large pages when
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2361
     //            the system is still "fresh".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2362
     if (warn_on_failure) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2363
       jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2364
       warning(msg);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2365
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2366
     return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2367
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2368
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2369
  // attach to the region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2370
  addr = (char*)shmat(shmid, req_addr, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2371
  int err = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2372
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2373
  // Remove shmid. If shmat() is successful, the actual shared memory segment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2374
  // will be deleted when it's detached by shmdt() or when the process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2375
  // terminates. If shmat() is not successful this will remove the shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2376
  // segment immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2377
  shmctl(shmid, IPC_RMID, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2378
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2379
  if ((intptr_t)addr == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2380
     if (warn_on_failure) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2381
       jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2382
       warning(msg);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2383
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2384
     return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2385
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2386
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2387
  // The memory is committed
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  2388
  MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2389
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2390
  return addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2391
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2392
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2393
bool os::release_memory_special(char* base, size_t bytes) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  2394
  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2395
  // detaching the SHM segment will also delete it, see reserve_memory_special()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2396
  int rslt = shmdt(base);
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2397
  if (rslt == 0) {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  2398
    tkr.record((address)base, bytes);
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2399
    return true;
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2400
  } else {
18086
f44cf213a775 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 18069
diff changeset
  2401
    tkr.discard();
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2402
    return false;
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2403
  }
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2404
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2405
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2406
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2407
size_t os::large_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2408
  return _large_page_size;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2409
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2410
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2411
// HugeTLBFS allows application to commit large page memory on demand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2412
// with SysV SHM the entire memory region must be allocated as shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2413
// memory.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2414
bool os::can_commit_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2415
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2416
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2417
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2418
bool os::can_execute_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2419
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2420
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2421
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2422
// Reserve memory at an arbitrary address, only if that area is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2423
// available (and not reserved for something else).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2424
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2425
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2426
  const int max_tries = 10;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2427
  char* base[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2428
  size_t size[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2429
  const size_t gap = 0x000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2430
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2431
  // Assert only that the size is a multiple of the page size, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2432
  // that's all that mmap requires, and since that's all we really know
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2433
  // about at this low abstraction level.  If we need higher alignment,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2434
  // we can either pass an alignment to this method or verify alignment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2435
  // in one of the methods further up the call chain.  See bug 5044738.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2436
  assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2437
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2438
  // Repeatedly allocate blocks until the block is allocated at the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2439
  // right spot. Give up after max_tries. Note that reserve_memory() will
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2440
  // automatically update _highest_vm_reserved_address if the call is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2441
  // successful. The variable tracks the highest memory address every reserved
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2442
  // by JVM. It is used to detect heap-stack collision if running with
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2443
  // fixed-stack BsdThreads. Because here we may attempt to reserve more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2444
  // space than needed, it could confuse the collision detecting code. To
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2445
  // solve the problem, save current _highest_vm_reserved_address and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2446
  // calculate the correct value before return.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2447
  address old_highest = _highest_vm_reserved_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2448
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2449
  // 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
  2450
  // if kernel honors the hint then we can return immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2451
  char * addr = anon_mmap(requested_addr, bytes, false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2452
  if (addr == requested_addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2453
     return requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2454
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2455
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2456
  if (addr != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2457
     // mmap() is successful but it fails to reserve at the requested address
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2458
     anon_munmap(addr, bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2459
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2460
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2461
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2462
  for (i = 0; i < max_tries; ++i) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2463
    base[i] = reserve_memory(bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2464
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2465
    if (base[i] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2466
      // Is this the block we wanted?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2467
      if (base[i] == requested_addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2468
        size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2469
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2470
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2471
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2472
      // Does this overlap the block we wanted? Give back the overlapped
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2473
      // parts and try again.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2474
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2475
      size_t top_overlap = requested_addr + (bytes + gap) - base[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2476
      if (top_overlap >= 0 && top_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2477
        unmap_memory(base[i], top_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2478
        base[i] += top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2479
        size[i] = bytes - top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2480
      } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2481
        size_t bottom_overlap = base[i] + bytes - requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2482
        if (bottom_overlap >= 0 && bottom_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2483
          unmap_memory(requested_addr, bottom_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2484
          size[i] = bytes - bottom_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2485
        } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2486
          size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2487
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2488
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2489
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2490
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2491
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2492
  // Give back the unused reserved pieces.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2493
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2494
  for (int j = 0; j < i; ++j) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2495
    if (base[j] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2496
      unmap_memory(base[j], size[j]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2497
    }
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 (i < max_tries) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2501
    _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2502
    return requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2503
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2504
    _highest_vm_reserved_address = old_highest;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2505
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2506
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2507
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2508
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2509
size_t os::read(int fd, void *buf, unsigned int nBytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2510
  RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2511
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2513
// TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2514
// Solaris uses poll(), bsd uses park().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2515
// Poll() is likely a better choice, assuming that Thread.interrupt()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2516
// generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2517
// SIGSEGV, see 4355769.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2518
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2519
int os::sleep(Thread* thread, jlong millis, bool interruptible) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2520
  assert(thread == Thread::current(),  "thread consistency check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2521
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2522
  ParkEvent * const slp = thread->_SleepEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2523
  slp->reset() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2524
  OrderAccess::fence() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2526
  if (interruptible) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2527
    jlong prevtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2528
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2529
    for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2530
      if (os::is_interrupted(thread, true)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2531
        return OS_INTRPT;
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
      jlong newtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2536
      if (newtime - prevtime < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2537
        // time moving backwards, should only happen if no monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2538
        // not a guarantee() because JVM should not abort on kernel/glibc bugs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2539
        assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2540
      } else {
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11161
diff changeset
  2541
        millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
10565
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(millis <= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2545
        return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2546
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2547
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2548
      prevtime = newtime;
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
        assert(thread->is_Java_thread(), "sanity check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2552
        JavaThread *jt = (JavaThread *) thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2553
        ThreadBlockInVM tbivm(jt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2554
        OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2555
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2556
        jt->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2557
        // cleared by handle_special_suspend_equivalent_condition() or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2558
        // java_suspend_self() via check_and_wait_while_suspended()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2559
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2560
        slp->park(millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2561
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2562
        // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2563
        jt->check_and_wait_while_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2564
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2565
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2566
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2567
    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2568
    jlong prevtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2569
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2570
    for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2571
      // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2572
      // the 1st iteration ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2573
      jlong newtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2574
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2575
      if (newtime - prevtime < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2576
        // time moving backwards, should only happen if no monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2577
        // not a guarantee() because JVM should not abort on kernel/glibc bugs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2578
        assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2579
      } else {
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11161
diff changeset
  2580
        millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2581
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2582
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2583
      if(millis <= 0) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2584
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2585
      prevtime = newtime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2586
      slp->park(millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2587
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2588
    return OS_OK ;
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
int os::naked_sleep() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2593
  // %% make the sleep time an integer flag. for now use 1 millisec.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2594
  return os::sleep(Thread::current(), 1, false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2595
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2596
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2597
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2598
void os::infinite_sleep() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2599
  while (true) {    // sleep forever ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2600
    ::sleep(100);   // ... 100 seconds at a time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2601
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2602
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2603
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2604
// Used to convert frequent JVM_Yield() to nops
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2605
bool os::dont_yield() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2606
  return DontYieldALot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2607
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2608
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2609
void os::yield() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2610
  sched_yield();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2611
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2612
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2613
os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2614
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2615
void os::yield_all(int attempts) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2616
  // Yields to all threads, including threads with lower priorities
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2617
  // Threads on Bsd are all with same priority. The Solaris style
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2618
  // os::yield_all() with nanosleep(1ms) is not necessary.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2619
  sched_yield();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2620
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2621
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2622
// Called from the tight loops to possibly influence time-sharing heuristics
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2623
void os::loop_breaker(int attempts) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2624
  os::yield_all(attempts);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2625
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2626
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2627
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2628
// thread priority support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2629
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2630
// Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2631
// only supports dynamic priority, static priority must be zero. For real-time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2632
// applications, Bsd supports SCHED_RR which allows static priority (1-99).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2633
// However, for large multi-threaded applications, SCHED_RR is not only slower
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2634
// than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2635
// of 5 runs - Sep 2005).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2636
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2637
// The following code actually changes the niceness of kernel-thread/LWP. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2638
// has an assumption that setpriority() only modifies one kernel-thread/LWP,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2639
// 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
  2640
// threads. It has always been the case, but could change in the future. For
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2641
// this reason, the code should not be used as default (ThreadPriorityPolicy=0).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2642
// It is only used when ThreadPriorityPolicy=1 and requires root privilege.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2643
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2644
#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
  2645
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2646
  19,              // 0 Entry should never be used
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2647
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2648
   0,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2649
   3,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2650
   6,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2651
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2652
  10,              // 4
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2653
  15,              // 5 NormPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2654
  18,              // 6
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2655
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2656
  21,              // 7
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2657
  25,              // 8
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2658
  28,              // 9 NearMaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2659
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2660
  31,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2661
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2662
  31               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2663
};
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2664
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2665
/* 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
  2666
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2667
   0,              // 0 Entry should never be used (MINPRI_USER)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2668
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2669
  27,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2670
  28,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2671
  29,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2672
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2673
  30,              // 4
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2674
  31,              // 5 NormPriority (BASEPRI_DEFAULT)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2675
  32,              // 6
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2676
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2677
  33,              // 7
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2678
  34,              // 8
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2679
  35,              // 9 NearMaxPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2680
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2681
  36,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2682
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2683
  36               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2684
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2685
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2686
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2687
static int prio_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2688
  if (ThreadPriorityPolicy == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2689
    // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2690
    // if effective uid is not root. Perhaps, a more elegant way of doing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2691
    // this is to test CAP_SYS_NICE capability, but that will require libcap.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2692
    if (geteuid() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2693
      if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2694
        warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2695
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2696
      ThreadPriorityPolicy = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2697
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2698
  }
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2699
  if (UseCriticalJavaThreadPriority) {
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2700
    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
  2701
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2702
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2703
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2704
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2705
OSReturn os::set_native_priority(Thread* thread, int newpri) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2706
  if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2707
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2708
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2709
  // OpenBSD pthread_setprio starves low priority threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2710
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2711
#elif defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2712
  int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2713
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2714
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2715
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2716
  pthread_t self = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2717
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2718
  if (pthread_getschedparam(self, &policy, &sp) != 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2719
    return OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2720
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2721
  sp.sched_priority = newpri;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2722
  if (pthread_setschedparam(self, policy, &sp) != 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2723
    return OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2724
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2725
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2726
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2727
  int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2728
  return (ret == 0) ? OS_OK : OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2729
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2730
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2732
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2733
  if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2734
    *priority_ptr = java_to_os_priority[NormPriority];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2735
    return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2736
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2737
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2738
  errno = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2739
#if defined(__OpenBSD__) || defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2740
  *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2741
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2742
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2743
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2744
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2745
  pthread_getschedparam(pthread_self(), &policy, &sp);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2746
  *priority_ptr = sp.sched_priority;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2747
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2748
  *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2749
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2750
  return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2751
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2752
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2753
// Hint to the underlying OS that a task switch would not be good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2754
// Void return because it's a hint and can fail.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2755
void os::hint_no_preempt() {}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2756
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2757
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2758
// suspend/resume support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2759
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2760
//  the low-level signal-based suspend/resume support is a remnant from the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2761
//  old VM-suspension that used to be for java-suspension, safepoints etc,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2762
//  within hotspot. Now there is a single use-case for this:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2763
//    - calling get_thread_pc() on the VMThread by the flat-profiler task
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2764
//      that runs in the watcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2765
//  The remaining code is greatly simplified from the more general suspension
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2766
//  code that used to be used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2767
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2768
//  The protocol is quite simple:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2769
//  - suspend:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2770
//      - sends a signal to the target thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2771
//      - polls the suspend state of the osthread using a yield loop
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2772
//      - target thread signal handler (SR_handler) sets suspend state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2773
//        and blocks in sigsuspend until continued
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2774
//  - resume:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2775
//      - sets target osthread state to continue
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2776
//      - sends signal to end the sigsuspend loop in the SR_handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2777
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2778
//  Note that the SR_lock plays no role in this suspend/resume protocol.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2779
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2780
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2781
static void resume_clear_context(OSThread *osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2782
  osthread->set_ucontext(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2783
  osthread->set_siginfo(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2784
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2785
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2786
static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2787
  osthread->set_ucontext(context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2788
  osthread->set_siginfo(siginfo);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2789
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2790
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2791
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2792
// Handler function invoked when a thread's execution is suspended or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2793
// resumed. We have to be careful that only async-safe functions are
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2794
// called here (Note: most pthread functions are not async safe and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2795
// should be avoided.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2796
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2797
// Note: sigwait() is a more natural fit than sigsuspend() from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2798
// interface point of view, but sigwait() prevents the signal hander
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2799
// from being run. libpthread would get very confused by not having
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2800
// its signal handlers run and prevents sigwait()'s use with the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2801
// mutex granting granting signal.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2802
//
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2803
// Currently only ever called on the VMThread or JavaThread
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2804
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2805
static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2806
  // Save and restore errno to avoid confusing native code with EINTR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2807
  // after sigsuspend.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2808
  int old_errno = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2809
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2810
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2811
  OSThread* osthread = thread->osthread();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2812
  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
  2813
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2814
  os::SuspendResume::State current = osthread->sr.state();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2815
  if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2816
    suspend_save_context(osthread, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2817
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2818
    // 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
  2819
    os::SuspendResume::State state = osthread->sr.suspended();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2820
    if (state == os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2821
      sigset_t suspend_set;  // signals for sigsuspend()
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2822
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2823
      // get current set of blocked signals and unblock resume signal
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2824
      pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2825
      sigdelset(&suspend_set, SR_signum);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2826
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2827
      sr_semaphore.signal();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2828
      // wait here until we are resumed
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2829
      while (1) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2830
        sigsuspend(&suspend_set);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2831
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2832
        os::SuspendResume::State result = osthread->sr.running();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2833
        if (result == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2834
          sr_semaphore.signal();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2835
          break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2836
        } else if (result != os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2837
          ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2838
        }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2839
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2840
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2841
    } else if (state == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2842
      // request was cancelled, continue
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2843
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2844
      ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2845
    }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2846
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2847
    resume_clear_context(osthread);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2848
  } else if (current == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2849
    // request was cancelled, continue
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2850
  } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2851
    // ignore
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2852
  } else {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2853
    // ignore
10565
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
  errno = old_errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2857
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2858
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2859
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2860
static int SR_initialize() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2861
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2862
  char *s;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2863
  /* Get signal number to use for suspend/resume */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2864
  if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2865
    int sig = ::strtol(s, 0, 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2866
    if (sig > 0 || sig < NSIG) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2867
        SR_signum = sig;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2868
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2869
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2870
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2871
  assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2872
        "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2873
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2874
  sigemptyset(&SR_sigset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2875
  sigaddset(&SR_sigset, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2876
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2877
  /* Set up signal handler for suspend/resume */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2878
  act.sa_flags = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2879
  act.sa_handler = (void (*)(int)) SR_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2880
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2881
  // SR_signum is blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2882
  // 4528190 - We also need to block pthread restart signal (32 on all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2883
  // supported Bsd platforms). Note that BsdThreads need to block
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2884
  // this signal for all threads to work properly. So we don't have
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2885
  // to use hard-coded signal number when setting up the mask.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2886
  pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2887
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2888
  if (sigaction(SR_signum, &act, 0) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2889
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2890
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2891
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2892
  // Save signal flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2893
  os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2894
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2895
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2896
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2897
static int sr_notify(OSThread* osthread) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2898
  int status = pthread_kill(osthread->pthread_id(), SR_signum);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2899
  assert_status(status == 0, status, "pthread_kill");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2900
  return status;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2901
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2902
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2903
// "Randomly" selected value for how long we want to spin
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2904
// before bailing out on suspending a thread, also how often
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2905
// we send a signal to a thread we want to resume
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2906
static const int RANDOMLY_LARGE_INTEGER = 1000000;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2907
static const int RANDOMLY_LARGE_INTEGER2 = 100;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2908
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2909
// returns true on success and false on error - really an error is fatal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2910
// but this seems the normal response to library errors
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2911
static bool do_suspend(OSThread* osthread) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2912
  assert(osthread->sr.is_running(), "thread should be running");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2913
  assert(!sr_semaphore.trywait(), "semaphore has invalid state");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2914
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2915
  // mark as suspended and send signal
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2916
  if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2917
    // failed to switch, state wasn't running?
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2918
    ShouldNotReachHere();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2919
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2920
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2921
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2922
  if (sr_notify(osthread) != 0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2923
    ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2924
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2925
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2926
  // 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
  2927
  while (true) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2928
    if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2929
      break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2930
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2931
      // timeout
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2932
      os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2933
      if (cancelled == os::SuspendResume::SR_RUNNING) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2934
        return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2935
      } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2936
        // 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
  2937
        sr_semaphore.wait();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2938
        break;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2939
      } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2940
        ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2941
        return false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2942
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2943
    }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2944
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2945
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2946
  guarantee(osthread->sr.is_suspended(), "Must be suspended");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2947
  return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2948
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2949
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2950
static void do_resume(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2951
  assert(osthread->sr.is_suspended(), "thread should be suspended");
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2952
  assert(!sr_semaphore.trywait(), "invalid semaphore state");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2953
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2954
  if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2955
    // failed to switch to WAKEUP_REQUEST
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2956
    ShouldNotReachHere();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2957
    return;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2958
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2959
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2960
  while (true) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2961
    if (sr_notify(osthread) == 0) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2962
      if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2963
        if (osthread->sr.is_running()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2964
          return;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2965
        }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2966
      }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2967
    } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2968
      ShouldNotReachHere();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2969
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2970
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2971
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  2972
  guarantee(osthread->sr.is_running(), "Must be running!");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2973
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2974
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2975
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2976
// interrupt support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2977
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2978
void os::interrupt(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2979
  assert(Thread::current() == thread || Threads_lock->owned_by_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2980
    "possibility of dangling Thread pointer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2981
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2982
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2983
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2984
  if (!osthread->interrupted()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2985
    osthread->set_interrupted(true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2986
    // More than one thread can get here with the same value of osthread,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2987
    // resulting in multiple notifications.  We do, however, want the store
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2988
    // to interrupted() to be visible to other threads before we execute unpark().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2989
    OrderAccess::fence();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2990
    ParkEvent * const slp = thread->_SleepEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2991
    if (slp != NULL) slp->unpark() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2992
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2993
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2994
  // For JSR166. Unpark even if interrupt status already was set
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2995
  if (thread->is_Java_thread())
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2996
    ((JavaThread*)thread)->parker()->unpark();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2997
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2998
  ParkEvent * ev = thread->_ParkEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2999
  if (ev != NULL) ev->unpark() ;
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3003
bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3004
  assert(Thread::current() == thread || Threads_lock->owned_by_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3005
    "possibility of dangling Thread pointer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3006
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3007
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3008
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3009
  bool interrupted = osthread->interrupted();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3010
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3011
  if (interrupted && clear_interrupted) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3012
    osthread->set_interrupted(false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3013
    // consider thread->_SleepEvent->reset() ... optional optimization
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3014
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3015
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3016
  return interrupted;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3017
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3018
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3019
///////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3020
// signal handling (except suspend/resume)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3021
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3022
// This routine may be used by user applications as a "hook" to catch signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3023
// The user-defined signal handler must pass unrecognized signals to this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3024
// routine, and if it returns true (non-zero), then the signal handler must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3025
// return immediately.  If the flag "abort_if_unrecognized" is true, then this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3026
// routine will never retun false (zero), but instead will execute a VM panic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3027
// routine kill the process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3028
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3029
// If this routine returns false, it is OK to call it again.  This allows
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3030
// the user-defined signal handler to perform checks either before or after
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3031
// the VM performs its own checks.  Naturally, the user code would be making
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3032
// 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
  3033
// or breakpoint) that the VM was generating for its own correct operation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3034
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3035
// This routine may recognize any of the following kinds of signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3036
//    SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3037
// It should be consulted by handlers for any of those signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3038
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3039
// The caller of this routine must pass in the three arguments supplied
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3040
// to the function referred to in the "sa_sigaction" (not the "sa_handler")
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3041
// field of the structure passed to sigaction().  This routine assumes that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3042
// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3043
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3044
// Note that the VM will print warnings if it detects conflicting signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3045
// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3046
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3047
extern "C" JNIEXPORT int
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3048
JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3049
                        void* ucontext, int abort_if_unrecognized);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3050
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3051
void signalHandler(int sig, siginfo_t* info, void* uc) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3052
  assert(info != NULL && uc != NULL, "it must be old kernel");
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  3053
  int orig_errno = errno;  // Preserve errno value over signal handler.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3054
  JVM_handle_bsd_signal(sig, info, uc, true);
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  3055
  errno = orig_errno;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3056
}
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
// This boolean allows users to forward their own non-matching signals
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3060
// to JVM_handle_bsd_signal, harmlessly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3061
bool os::Bsd::signal_handlers_are_installed = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3062
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3063
// For signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3064
struct sigaction os::Bsd::sigact[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3065
unsigned int os::Bsd::sigs = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3066
bool os::Bsd::libjsig_is_loaded = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3067
typedef struct sigaction *(*get_signal_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3068
get_signal_t os::Bsd::get_signal_action = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3069
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3070
struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3071
  struct sigaction *actp = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3072
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3073
  if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3074
    // Retrieve the old signal handler from libjsig
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3075
    actp = (*get_signal_action)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3076
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3077
  if (actp == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3078
    // Retrieve the preinstalled signal handler from jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3079
    actp = get_preinstalled_handler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3080
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3081
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3082
  return actp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3083
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3084
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3085
static bool call_chained_handler(struct sigaction *actp, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3086
                                 siginfo_t *siginfo, void *context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3087
  // Call the old signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3088
  if (actp->sa_handler == SIG_DFL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3089
    // It's more reasonable to let jvm treat it as an unexpected exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3090
    // instead of taking the default action.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3091
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3092
  } else if (actp->sa_handler != SIG_IGN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3093
    if ((actp->sa_flags & SA_NODEFER) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3094
      // automaticlly block the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3095
      sigaddset(&(actp->sa_mask), sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3096
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3097
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3098
    sa_handler_t hand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3099
    sa_sigaction_t sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3100
    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3101
    // retrieve the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3102
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3103
      sa = actp->sa_sigaction;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3104
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3105
      hand = actp->sa_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3106
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3107
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3108
    if ((actp->sa_flags & SA_RESETHAND) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3109
      actp->sa_handler = SIG_DFL;
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
    // try to honor the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3113
    sigset_t oset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3114
    pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3115
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3116
    // call into the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3117
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3118
      (*sa)(sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3119
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3120
      (*hand)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3121
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3122
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3123
    // restore the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3124
    pthread_sigmask(SIG_SETMASK, &oset, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3125
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3126
  // Tell jvm's signal handler the signal is taken care of.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3127
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3128
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3129
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3130
bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3131
  bool chained = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3132
  // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3133
  if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3134
    struct sigaction *actp = get_chained_signal_action(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3135
    if (actp != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3136
      chained = call_chained_handler(actp, sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3137
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3138
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3139
  return chained;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3140
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3141
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3142
struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3143
  if ((( (unsigned int)1 << sig ) & sigs) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3144
    return &sigact[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3145
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3146
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3147
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3148
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3149
void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3150
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3151
  sigact[sig] = oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3152
  sigs |= (unsigned int)1 << sig;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3153
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3154
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3155
// for diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3156
int os::Bsd::sigflags[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3157
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3158
int os::Bsd::get_our_sigflags(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3159
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3160
  return sigflags[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3161
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3162
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3163
void os::Bsd::set_our_sigflags(int sig, int flags) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3164
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3165
  sigflags[sig] = flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3166
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3167
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3168
void os::Bsd::set_signal_handler(int sig, bool set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3169
  // Check for overwrite.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3170
  struct sigaction oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3171
  sigaction(sig, (struct sigaction*)NULL, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3172
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3173
  void* oldhand = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3174
                ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3175
                : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3176
  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3177
      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3178
      oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3179
    if (AllowUserSignalHandlers || !set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3180
      // Do not overwrite; user takes responsibility to forward to us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3181
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3182
    } else if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3183
      // save the old handler in jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3184
      save_preinstalled_handler(sig, oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3185
      // libjsig also interposes the sigaction() call below and saves the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3186
      // old sigaction on it own.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3187
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3188
      fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3189
                    "%#lx for signal %d.", (long)oldhand, sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3190
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3191
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3192
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3193
  struct sigaction sigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3194
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3195
  sigAct.sa_handler = SIG_DFL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3196
  if (!set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3197
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3198
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3199
    sigAct.sa_sigaction = signalHandler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3200
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3201
  }
17868
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3202
#if __APPLE__
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3203
  // 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
  3204
  // (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
  3205
  // 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
  3206
  // 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
  3207
  // 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
  3208
  // 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
  3209
  // 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
  3210
  if (sig == SIGSEGV) {
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3211
    sigAct.sa_flags |= SA_ONSTACK;
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3212
  }
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3213
#endif
262aa770cb1b 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 17134
diff changeset
  3214
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3215
  // Save flags, which are set by ours
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3216
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3217
  sigflags[sig] = sigAct.sa_flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3218
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3219
  int ret = sigaction(sig, &sigAct, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3220
  assert(ret == 0, "check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3221
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3222
  void* oldhand2  = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3223
                  ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3224
                  : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3225
  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
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
// install signal handlers for signals that HotSpot needs to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3229
// handle in order to support Java-level exception handling.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3230
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3231
void os::Bsd::install_signal_handlers() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3232
  if (!signal_handlers_are_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3233
    signal_handlers_are_installed = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3234
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3235
    // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3236
    typedef void (*signal_setting_t)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3237
    signal_setting_t begin_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3238
    signal_setting_t end_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3239
    begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3240
                             dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3241
    if (begin_signal_setting != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3242
      end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3243
                             dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3244
      get_signal_action = CAST_TO_FN_PTR(get_signal_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3245
                            dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3246
      libjsig_is_loaded = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3247
      assert(UseSignalChaining, "should enable signal-chaining");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3248
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3249
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3250
      // Tell libjsig jvm is setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3251
      (*begin_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3252
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3253
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3254
    set_signal_handler(SIGSEGV, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3255
    set_signal_handler(SIGPIPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3256
    set_signal_handler(SIGBUS, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3257
    set_signal_handler(SIGILL, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3258
    set_signal_handler(SIGFPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3259
    set_signal_handler(SIGXFSZ, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3260
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3261
#if defined(__APPLE__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3262
    // 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
  3263
    // 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
  3264
    // signal handler that's placed on our process by CrashReporter. This disables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3265
    // CrashReporter-based reporting.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3266
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3267
    // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3268
    // on caught fatal signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3269
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3270
    // Additionally, gdb installs both standard BSD signal handlers, and mach exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3271
    // handlers. By replacing the existing task exception handler, we disable gdb's mach
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3272
    // exception handling, while leaving the standard BSD signal handlers functional.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3273
    kern_return_t kr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3274
    kr = task_set_exception_ports(mach_task_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3275
        EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3276
        MACH_PORT_NULL,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3277
        EXCEPTION_STATE_IDENTITY,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3278
        MACHINE_THREAD_STATE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3279
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3280
    assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3281
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3282
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3283
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3284
      // Tell libjsig jvm finishes setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3285
      (*end_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3286
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3287
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3288
    // We don't activate signal checker if libjsig is in place, we trust ourselves
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3289
    // and if UserSignalHandler is installed all bets are off
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3290
    if (CheckJNICalls) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3291
      if (libjsig_is_loaded) {
19532
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3292
        if (PrintJNIResolving) {
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3293
          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
  3294
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3295
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3296
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3297
      if (AllowUserSignalHandlers) {
19532
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3298
        if (PrintJNIResolving) {
6a9f968b7b05 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 19531
diff changeset
  3299
          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
  3300
        }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3301
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3302
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3303
    }
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3307
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3308
/////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3309
// glibc on Bsd platform uses non-documented flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3310
// to indicate, that some special sort of signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3311
// trampoline is used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3312
// We will never set this flag, and we should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3313
// ignore this flag in our diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3314
#ifdef SIGNIFICANT_SIGNAL_MASK
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3315
#undef SIGNIFICANT_SIGNAL_MASK
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3316
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3317
#define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3318
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3319
static const char* get_signal_handler_name(address handler,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3320
                                           char* buf, int buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3321
  int offset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3322
  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3323
  if (found) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3324
    // skip directory names
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3325
    const char *p1, *p2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3326
    p1 = buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3327
    size_t len = strlen(os::file_separator());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3328
    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3329
    jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3330
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3331
    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3332
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3333
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3334
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3335
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3336
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3337
                                 char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3338
  struct sigaction sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3339
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3340
  sigaction(sig, NULL, &sa);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3341
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3342
  // See comment for SIGNIFICANT_SIGNAL_MASK define
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3343
  sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3344
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3345
  st->print("%s: ", os::exception_name(sig, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3346
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3347
  address handler = (sa.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3348
    ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3349
    : CAST_FROM_FN_PTR(address, sa.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3350
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3351
  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3352
    st->print("SIG_DFL");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3353
  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3354
    st->print("SIG_IGN");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3355
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3356
    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3357
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3358
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3359
  st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3360
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3361
  address rh = VMError::get_resetted_sighandler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3362
  // May be, handler was resetted by VMError?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3363
  if(rh != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3364
    handler = rh;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3365
    sa.sa_flags = VMError::get_resetted_sigflags(sig) & 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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3368
  st->print(", sa_flags="   PTR32_FORMAT, sa.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3369
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3370
  // Check: is it our handler?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3371
  if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3372
     handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3373
    // It is our signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3374
    // check for flags, reset system-used one!
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3375
    if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3376
      st->print(
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3377
                ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3378
                os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3379
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3380
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3381
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3382
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3383
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3384
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3385
#define DO_SIGNAL_CHECK(sig) \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3386
  if (!sigismember(&check_signal_done, sig)) \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3387
    os::Bsd::check_signal_handler(sig)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3388
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3389
// This method is a periodic task to check for misbehaving JNI applications
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3390
// under CheckJNI, we can add any periodic checks here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3391
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3392
void os::run_periodic_checks() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3393
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3394
  if (check_signals == false) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3395
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3396
  // SEGV and BUS if overridden could potentially prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3397
  // generation of hs*.log in the event of a crash, debugging
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3398
  // such a case can be very challenging, so we absolutely
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3399
  // check the following for a good measure:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3400
  DO_SIGNAL_CHECK(SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3401
  DO_SIGNAL_CHECK(SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3402
  DO_SIGNAL_CHECK(SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3403
  DO_SIGNAL_CHECK(SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3404
  DO_SIGNAL_CHECK(SIGPIPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3405
  DO_SIGNAL_CHECK(SIGXFSZ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3406
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3407
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3408
  // ReduceSignalUsage allows the user to override these handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3409
  // see comments at the very top and jvm_solaris.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3410
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3411
    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3412
    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3413
    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3414
    DO_SIGNAL_CHECK(BREAK_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3415
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3416
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3417
  DO_SIGNAL_CHECK(SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3418
  DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
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
typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3422
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3423
static os_sigaction_t os_sigaction = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3424
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3425
void os::Bsd::check_signal_handler(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3426
  char buf[O_BUFLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3427
  address jvmHandler = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3428
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3429
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3430
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3431
  if (os_sigaction == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3432
    // only trust the default sigaction, in case it has been interposed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3433
    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3434
    if (os_sigaction == NULL) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3435
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3436
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3437
  os_sigaction(sig, (struct sigaction*)NULL, &act);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3438
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3439
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3440
  act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3441
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3442
  address thisHandler = (act.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3443
    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3444
    : CAST_FROM_FN_PTR(address, act.sa_handler) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3445
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3446
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3447
  switch(sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3448
  case SIGSEGV:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3449
  case SIGBUS:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3450
  case SIGFPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3451
  case SIGPIPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3452
  case SIGILL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3453
  case SIGXFSZ:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3454
    jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3455
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3456
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3457
  case SHUTDOWN1_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3458
  case SHUTDOWN2_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3459
  case SHUTDOWN3_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3460
  case BREAK_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3461
    jvmHandler = (address)user_handler();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3462
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3463
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3464
  case INTERRUPT_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3465
    jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3466
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3467
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3468
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3469
    if (sig == SR_signum) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3470
      jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3471
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3472
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3473
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3474
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3475
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3476
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3477
  if (thisHandler != jvmHandler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3478
    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3479
    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3480
    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3481
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3482
    sigaddset(&check_signal_done, sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3483
  } 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
  3484
    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3485
    tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3486
    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3487
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3488
    sigaddset(&check_signal_done, sig);
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
  // Dump all the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3492
  if (sigismember(&check_signal_done, sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3493
    print_signal_handlers(tty, buf, O_BUFLEN);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3494
  }
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
extern void report_error(char* file_name, int line_no, char* title, char* format, ...);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3498
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3499
extern bool signal_name(int signo, char* buf, size_t len);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3500
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3501
const char* os::exception_name(int exception_code, char* buf, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3502
  if (0 < exception_code && exception_code <= SIGRTMAX) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3503
    // signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3504
    if (!signal_name(exception_code, buf, size)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3505
      jio_snprintf(buf, size, "SIG%d", exception_code);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3506
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3507
    return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3508
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3509
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3510
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3511
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3513
// this is called _before_ the most of global arguments have been parsed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3514
void os::init(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3515
  char dummy;   /* used to get a guess on initial stack address */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3516
//  first_hrtime = gethrtime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3517
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3518
  // With BsdThreads the JavaMain thread pid (primordial thread)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3519
  // is different than the pid of the java launcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3520
  // So, on Bsd, the launcher thread pid is passed to the VM
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3521
  // via the sun.java.launcher.pid property.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3522
  // Use this property instead of getpid() if it was correctly passed.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3523
  // See bug 6351349.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3524
  pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3526
  _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3527
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3528
  clock_tics_per_sec = CLK_TCK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3529
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3530
  init_random(1234567);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3531
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3532
  ThreadCritical::initialize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3533
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3534
  Bsd::set_page_size(getpagesize());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3535
  if (Bsd::page_size() == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3536
    fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3537
                  strerror(errno)));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3538
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3539
  init_page_sizes((size_t) Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3540
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3541
  Bsd::initialize_system_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3542
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3543
  // main_thread points to the aboriginal thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3544
  Bsd::_main_thread = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3545
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3546
  Bsd::clock_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3547
  initial_time_count = os::elapsed_counter();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3548
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3549
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3550
  // XXXDARWIN
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3551
  // Work around the unaligned VM callbacks in hotspot's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3552
  // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3553
  // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3554
  // alignment when doing symbol lookup. To work around this, we force early
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3555
  // binding of all symbols now, thus binding when alignment is known-good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3556
  _dyld_bind_fully_image_containing_address((const void *) &os::init);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3557
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3558
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3559
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3560
// To install functions for atexit system call
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3561
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3562
  static void perfMemory_exit_helper() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3563
    perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3564
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3565
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3566
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3567
// this is called _after_ the global arguments have been parsed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3568
jint os::init_2(void)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3569
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3570
  // Allocate a single page and mark it as readable for safepoint polling
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3571
  address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3572
  guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3573
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3574
  os::set_polling_page( polling_page );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3575
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3576
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3577
  if(Verbose && PrintMiscellaneous)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3578
    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3579
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3580
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3581
  if (!UseMembar) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3582
    address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
18069
e6d4971c8650 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 18025
diff changeset
  3583
    guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3584
    os::set_memory_serialize_page( mem_serialize_page );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3585
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3586
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3587
    if(Verbose && PrintMiscellaneous)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3588
      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3589
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3590
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3591
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3592
  // initialize suspend/resume support - must do this before signal_sets_init()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3593
  if (SR_initialize() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3594
    perror("SR_initialize failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3595
    return JNI_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3596
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3597
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3598
  Bsd::signal_sets_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3599
  Bsd::install_signal_handlers();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3600
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3601
  // Check minimum allowable stack size for thread creation and to initialize
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3602
  // the java system classes, including StackOverflowError - depends on page
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3603
  // size.  Add a page for compiler2 recursion in main thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3604
  // Add in 2*BytesPerWord times page size to account for VM stack during
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3605
  // class initialization depending on 32 or 64 bit VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3606
  os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3607
            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3608
                    2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3609
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3610
  size_t threadStackSizeInBytes = ThreadStackSize * K;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3611
  if (threadStackSizeInBytes != 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3612
      threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3613
        tty->print_cr("\nThe stack size specified is too small, "
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3614
                      "Specify at least %dk",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3615
                      os::Bsd::min_stack_allowed/ K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3616
        return JNI_ERR;
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
  // Make the stack size a multiple of the page size so that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3620
  // the yellow/red zones can be guarded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3621
  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3622
        vm_page_size()));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3623
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3624
  if (MaxFDLimit) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3625
    // set the number of file descriptors to max. print out error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3626
    // if getrlimit/setrlimit fails but continue regardless.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3627
    struct rlimit nbr_files;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3628
    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3629
    if (status != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3630
      if (PrintMiscellaneous && (Verbose || WizardMode))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3631
        perror("os::init_2 getrlimit failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3632
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3633
      nbr_files.rlim_cur = nbr_files.rlim_max;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3634
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3635
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3636
      // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3637
      // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3638
      // be used instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3639
      nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3640
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3641
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3642
      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3643
      if (status != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3644
        if (PrintMiscellaneous && (Verbose || WizardMode))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3645
          perror("os::init_2 setrlimit failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3646
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3647
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3648
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3649
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3650
  // at-exit methods are called in the reverse order of their registration.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3651
  // atexit functions are called on return from main or as a result of a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3652
  // call to exit(3C). There can be only 32 of these functions registered
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3653
  // and atexit() does not set errno.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3654
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3655
  if (PerfAllowAtExitRegistration) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3656
    // only register atexit functions if PerfAllowAtExitRegistration is set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3657
    // atexit functions can be delayed until process exit time, which
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3658
    // can be problematic for embedded VM situations. Embedded VMs should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3659
    // call DestroyJavaVM() to assure that VM resources are released.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3660
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3661
    // note: perfMemory_exit_helper atexit function may be removed in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3662
    // the future if the appropriate cleanup code can be added to the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3663
    // VM_Exit VMOperation's doit method.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3664
    if (atexit(perfMemory_exit_helper) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3665
      warning("os::init2 atexit(perfMemory_exit_helper) failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3666
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3667
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3668
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3669
  // initialize thread priority policy
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3670
  prio_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3671
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3672
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3673
  // dynamically link to objective c gc registration
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3674
  void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3675
  if (handleLibObjc != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3676
    objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3677
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3678
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3679
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3680
  return JNI_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3681
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3682
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3683
// this is called at the end of vm_initialization
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3684
void os::init_3(void) { }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3685
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3686
// Mark the polling page as unreadable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3687
void os::make_polling_page_unreadable(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3688
  if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3689
    fatal("Could not disable polling page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3690
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3691
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3692
// Mark the polling page as readable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3693
void os::make_polling_page_readable(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3694
  if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3695
    fatal("Could not enable polling page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3696
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3697
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3698
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3699
int os::active_processor_count() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3700
  return _processor_count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3701
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3702
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3703
void os::set_native_thread_name(const char *name) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3704
#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
  3705
  // This is only supported in Snow Leopard and beyond
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3706
  if (name != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3707
    // Add a "Java: " prefix to the name
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3708
    char buf[MAXTHREADNAMESIZE];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3709
    snprintf(buf, sizeof(buf), "Java: %s", name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3710
    pthread_setname_np(buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3711
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3712
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3713
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3714
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3715
bool os::distribute_processes(uint length, uint* distribution) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3716
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3717
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3718
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3719
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3720
bool os::bind_to_processor(uint processor_id) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3721
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3722
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3723
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3724
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3725
void os::SuspendedThreadTask::internal_do_task() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3726
  if (do_suspend(_thread->osthread())) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3727
    SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3728
    do_task(context);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3729
    do_resume(_thread->osthread());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3730
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3731
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3732
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3733
///
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3734
class PcFetcher : public os::SuspendedThreadTask {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3735
public:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3736
  PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3737
  ExtendedPC result();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3738
protected:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3739
  void do_task(const os::SuspendedThreadTaskContext& context);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3740
private:
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3741
  ExtendedPC _epc;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3742
};
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3743
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3744
ExtendedPC PcFetcher::result() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3745
  guarantee(is_done(), "task is not done yet.");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3746
  return _epc;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3747
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3748
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3749
void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3750
  Thread* thread = context.thread();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3751
  OSThread* osthread = thread->osthread();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3752
  if (osthread->ucontext() != NULL) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3753
    _epc = os::Bsd::ucontext_get_pc((ucontext_t *) context.ucontext());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3754
  } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3755
    // NULL context is unexpected, double-check this is the VMThread
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3756
    guarantee(thread->is_VM_thread(), "can only be called for VMThread");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3757
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3758
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3759
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3760
// Suspends the target using the signal mechanism and then grabs the PC before
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3761
// resuming the target. Used by the flat-profiler only
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3762
ExtendedPC os::get_thread_pc(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3763
  // Make sure that it is called by the watcher for the VMThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3764
  assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3765
  assert(thread->is_VM_thread(), "Can only be called for VMThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3766
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3767
  PcFetcher fetcher(thread);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3768
  fetcher.run();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  3769
  return fetcher.result();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3770
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3771
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3772
int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3773
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3774
  return pthread_cond_timedwait(_cond, _mutex, _abstime);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3775
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3776
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3777
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3778
// debug support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3779
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3780
bool os::find(address addr, outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3781
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3782
  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
  3783
  if (dladdr(addr, &dlinfo) != 0) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3784
    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
  3785
    if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3786
      st->print("%s+%#x", dlinfo.dli_sname,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3787
                 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
  3788
    } else if (dlinfo.dli_fbase != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3789
      st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3790
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3791
      st->print("<absolute address>");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3792
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3793
    if (dlinfo.dli_fname != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3794
      st->print(" in %s", dlinfo.dli_fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3795
    }
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3796
    if (dlinfo.dli_fbase != NULL) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3797
      st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3798
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3799
    st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3800
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3801
    if (Verbose) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3802
      // decode some bytes around the PC
16670
4af09aff4237 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 16669
diff changeset
  3803
      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
  3804
      address end   = clamp_address_in_page(addr+40, addr, os::vm_page_size());
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3805
      address       lowest = (address) dlinfo.dli_sname;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3806
      if (!lowest)  lowest = (address) dlinfo.dli_fbase;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3807
      if (begin < lowest)  begin = lowest;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3808
      Dl_info dlinfo2;
18683
a6418e038255 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 18086
diff changeset
  3809
      if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3810
          && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3811
        end = (address) dlinfo2.dli_saddr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3812
      Disassembler::decode(begin, end, st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3813
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3814
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3815
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3816
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3817
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3818
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3819
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3820
// misc
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3821
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3822
// This does not do anything on Bsd. This is basically a hook for being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3823
// able to use structured exception handling (thread-local exception filters)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3824
// on, e.g., Win32.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3825
void
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3826
os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3827
                         JavaCallArguments* args, Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3828
  f(value, method, args, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3829
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3830
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3831
void os::print_statistics() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3832
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3833
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3834
int os::message_box(const char* title, const char* message) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3835
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3836
  fdStream err(defaultStream::error_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3837
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3838
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3839
  err.print_raw_cr(title);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3840
  for (i = 0; i < 78; i++) err.print_raw("-");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3841
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3842
  err.print_raw_cr(message);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3843
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3844
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3845
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3846
  char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3847
  // Prevent process from exiting upon "read error" without consuming all CPU
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3848
  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3849
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3850
  return buf[0] == 'y' || buf[0] == 'Y';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3851
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3852
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3853
int os::stat(const char *path, struct stat *sbuf) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3854
  char pathbuf[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3855
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3856
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3857
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3858
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3859
  os::native_path(strcpy(pathbuf, path));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3860
  return ::stat(pathbuf, sbuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3861
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3862
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3863
bool os::check_heap(bool force) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3864
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3865
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3866
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3867
int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3868
  return ::vsnprintf(buf, count, format, args);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3869
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3870
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3871
// Is a (classpath) directory empty?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3872
bool os::dir_is_empty(const char* path) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3873
  DIR *dir = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3874
  struct dirent *ptr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3875
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3876
  dir = opendir(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3877
  if (dir == NULL) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3878
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3879
  /* Scan the directory */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3880
  bool result = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3881
  char buf[sizeof(struct dirent) + MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3882
  while (result && (ptr = ::readdir(dir)) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3883
    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3884
      result = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3885
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3886
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3887
  closedir(dir);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3888
  return result;
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
// This code originates from JDK's sysOpen and open64_w
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3892
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3893
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3894
#ifndef O_DELETE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3895
#define O_DELETE 0x10000
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3896
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3897
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3898
// Open a file. Unlink the file immediately after open returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3899
// if the specified oflag has the O_DELETE flag set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3900
// O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3901
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3902
int os::open(const char *path, int oflag, int mode) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3903
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3904
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3905
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3906
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3907
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3908
  int fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3909
  int o_delete = (oflag & O_DELETE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3910
  oflag = oflag & ~O_DELETE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3911
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3912
  fd = ::open(path, oflag, mode);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3913
  if (fd == -1) return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3914
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3915
  //If the open succeeded, the file might still be a directory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3916
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3917
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3918
    int ret = ::fstat(fd, &buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3919
    int st_mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3920
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3921
    if (ret != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3922
      if ((st_mode & S_IFMT) == S_IFDIR) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3923
        errno = EISDIR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3924
        ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3925
        return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3926
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3927
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3928
      ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3929
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3930
    }
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
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3934
     * All file descriptors that are opened in the JVM and not
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3935
     * specifically destined for a subprocess should have the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3936
     * close-on-exec flag set.  If we don't set it, then careless 3rd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3937
     * party native code might fork and exec without closing all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3938
     * appropriate file descriptors (e.g. as we do in closeDescriptors in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3939
     * UNIXProcess.c), and this in turn might:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3940
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3941
     * - cause end-of-file to fail to be detected on some file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3942
     *   descriptors, resulting in mysterious hangs, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3943
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3944
     * - might cause an fopen in the subprocess to fail on a system
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3945
     *   suffering from bug 1085341.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3946
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3947
     * (Yes, the default setting of the close-on-exec flag is a Unix
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3948
     * design flaw)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3949
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3950
     * See:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3951
     * 1085341: 32-bit stdio routines should support file descriptors >255
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3952
     * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3953
     * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3954
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3955
#ifdef FD_CLOEXEC
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3956
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3957
        int flags = ::fcntl(fd, F_GETFD);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3958
        if (flags != -1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3959
            ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3960
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3961
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3962
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3963
  if (o_delete != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3964
    ::unlink(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3965
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3966
  return fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3967
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3968
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3969
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3970
// create binary file, rewriting existing file if required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3971
int os::create_binary_file(const char* path, bool rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3972
  int oflags = O_WRONLY | O_CREAT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3973
  if (!rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3974
    oflags |= O_EXCL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3975
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3976
  return ::open(path, oflags, S_IREAD | S_IWRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3977
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3978
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3979
// return current position of file pointer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3980
jlong os::current_file_offset(int fd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3981
  return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3982
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3983
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3984
// move file pointer to the specified offset
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3985
jlong os::seek_to_file_offset(int fd, jlong offset) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3986
  return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3987
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3988
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3989
// This code originates from JDK's sysAvailable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3990
// from src/solaris/hpi/src/native_threads/src/sys_api_td.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3991
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3992
int os::available(int fd, jlong *bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3993
  jlong cur, end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3994
  int mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3995
  struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3996
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3997
  if (::fstat(fd, &buf) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3998
    mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3999
    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4000
      /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4001
      * XXX: is the following call interruptible? If so, this might
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4002
      * need to go through the INTERRUPT_IO() wrapper as for other
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4003
      * blocking, interruptible calls in this file.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4004
      */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4005
      int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4006
      if (::ioctl(fd, FIONREAD, &n) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4007
        *bytes = n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4008
        return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4009
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4010
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4011
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4012
  if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4013
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4014
  } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4015
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4016
  } else if (::lseek(fd, cur, SEEK_SET) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4017
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4018
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4019
  *bytes = end - cur;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4020
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4021
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4022
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4023
int os::socket_available(int fd, jint *pbytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4024
   if (fd < 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4025
     return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4026
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4027
   int ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4028
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4029
   RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4030
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4031
   //%% note ioctl can return 0 when successful, JVM_SocketAvailable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4032
   // is expected to return 0 on failure and 1 on success to the jdk.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4033
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4034
   return (ret == OS_ERR) ? 0 : 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4035
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4036
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4037
// Map a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  4038
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4039
                     char *addr, size_t bytes, bool read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4040
                     bool allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4041
  int prot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4042
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4043
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4044
  if (read_only) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4045
    prot = PROT_READ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4046
    flags = MAP_SHARED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4047
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4048
    prot = PROT_READ | PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4049
    flags = MAP_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4050
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4051
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4052
  if (allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4053
    prot |= PROT_EXEC;
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
  if (addr != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4057
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4058
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4059
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4060
  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4061
                                     fd, file_offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4062
  if (mapped_address == MAP_FAILED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4063
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4064
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4065
  return mapped_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4066
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4067
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4068
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4069
// Remap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  4070
char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4071
                       char *addr, size_t bytes, bool read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4072
                       bool allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4073
  // same as map_memory() on this OS
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4074
  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4075
                        allow_exec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4076
}
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
// Unmap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  4080
bool os::pd_unmap_memory(char* addr, size_t bytes) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4081
  return munmap(addr, bytes) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4082
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4083
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4084
// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4085
// 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
  4086
// of a thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4087
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4088
// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4089
// the fast estimate available on the platform.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4090
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4091
jlong os::current_thread_cpu_time() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4092
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4093
  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
  4094
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4095
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4096
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4097
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4098
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4099
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4100
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
  4101
#ifdef __APPLE__
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4102
  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
  4103
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4104
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4105
  return 0;
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4106
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4107
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4108
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4109
jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4110
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4111
  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
  4112
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4113
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4114
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4115
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4116
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4117
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4118
jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4119
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4120
  struct thread_basic_info tinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4121
  mach_msg_type_number_t tcount = THREAD_INFO_MAX;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4122
  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
  4123
  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
  4124
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  4125
  mach_thread = thread->osthread()->thread_id();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4126
  kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4127
  if (kr != KERN_SUCCESS)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4128
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4129
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4130
  if (user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4131
    jlong nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4132
    nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4133
    nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4134
    return nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4135
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4136
    return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4137
  }
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4138
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4139
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  4140
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4141
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4142
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4143
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4144
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4145
void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4146
  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
  4147
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4148
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4149
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4150
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4151
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4152
void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4153
  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
  4154
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4155
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4156
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4157
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4158
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4159
bool os::is_thread_cpu_time_supported() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4160
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4161
  return true;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  4162
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4163
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4164
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4165
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4166
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4167
// System loadavg support.  Returns -1 if load average cannot be obtained.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4168
// Bsd doesn't yet have a (official) notion of processor sets,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4169
// so just return the system wide load average.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4170
int os::loadavg(double loadavg[], int nelem) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4171
  return ::getloadavg(loadavg, nelem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4172
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4173
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4174
void os::pause() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4175
  char filename[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4176
  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4177
    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4178
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4179
    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4180
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4181
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4182
  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4183
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4184
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4185
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4186
    while (::stat(filename, &buf) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4187
      (void)::poll(NULL, 0, 100);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4188
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4189
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4190
    jio_fprintf(stderr,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4191
      "Could not open pause file '%s', continuing immediately.\n", filename);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4192
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4193
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4194
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4195
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4196
// Refer to the comments in os_solaris.cpp park-unpark.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4197
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4198
// Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4199
// hang indefinitely.  For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4200
// For specifics regarding the bug see GLIBC BUGID 261237 :
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4201
//    http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4202
// 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
  4203
// will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4204
// 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
  4205
// hang).  The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4206
// 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
  4207
// calls to pthread_cond_timedwait().  Using LD_ASSUME_KERNEL to use an older version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4208
// of libpthread avoids the problem, but isn't practical.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4209
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4210
// Possible remedies:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4211
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4212
// 1.   Establish a minimum relative wait time.  50 to 100 msecs seems to work.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4213
//      This is palliative and probabilistic, however.  If the thread is preempted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4214
//      between the call to compute_abstime() and pthread_cond_timedwait(), more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4215
//      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
  4216
//      past) resultin in a hang.   Using this technique reduces the odds of a hang
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4217
//      but the JVM is still vulnerable, particularly on heavily loaded systems.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4218
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4219
// 2.   Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4220
//      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
  4221
//      NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4222
//      reduces to poll()+read().  This works well, but consumes 2 FDs per extant
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4223
//      thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4224
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4225
// 3.   Embargo pthread_cond_timedwait() and implement a native "chron" thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4226
//      that manages timeouts.  We'd emulate pthread_cond_timedwait() by enqueuing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4227
//      a timeout request to the chron thread and then blocking via pthread_cond_wait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4228
//      This also works well.  In fact it avoids kernel-level scalability impediments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4229
//      on certain platforms that don't handle lots of active pthread_cond_timedwait()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4230
//      timers in a graceful fashion.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4231
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4232
// 4.   When the abstime value is in the past it appears that control returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4233
//      correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4234
//      Subsequent timedwait/wait calls may hang indefinitely.  Given that, we
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4235
//      can avoid the problem by reinitializing the condvar -- by cond_destroy()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4236
//      followed by cond_init() -- after all calls to pthread_cond_timedwait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4237
//      It may be possible to avoid reinitialization by checking the return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4238
//      value from pthread_cond_timedwait().  In addition to reinitializing the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4239
//      condvar we must establish the invariant that cond_signal() is only called
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4240
//      within critical sections protected by the adjunct mutex.  This prevents
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4241
//      cond_signal() from "seeing" a condvar that's in the midst of being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4242
//      reinitialized or that is corrupt.  Sadly, this invariant obviates the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4243
//      desirable signal-after-unlock optimization that avoids futile context switching.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4244
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4245
//      I'm also concerned that some versions of NTPL might allocate an auxilliary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4246
//      structure when a condvar is used or initialized.  cond_destroy()  would
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4247
//      release the helper structure.  Our reinitialize-after-timedwait fix
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4248
//      put excessive stress on malloc/free and locks protecting the c-heap.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4249
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4250
// We currently use (4).  See the WorkAroundNTPLTimedWaitHang flag.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4251
// It may be possible to refine (4) by checking the kernel and NTPL verisons
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4252
// and only enabling the work-around for vulnerable environments.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4253
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4254
// utility to compute the abstime argument to timedwait:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4255
// millis is the relative timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4256
// abstime will be the absolute timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4257
// TODO: replace compute_abstime() with unpackTime()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4258
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4259
static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4260
  if (millis < 0)  millis = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4261
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4262
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4263
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4264
  jlong seconds = millis / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4265
  millis %= 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4266
  if (seconds > 50000000) { // see man cond_timedwait(3T)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4267
    seconds = 50000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4268
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4269
  abstime->tv_sec = now.tv_sec  + seconds;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4270
  long       usec = now.tv_usec + millis * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4271
  if (usec >= 1000000) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4272
    abstime->tv_sec += 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4273
    usec -= 1000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4274
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4275
  abstime->tv_nsec = usec * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4276
  return abstime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4277
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4278
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4279
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4280
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4281
// Conceptually TryPark() should be equivalent to park(0).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4282
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4283
int os::PlatformEvent::TryPark() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4284
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4285
    const int v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4286
    guarantee ((v == 0) || (v == 1), "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4287
    if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4288
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4289
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4290
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4291
void os::PlatformEvent::park() {       // AKA "down()"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4292
  // Invariant: Only the thread associated with the Event/PlatformEvent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4293
  // may call park().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4294
  // TODO: assert that _Assoc != NULL or _Assoc == Self
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4295
  int v ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4296
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4297
      v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4298
      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4299
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4300
  guarantee (v >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4301
  if (v == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4302
     // Do this the hard way by blocking ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4303
     int status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4304
     assert_status(status == 0, status, "mutex_lock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4305
     guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4306
     ++ _nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4307
     while (_Event < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4308
        status = pthread_cond_wait(_cond, _mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4309
        // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4310
        // Treat this the same as if the wait was interrupted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4311
        if (status == ETIMEDOUT) { status = EINTR; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4312
        assert_status(status == 0 || status == EINTR, status, "cond_wait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4313
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4314
     -- _nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4315
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4316
    _Event = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4317
     status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4318
     assert_status(status == 0, status, "mutex_unlock");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4319
    // 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
  4320
    // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4321
    OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4322
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4323
  guarantee (_Event >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4324
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4325
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4326
int os::PlatformEvent::park(jlong millis) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4327
  guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4328
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4329
  int v ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4330
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4331
      v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4332
      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4333
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4334
  guarantee (v >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4335
  if (v != 0) return OS_OK ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4336
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4337
  // We do this the hard way, by blocking the thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4338
  // Consider enforcing a minimum timeout value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4339
  struct timespec abst;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4340
  compute_abstime(&abst, millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4341
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4342
  int ret = OS_TIMEOUT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4343
  int status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4344
  assert_status(status == 0, status, "mutex_lock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4345
  guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4346
  ++_nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4347
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4348
  // Object.wait(timo) will return because of
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4349
  // (a) notification
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4350
  // (b) timeout
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4351
  // (c) thread.interrupt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4352
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4353
  // Thread.interrupt and object.notify{All} both call Event::set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4354
  // That is, we treat thread.interrupt as a special case of notification.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4355
  // The underlying Solaris implementation, cond_timedwait, admits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4356
  // spurious/premature wakeups, but the JLS/JVM spec prevents the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4357
  // JVM from making those visible to Java code.  As such, we must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4358
  // filter out spurious wakeups.  We assume all ETIME returns are valid.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4359
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4360
  // TODO: properly differentiate simultaneous notify+interrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4361
  // In that case, we should propagate the notify to another waiter.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4362
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4363
  while (_Event < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4364
    status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4365
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4366
      pthread_cond_destroy (_cond);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4367
      pthread_cond_init (_cond, NULL) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4368
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4369
    assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4370
                  status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4371
                  status, "cond_timedwait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4372
    if (!FilterSpuriousWakeups) break ;                 // previous semantics
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4373
    if (status == ETIMEDOUT) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4374
    // We consume and ignore EINTR and spurious wakeups.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4375
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4376
  --_nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4377
  if (_Event >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4378
     ret = OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4379
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4380
  _Event = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4381
  status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4382
  assert_status(status == 0, status, "mutex_unlock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4383
  assert (_nParked == 0, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4384
  // 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
  4385
  // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4386
  OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4387
  return ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4388
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4389
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4390
void os::PlatformEvent::unpark() {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4391
  // Transitions for _Event:
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4392
  //    0 :=> 1
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4393
  //    1 :=> 1
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4394
  //   -1 :=> either 0 or 1; must signal target thread
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4395
  //          That is, we can safely transition _Event from -1 to either
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4396
  //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4397
  //          unpark() calls.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4398
  // See also: "Semaphores in Plan 9" by Mullender & Cox
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4399
  //
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4400
  // 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
  4401
  // 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
  4402
  // 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
  4403
  // 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
  4404
  // 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
  4405
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4406
  if (Atomic::xchg(1, &_Event) >= 0) return;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4407
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4408
  // 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
  4409
  int status = pthread_mutex_lock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4410
  assert_status(status == 0, status, "mutex_lock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4411
  int AnyWaiters = _nParked;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4412
  assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4413
  if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4414
    AnyWaiters = 0;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4415
    pthread_cond_signal(_cond);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4416
  }
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4417
  status = pthread_mutex_unlock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4418
  assert_status(status == 0, status, "mutex_unlock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4419
  if (AnyWaiters != 0) {
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4420
    status = pthread_cond_signal(_cond);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4421
    assert_status(status == 0, status, "cond_signal");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4422
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4423
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4424
  // Note that we signal() _after dropping the lock for "immortal" Events.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4425
  // This is safe and avoids a common class of  futile wakeups.  In rare
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4426
  // circumstances this can cause a thread to return prematurely from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4427
  // cond_{timed}wait() but the spurious wakeup is benign and the victim will
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4428
  // simply re-test the condition and re-park itself.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4429
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4430
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4431
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4432
// JSR166
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4433
// -------------------------------------------------------
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
 * The solaris and bsd implementations of park/unpark are fairly
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4437
 * conservative for now, but can be improved. They currently use a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4438
 * mutex/condvar pair, plus a a count.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4439
 * Park decrements count if > 0, else does a condvar wait.  Unpark
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4440
 * sets count to 1 and signals condvar.  Only one thread ever waits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4441
 * on the condvar. Contention seen when trying to park implies that someone
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4442
 * is unparking you, so don't wait. And spurious returns are fine, so there
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4443
 * is no need to track notifications.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4444
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4445
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4446
#define MAX_SECS 100000000
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4447
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4448
 * This code is common to bsd and solaris and will be moved to a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4449
 * common place in dolphin.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4450
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4451
 * The passed in time value is either a relative time in nanoseconds
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4452
 * or an absolute time in milliseconds. Either way it has to be unpacked
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4453
 * into suitable seconds and nanoseconds components and stored in the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4454
 * given timespec structure.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4455
 * Given time is a 64-bit value and the time_t used in the timespec is only
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4456
 * a signed-32-bit value (except on 64-bit Bsd) we have to watch for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4457
 * overflow if times way in the future are given. Further on Solaris versions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4458
 * prior to 10 there is a restriction (see cond_timedwait) that the specified
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4459
 * number of seconds, in abstime, is less than current_time  + 100,000,000.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4460
 * As it will be 28 years before "now + 100000000" will overflow we can
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4461
 * ignore overflow and just impose a hard-limit on seconds using the value
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4462
 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4463
 * years from "now".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4464
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4465
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4466
static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4467
  assert (time > 0, "convertTime");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4468
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4469
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4470
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4471
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4472
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4473
  time_t max_secs = now.tv_sec + MAX_SECS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4474
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4475
  if (isAbsolute) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4476
    jlong secs = time / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4477
    if (secs > max_secs) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4478
      absTime->tv_sec = max_secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4479
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4480
    else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4481
      absTime->tv_sec = secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4482
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4483
    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4484
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4485
  else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4486
    jlong secs = time / NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4487
    if (secs >= MAX_SECS) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4488
      absTime->tv_sec = max_secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4489
      absTime->tv_nsec = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4490
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4491
    else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4492
      absTime->tv_sec = now.tv_sec + secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4493
      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4494
      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4495
        absTime->tv_nsec -= NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4496
        ++absTime->tv_sec; // note: this must be <= max_secs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4497
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4498
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4499
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4500
  assert(absTime->tv_sec >= 0, "tv_sec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4501
  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4502
  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4503
  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4504
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4505
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4506
void Parker::park(bool isAbsolute, jlong time) {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4507
  // Ideally we'd do something useful while spinning, such
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4508
  // as calling unpackTime().
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4509
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4510
  // Optional fast-path check:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4511
  // Return immediately if a permit is available.
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4512
  // We depend on Atomic::xchg() having full barrier semantics
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4513
  // 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
  4514
  if (Atomic::xchg(0, &_counter) > 0) return;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4515
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4516
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4517
  assert(thread->is_Java_thread(), "Must be JavaThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4518
  JavaThread *jt = (JavaThread *)thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4519
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4520
  // Optional optimization -- avoid state transitions if there's an interrupt pending.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4521
  // Check interrupt before trying to wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4522
  if (Thread::is_interrupted(thread, false)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4523
    return;
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
  // Next, demultiplex/decode time arguments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4527
  struct timespec absTime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4528
  if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4529
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4530
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4531
  if (time > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4532
    unpackTime(&absTime, isAbsolute, time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4533
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4534
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4535
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4536
  // Enter safepoint region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4537
  // Beware of deadlocks such as 6317397.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4538
  // The per-thread Parker:: mutex is a classic leaf-lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4539
  // In particular a thread must never block on the Threads_lock while
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4540
  // holding the Parker:: mutex.  If safepoints are pending both the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4541
  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4542
  ThreadBlockInVM tbivm(jt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4543
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4544
  // Don't wait if cannot get lock since interference arises from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4545
  // unblocking.  Also. check interrupt before trying wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4546
  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4547
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4548
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4549
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4550
  int status ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4551
  if (_counter > 0)  { // no wait needed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4552
    _counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4553
    status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4554
    assert (status == 0, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4555
    // 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
  4556
    // correctly with each other and Java-level accesses.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4557
    OrderAccess::fence();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4558
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4559
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4560
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4561
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4562
  // Don't catch signals while blocked; let the running threads have the signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4563
  // (This allows a debugger to break into the running thread.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4564
  sigset_t oldsigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4565
  sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4566
  pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4567
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4568
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4569
  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4570
  jt->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4571
  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4572
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4573
  if (time == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4574
    status = pthread_cond_wait (_cond, _mutex) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4575
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4576
    status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4577
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4578
      pthread_cond_destroy (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4579
      pthread_cond_init    (_cond, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4580
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4581
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4582
  assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4583
                status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4584
                status, "cond_timedwait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4585
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4586
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4587
  pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4588
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4589
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4590
  _counter = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4591
  status = pthread_mutex_unlock(_mutex) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4592
  assert_status(status == 0, status, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4593
  // 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
  4594
  // correctly with each other and Java-level accesses.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4595
  OrderAccess::fence();
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4596
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4597
  // If externally suspended while waiting, re-suspend
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4598
  if (jt->handle_special_suspend_equivalent_condition()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4599
    jt->java_suspend_self();
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
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4603
void Parker::unpark() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4604
  int s, status ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4605
  status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4606
  assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4607
  s = _counter;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4608
  _counter = 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4609
  if (s < 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4610
     if (WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4611
        status = pthread_cond_signal (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4612
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4613
        status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4614
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4615
     } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4616
        status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4617
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4618
        status = pthread_cond_signal (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4619
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4620
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4621
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4622
    pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4623
    assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4624
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4625
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4626
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4627
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4628
/* Darwin has no "environ" in a dynamic library. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4629
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4630
#include <crt_externs.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4631
#define environ (*_NSGetEnviron())
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4632
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4633
extern char** environ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4634
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4635
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4636
// Run the specified command in a separate process. Return its exit value,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4637
// or -1 on failure (e.g. can't fork a new process).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4638
// Unlike system(), this function can be called from signal handler. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4639
// doesn't block SIGINT et al.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4640
int os::fork_and_exec(char* cmd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4641
  const char * argv[4] = {"sh", "-c", cmd, NULL};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4642
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4643
  // fork() in BsdThreads/NPTL is not async-safe. It needs to run
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4644
  // pthread_atfork handlers and reset pthread library. All we need is a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4645
  // separate process to execve. Make a direct syscall to fork process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4646
  // 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
  4647
  // the best...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4648
  pid_t pid = fork();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4649
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4650
  if (pid < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4651
    // fork failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4652
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4653
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4654
  } else if (pid == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4655
    // child process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4656
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4657
    // execve() in BsdThreads will call pthread_kill_other_threads_np()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4658
    // first to kill every thread on the thread list. Because this list is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4659
    // not reset by fork() (see notes above), execve() will instead kill
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4660
    // every thread in the parent process. We know this is the only thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4661
    // in the new process, so make a system call directly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4662
    // IA64 should use normal execve() from glibc to match the glibc fork()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4663
    // above.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4664
    execve("/bin/sh", (char* const*)argv, environ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4665
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4666
    // execve failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4667
    _exit(-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4668
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4669
  } else  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4670
    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4671
    // care about the actual exit code, for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4672
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4673
    int status;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4674
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4675
    // Wait for the child process to exit.  This returns immediately if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4676
    // the child has already exited. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4677
    while (waitpid(pid, &status, 0) < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4678
        switch (errno) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4679
        case ECHILD: return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4680
        case EINTR: break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4681
        default: return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4682
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4683
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4684
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4685
    if (WIFEXITED(status)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4686
       // The child exited normally; get its exit code.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4687
       return WEXITSTATUS(status);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4688
    } else if (WIFSIGNALED(status)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4689
       // The child exited because of a signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4690
       // The best value to return is 0x80 + signal number,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4691
       // because that is what all Unix shells do, and because
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4692
       // it allows callers to distinguish between process exit and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4693
       // process death by signal.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4694
       return 0x80 + WTERMSIG(status);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4695
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4696
       // Unknown exit code; pass it through
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4697
       return status;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4698
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4699
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4700
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4701
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4702
// is_headless_jre()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4703
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4704
// Test for the existence of xawt/libmawt.so or libawt_xawt.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4705
// in order to report if we are running in a headless jre
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4706
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4707
// 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
  4708
// 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
  4709
//
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4710
bool os::is_headless_jre() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4711
    struct stat statbuf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4712
    char buf[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4713
    char libmawtpath[MAXPATHLEN];
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4714
    const char *xawtstr  = "/xawt/libmawt" JNI_LIB_SUFFIX;
12101
ce40623cb187 7152206: anti-delta the fix for 7152031
dcubed
parents: 12100
diff changeset
  4715
    const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4716
    char *p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4717
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4718
    // Get path to libjvm.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4719
    os::jvm_path(buf, sizeof(buf));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4720
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4721
    // Get rid of libjvm.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4722
    p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4723
    if (p == NULL) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4724
    else *p = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4725
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4726
    // Get rid of client or server
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4727
    p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4728
    if (p == NULL) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4729
    else *p = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4730
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4731
    // check xawt/libmawt.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4732
    strcpy(libmawtpath, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4733
    strcat(libmawtpath, xawtstr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4734
    if (::stat(libmawtpath, &statbuf) == 0) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4735
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4736
    // check libawt_xawt.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4737
    strcpy(libmawtpath, buf);
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4738
    strcat(libmawtpath, new_xawtstr);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4739
    if (::stat(libmawtpath, &statbuf) == 0) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4740
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4741
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4742
}
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4743
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4744
// Get the default path to the core file
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4745
// Returns the length of the string
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4746
int os::get_core_path(char* buffer, size_t bufferSize) {
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4747
  int n = jio_snprintf(buffer, bufferSize, "/cores");
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4748
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4749
  // Truncate if theoretical string was longer than bufferSize
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4750
  n = MIN2(n, (int)bufferSize);
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4751
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4752
  return n;
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4753
}
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17882
diff changeset
  4754
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4755
#ifndef PRODUCT
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4756
void TestReserveMemorySpecial_test() {
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4757
  // No tests available for this platform
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4758
}
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19532
diff changeset
  4759
#endif