src/os/bsd/vm/os_bsd.cpp

Wed, 11 Sep 2013 16:25:02 +0200

author
tschatzl
date
Wed, 11 Sep 2013 16:25:02 +0200
changeset 5701
40136aa2cdb1
parent 5578
4c84d351cca9
child 5830
2bd38d594b9a
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

never@3156 1 /*
dcubed@4471 2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
never@3156 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
never@3156 4 *
never@3156 5 * This code is free software; you can redistribute it and/or modify it
never@3156 6 * under the terms of the GNU General Public License version 2 only, as
never@3156 7 * published by the Free Software Foundation.
never@3156 8 *
never@3156 9 * This code is distributed in the hope that it will be useful, but WITHOUT
never@3156 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
never@3156 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
never@3156 12 * version 2 for more details (a copy is included in the LICENSE file that
never@3156 13 * accompanied this code).
never@3156 14 *
never@3156 15 * You should have received a copy of the GNU General Public License version
never@3156 16 * 2 along with this work; if not, write to the Free Software Foundation,
never@3156 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
never@3156 18 *
never@3156 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
never@3156 20 * or visit www.oracle.com if you need additional information or have any
never@3156 21 * questions.
never@3156 22 *
never@3156 23 */
never@3156 24
never@3156 25 // no precompiled headers
never@3156 26 #include "classfile/classLoader.hpp"
never@3156 27 #include "classfile/systemDictionary.hpp"
never@3156 28 #include "classfile/vmSymbols.hpp"
never@3156 29 #include "code/icBuffer.hpp"
never@3156 30 #include "code/vtableStubs.hpp"
never@3156 31 #include "compiler/compileBroker.hpp"
twisti@4318 32 #include "compiler/disassembler.hpp"
never@3156 33 #include "interpreter/interpreter.hpp"
never@3156 34 #include "jvm_bsd.h"
never@3156 35 #include "memory/allocation.inline.hpp"
never@3156 36 #include "memory/filemap.hpp"
never@3156 37 #include "mutex_bsd.inline.hpp"
never@3156 38 #include "oops/oop.inline.hpp"
never@3156 39 #include "os_share_bsd.hpp"
never@3156 40 #include "prims/jniFastGetField.hpp"
never@3156 41 #include "prims/jvm.h"
never@3156 42 #include "prims/jvm_misc.hpp"
never@3156 43 #include "runtime/arguments.hpp"
never@3156 44 #include "runtime/extendedPC.hpp"
never@3156 45 #include "runtime/globals.hpp"
never@3156 46 #include "runtime/interfaceSupport.hpp"
never@3156 47 #include "runtime/java.hpp"
never@3156 48 #include "runtime/javaCalls.hpp"
never@3156 49 #include "runtime/mutexLocker.hpp"
never@3156 50 #include "runtime/objectMonitor.hpp"
never@3156 51 #include "runtime/osThread.hpp"
never@3156 52 #include "runtime/perfMemory.hpp"
never@3156 53 #include "runtime/sharedRuntime.hpp"
never@3156 54 #include "runtime/statSampler.hpp"
never@3156 55 #include "runtime/stubRoutines.hpp"
stefank@4299 56 #include "runtime/thread.inline.hpp"
never@3156 57 #include "runtime/threadCritical.hpp"
never@3156 58 #include "runtime/timer.hpp"
never@3156 59 #include "services/attachListener.hpp"
zgu@4711 60 #include "services/memTracker.hpp"
never@3156 61 #include "services/runtimeService.hpp"
never@3156 62 #include "utilities/decoder.hpp"
never@3156 63 #include "utilities/defaultStream.hpp"
never@3156 64 #include "utilities/events.hpp"
never@3156 65 #include "utilities/growableArray.hpp"
never@3156 66 #include "utilities/vmError.hpp"
never@3156 67
never@3156 68 // put OS-includes here
never@3156 69 # include <sys/types.h>
never@3156 70 # include <sys/mman.h>
never@3156 71 # include <sys/stat.h>
never@3156 72 # include <sys/select.h>
never@3156 73 # include <pthread.h>
never@3156 74 # include <signal.h>
never@3156 75 # include <errno.h>
never@3156 76 # include <dlfcn.h>
never@3156 77 # include <stdio.h>
never@3156 78 # include <unistd.h>
never@3156 79 # include <sys/resource.h>
never@3156 80 # include <pthread.h>
never@3156 81 # include <sys/stat.h>
never@3156 82 # include <sys/time.h>
never@3156 83 # include <sys/times.h>
never@3156 84 # include <sys/utsname.h>
never@3156 85 # include <sys/socket.h>
never@3156 86 # include <sys/wait.h>
never@3156 87 # include <time.h>
never@3156 88 # include <pwd.h>
never@3156 89 # include <poll.h>
never@3156 90 # include <semaphore.h>
never@3156 91 # include <fcntl.h>
never@3156 92 # include <string.h>
never@3156 93 # include <sys/param.h>
never@3156 94 # include <sys/sysctl.h>
never@3156 95 # include <sys/ipc.h>
never@3156 96 # include <sys/shm.h>
never@3156 97 #ifndef __APPLE__
never@3156 98 # include <link.h>
never@3156 99 #endif
never@3156 100 # include <stdint.h>
never@3156 101 # include <inttypes.h>
never@3156 102 # include <sys/ioctl.h>
never@3156 103
never@3156 104 #if defined(__FreeBSD__) || defined(__NetBSD__)
never@3156 105 # include <elf.h>
never@3156 106 #endif
never@3156 107
never@3156 108 #ifdef __APPLE__
dcubed@3202 109 # include <mach/mach.h> // semaphore_* API
dcubed@3202 110 # include <mach-o/dyld.h>
dcubed@3202 111 # include <sys/proc_info.h>
dcubed@3202 112 # include <objc/objc-auto.h>
never@3156 113 #endif
never@3156 114
never@3156 115 #ifndef MAP_ANONYMOUS
never@3156 116 #define MAP_ANONYMOUS MAP_ANON
never@3156 117 #endif
never@3156 118
never@3156 119 #define MAX_PATH (2 * K)
never@3156 120
never@3156 121 // for timer info max values which include all bits
never@3156 122 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
never@3156 123
never@3156 124 #define LARGEPAGES_BIT (1 << 6)
never@3156 125 ////////////////////////////////////////////////////////////////////////////////
never@3156 126 // global variables
never@3156 127 julong os::Bsd::_physical_memory = 0;
never@3156 128
never@3156 129
never@3156 130 int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
never@3156 131 pthread_t os::Bsd::_main_thread;
never@3156 132 int os::Bsd::_page_size = -1;
never@3156 133
never@3156 134 static jlong initial_time_count=0;
never@3156 135
never@3156 136 static int clock_tics_per_sec = 100;
never@3156 137
never@3156 138 // For diagnostics to print a message once. see run_periodic_checks
never@3156 139 static sigset_t check_signal_done;
sla@4229 140 static bool check_signals = true;
never@3156 141
never@3156 142 static pid_t _initial_pid = 0;
never@3156 143
never@3156 144 /* Signal number used to suspend/resume a thread */
never@3156 145
never@3156 146 /* do not use any signal number less than SIGSEGV, see 4355769 */
never@3156 147 static int SR_signum = SIGUSR2;
never@3156 148 sigset_t SR_sigset;
never@3156 149
never@3156 150
never@3156 151 ////////////////////////////////////////////////////////////////////////////////
never@3156 152 // utility functions
never@3156 153
never@3156 154 static int SR_initialize();
never@3156 155
never@3156 156 julong os::available_memory() {
never@3156 157 return Bsd::available_memory();
never@3156 158 }
never@3156 159
never@3156 160 julong os::Bsd::available_memory() {
never@3156 161 // XXXBSD: this is just a stopgap implementation
never@3156 162 return physical_memory() >> 2;
never@3156 163 }
never@3156 164
never@3156 165 julong os::physical_memory() {
never@3156 166 return Bsd::physical_memory();
never@3156 167 }
never@3156 168
never@3156 169 ////////////////////////////////////////////////////////////////////////////////
never@3156 170 // environment support
never@3156 171
never@3156 172 bool os::getenv(const char* name, char* buf, int len) {
never@3156 173 const char* val = ::getenv(name);
never@3156 174 if (val != NULL && strlen(val) < (size_t)len) {
never@3156 175 strcpy(buf, val);
never@3156 176 return true;
never@3156 177 }
never@3156 178 if (len > 0) buf[0] = 0; // return a null string
never@3156 179 return false;
never@3156 180 }
never@3156 181
never@3156 182
never@3156 183 // Return true if user is running as root.
never@3156 184
never@3156 185 bool os::have_special_privileges() {
never@3156 186 static bool init = false;
never@3156 187 static bool privileges = false;
never@3156 188 if (!init) {
never@3156 189 privileges = (getuid() != geteuid()) || (getgid() != getegid());
never@3156 190 init = true;
never@3156 191 }
never@3156 192 return privileges;
never@3156 193 }
never@3156 194
never@3156 195
never@3156 196
never@3156 197 // Cpu architecture string
never@3156 198 #if defined(ZERO)
never@3156 199 static char cpu_arch[] = ZERO_LIBARCH;
never@3156 200 #elif defined(IA64)
never@3156 201 static char cpu_arch[] = "ia64";
never@3156 202 #elif defined(IA32)
never@3156 203 static char cpu_arch[] = "i386";
never@3156 204 #elif defined(AMD64)
never@3156 205 static char cpu_arch[] = "amd64";
never@3156 206 #elif defined(ARM)
never@3156 207 static char cpu_arch[] = "arm";
never@3156 208 #elif defined(PPC)
never@3156 209 static char cpu_arch[] = "ppc";
never@3156 210 #elif defined(SPARC)
never@3156 211 # ifdef _LP64
never@3156 212 static char cpu_arch[] = "sparcv9";
never@3156 213 # else
never@3156 214 static char cpu_arch[] = "sparc";
never@3156 215 # endif
never@3156 216 #else
never@3156 217 #error Add appropriate cpu_arch setting
never@3156 218 #endif
never@3156 219
phh@3473 220 // Compiler variant
phh@3473 221 #ifdef COMPILER2
phh@3473 222 #define COMPILER_VARIANT "server"
phh@3473 223 #else
phh@3473 224 #define COMPILER_VARIANT "client"
phh@3473 225 #endif
never@3156 226
sla@4229 227
never@3156 228 void os::Bsd::initialize_system_info() {
never@3156 229 int mib[2];
never@3156 230 size_t len;
never@3156 231 int cpu_val;
brutisso@4468 232 julong mem_val;
never@3156 233
never@3156 234 /* get processors count via hw.ncpus sysctl */
never@3156 235 mib[0] = CTL_HW;
never@3156 236 mib[1] = HW_NCPU;
never@3156 237 len = sizeof(cpu_val);
never@3156 238 if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
brutisso@4468 239 assert(len == sizeof(cpu_val), "unexpected data size");
never@3156 240 set_processor_count(cpu_val);
never@3156 241 }
never@3156 242 else {
never@3156 243 set_processor_count(1); // fallback
never@3156 244 }
never@3156 245
brutisso@4468 246 /* get physical memory via hw.memsize sysctl (hw.memsize is used
brutisso@4468 247 * since it returns a 64 bit value)
never@3156 248 */
never@3156 249 mib[0] = CTL_HW;
brutisso@4468 250 mib[1] = HW_MEMSIZE;
never@3156 251 len = sizeof(mem_val);
brutisso@4468 252 if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
brutisso@4468 253 assert(len == sizeof(mem_val), "unexpected data size");
never@3156 254 _physical_memory = mem_val;
brutisso@4468 255 } else {
never@3156 256 _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
brutisso@4468 257 }
never@3156 258
never@3156 259 #ifdef __OpenBSD__
never@3156 260 {
never@3156 261 // limit _physical_memory memory view on OpenBSD since
never@3156 262 // datasize rlimit restricts us anyway.
never@3156 263 struct rlimit limits;
never@3156 264 getrlimit(RLIMIT_DATA, &limits);
never@3156 265 _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
never@3156 266 }
never@3156 267 #endif
never@3156 268 }
never@3156 269
dcubed@3202 270 #ifdef __APPLE__
dcubed@3202 271 static const char *get_home() {
dcubed@3202 272 const char *home_dir = ::getenv("HOME");
dcubed@3202 273 if ((home_dir == NULL) || (*home_dir == '\0')) {
dcubed@3202 274 struct passwd *passwd_info = getpwuid(geteuid());
dcubed@3202 275 if (passwd_info != NULL) {
dcubed@3202 276 home_dir = passwd_info->pw_dir;
dcubed@3202 277 }
dcubed@3202 278 }
dcubed@3202 279
dcubed@3202 280 return home_dir;
dcubed@3202 281 }
dcubed@3202 282 #endif
dcubed@3202 283
never@3156 284 void os::init_system_properties_values() {
never@3156 285 // char arch[12];
never@3156 286 // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
never@3156 287
never@3156 288 // The next steps are taken in the product version:
never@3156 289 //
dcubed@4392 290 // Obtain the JAVA_HOME value from the location of libjvm.so.
never@3156 291 // This library should be located at:
dcubed@4392 292 // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
never@3156 293 //
never@3156 294 // If "/jre/lib/" appears at the right place in the path, then we
dcubed@4392 295 // assume libjvm.so is installed in a JDK and we use this path.
never@3156 296 //
never@3156 297 // Otherwise exit with message: "Could not create the Java virtual machine."
never@3156 298 //
never@3156 299 // The following extra steps are taken in the debugging version:
never@3156 300 //
never@3156 301 // If "/jre/lib/" does NOT appear at the right place in the path
never@3156 302 // instead of exit check for $JAVA_HOME environment variable.
never@3156 303 //
never@3156 304 // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
dcubed@4392 305 // then we append a fake suffix "hotspot/libjvm.so" to this path so
dcubed@4392 306 // it looks like libjvm.so is installed there
dcubed@4392 307 // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
never@3156 308 //
never@3156 309 // Otherwise exit.
never@3156 310 //
never@3156 311 // Important note: if the location of libjvm.so changes this
never@3156 312 // code needs to be changed accordingly.
never@3156 313
never@3156 314 // The next few definitions allow the code to be verbatim:
zgu@3900 315 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
never@3156 316 #define getenv(n) ::getenv(n)
never@3156 317
never@3156 318 /*
never@3156 319 * See ld(1):
never@3156 320 * The linker uses the following search paths to locate required
never@3156 321 * shared libraries:
never@3156 322 * 1: ...
never@3156 323 * ...
never@3156 324 * 7: The default directories, normally /lib and /usr/lib.
never@3156 325 */
never@3156 326 #ifndef DEFAULT_LIBPATH
never@3156 327 #define DEFAULT_LIBPATH "/lib:/usr/lib"
never@3156 328 #endif
never@3156 329
never@3156 330 #define EXTENSIONS_DIR "/lib/ext"
never@3156 331 #define ENDORSED_DIR "/lib/endorsed"
never@3156 332 #define REG_DIR "/usr/java/packages"
never@3156 333
dcubed@3202 334 #ifdef __APPLE__
dcubed@3202 335 #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions"
dcubed@3202 336 #define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
dcubed@3202 337 const char *user_home_dir = get_home();
dcubed@3202 338 // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir
dcubed@3202 339 int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
dcubed@3202 340 sizeof(SYS_EXTENSIONS_DIRS);
dcubed@3202 341 #endif
dcubed@3202 342
never@3156 343 {
never@3156 344 /* sysclasspath, java_home, dll_dir */
never@3156 345 {
never@3156 346 char *home_path;
never@3156 347 char *dll_path;
never@3156 348 char *pslash;
never@3156 349 char buf[MAXPATHLEN];
never@3156 350 os::jvm_path(buf, sizeof(buf));
never@3156 351
never@3156 352 // Found the full path to libjvm.so.
never@3156 353 // Now cut the path to <java_home>/jre if we can.
never@3156 354 *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */
never@3156 355 pslash = strrchr(buf, '/');
never@3156 356 if (pslash != NULL)
never@3156 357 *pslash = '\0'; /* get rid of /{client|server|hotspot} */
never@3156 358 dll_path = malloc(strlen(buf) + 1);
never@3156 359 if (dll_path == NULL)
never@3156 360 return;
never@3156 361 strcpy(dll_path, buf);
never@3156 362 Arguments::set_dll_dir(dll_path);
never@3156 363
never@3156 364 if (pslash != NULL) {
never@3156 365 pslash = strrchr(buf, '/');
never@3156 366 if (pslash != NULL) {
dcubed@3202 367 *pslash = '\0'; /* get rid of /<arch> (/lib on macosx) */
dcubed@3202 368 #ifndef __APPLE__
never@3156 369 pslash = strrchr(buf, '/');
never@3156 370 if (pslash != NULL)
never@3156 371 *pslash = '\0'; /* get rid of /lib */
dcubed@3202 372 #endif
never@3156 373 }
never@3156 374 }
never@3156 375
never@3156 376 home_path = malloc(strlen(buf) + 1);
never@3156 377 if (home_path == NULL)
never@3156 378 return;
never@3156 379 strcpy(home_path, buf);
never@3156 380 Arguments::set_java_home(home_path);
never@3156 381
never@3156 382 if (!set_boot_path('/', ':'))
never@3156 383 return;
never@3156 384 }
never@3156 385
never@3156 386 /*
never@3156 387 * Where to look for native libraries
never@3156 388 *
never@3156 389 * Note: Due to a legacy implementation, most of the library path
never@3156 390 * is set in the launcher. This was to accomodate linking restrictions
never@3156 391 * on legacy Bsd implementations (which are no longer supported).
never@3156 392 * Eventually, all the library path setting will be done here.
never@3156 393 *
never@3156 394 * However, to prevent the proliferation of improperly built native
never@3156 395 * libraries, the new path component /usr/java/packages is added here.
never@3156 396 * Eventually, all the library path setting will be done here.
never@3156 397 */
never@3156 398 {
never@3156 399 char *ld_library_path;
never@3156 400
never@3156 401 /*
never@3156 402 * Construct the invariant part of ld_library_path. Note that the
never@3156 403 * space for the colon and the trailing null are provided by the
never@3156 404 * nulls included by the sizeof operator (so actually we allocate
never@3156 405 * a byte more than necessary).
never@3156 406 */
dcubed@3202 407 #ifdef __APPLE__
dcubed@3202 408 ld_library_path = (char *) malloc(system_ext_size);
dcubed@3202 409 sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir);
dcubed@3202 410 #else
never@3156 411 ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
never@3156 412 strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
never@3156 413 sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
dcubed@3202 414 #endif
never@3156 415
never@3156 416 /*
never@3156 417 * Get the user setting of LD_LIBRARY_PATH, and prepended it. It
never@3156 418 * should always exist (until the legacy problem cited above is
never@3156 419 * addressed).
never@3156 420 */
never@3156 421 #ifdef __APPLE__
dcubed@3202 422 // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper
dcubed@3202 423 char *l = getenv("JAVA_LIBRARY_PATH");
dcubed@3202 424 if (l != NULL) {
dcubed@3202 425 char *t = ld_library_path;
dcubed@3202 426 /* That's +1 for the colon and +1 for the trailing '\0' */
dcubed@3202 427 ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
dcubed@3202 428 sprintf(ld_library_path, "%s:%s", l, t);
dcubed@3202 429 free(t);
dcubed@3202 430 }
dcubed@3202 431
never@3156 432 char *v = getenv("DYLD_LIBRARY_PATH");
never@3156 433 #else
never@3156 434 char *v = getenv("LD_LIBRARY_PATH");
never@3156 435 #endif
never@3156 436 if (v != NULL) {
never@3156 437 char *t = ld_library_path;
never@3156 438 /* That's +1 for the colon and +1 for the trailing '\0' */
never@3156 439 ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
never@3156 440 sprintf(ld_library_path, "%s:%s", v, t);
dcubed@3202 441 free(t);
never@3156 442 }
dcubed@3586 443
dcubed@3586 444 #ifdef __APPLE__
dcubed@3586 445 // Apple's Java6 has "." at the beginning of java.library.path.
dcubed@3586 446 // OpenJDK on Windows has "." at the end of java.library.path.
dcubed@3586 447 // OpenJDK on Linux and Solaris don't have "." in java.library.path
dcubed@3586 448 // at all. To ease the transition from Apple's Java6 to OpenJDK7,
dcubed@3586 449 // "." is appended to the end of java.library.path. Yes, this
dcubed@3586 450 // could cause a change in behavior, but Apple's Java6 behavior
dcubed@3586 451 // can be achieved by putting "." at the beginning of the
dcubed@3586 452 // JAVA_LIBRARY_PATH environment variable.
dcubed@3586 453 {
dcubed@3586 454 char *t = ld_library_path;
dcubed@3586 455 // that's +3 for appending ":." and the trailing '\0'
dcubed@3586 456 ld_library_path = (char *) malloc(strlen(t) + 3);
dcubed@3586 457 sprintf(ld_library_path, "%s:%s", t, ".");
dcubed@3586 458 free(t);
dcubed@3586 459 }
dcubed@3586 460 #endif
dcubed@3586 461
never@3156 462 Arguments::set_library_path(ld_library_path);
never@3156 463 }
never@3156 464
never@3156 465 /*
never@3156 466 * Extensions directories.
never@3156 467 *
never@3156 468 * Note that the space for the colon and the trailing null are provided
never@3156 469 * by the nulls included by the sizeof operator (so actually one byte more
never@3156 470 * than necessary is allocated).
never@3156 471 */
never@3156 472 {
dcubed@3202 473 #ifdef __APPLE__
dcubed@3202 474 char *buf = malloc(strlen(Arguments::get_java_home()) +
dcubed@3202 475 sizeof(EXTENSIONS_DIR) + system_ext_size);
dcubed@3202 476 sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
dcubed@3202 477 SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
dcubed@3202 478 #else
never@3156 479 char *buf = malloc(strlen(Arguments::get_java_home()) +
never@3156 480 sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
never@3156 481 sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
never@3156 482 Arguments::get_java_home());
dcubed@3202 483 #endif
dcubed@3202 484
never@3156 485 Arguments::set_ext_dirs(buf);
never@3156 486 }
never@3156 487
never@3156 488 /* Endorsed standards default directory. */
never@3156 489 {
never@3156 490 char * buf;
never@3156 491 buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
never@3156 492 sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
never@3156 493 Arguments::set_endorsed_dirs(buf);
never@3156 494 }
never@3156 495 }
never@3156 496
dcubed@3202 497 #ifdef __APPLE__
dcubed@3202 498 #undef SYS_EXTENSIONS_DIR
dcubed@3202 499 #endif
never@3156 500 #undef malloc
never@3156 501 #undef getenv
never@3156 502 #undef EXTENSIONS_DIR
never@3156 503 #undef ENDORSED_DIR
never@3156 504
never@3156 505 // Done
never@3156 506 return;
never@3156 507 }
never@3156 508
never@3156 509 ////////////////////////////////////////////////////////////////////////////////
never@3156 510 // breakpoint support
never@3156 511
never@3156 512 void os::breakpoint() {
never@3156 513 BREAKPOINT;
never@3156 514 }
never@3156 515
never@3156 516 extern "C" void breakpoint() {
never@3156 517 // use debugger to set breakpoint here
never@3156 518 }
never@3156 519
never@3156 520 ////////////////////////////////////////////////////////////////////////////////
never@3156 521 // signal support
never@3156 522
never@3156 523 debug_only(static bool signal_sets_initialized = false);
never@3156 524 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
never@3156 525
never@3156 526 bool os::Bsd::is_sig_ignored(int sig) {
never@3156 527 struct sigaction oact;
never@3156 528 sigaction(sig, (struct sigaction*)NULL, &oact);
never@3156 529 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
never@3156 530 : CAST_FROM_FN_PTR(void*, oact.sa_handler);
never@3156 531 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
never@3156 532 return true;
never@3156 533 else
never@3156 534 return false;
never@3156 535 }
never@3156 536
never@3156 537 void os::Bsd::signal_sets_init() {
never@3156 538 // Should also have an assertion stating we are still single-threaded.
never@3156 539 assert(!signal_sets_initialized, "Already initialized");
never@3156 540 // Fill in signals that are necessarily unblocked for all threads in
never@3156 541 // the VM. Currently, we unblock the following signals:
never@3156 542 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
never@3156 543 // by -Xrs (=ReduceSignalUsage));
never@3156 544 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
never@3156 545 // other threads. The "ReduceSignalUsage" boolean tells us not to alter
never@3156 546 // the dispositions or masks wrt these signals.
never@3156 547 // Programs embedding the VM that want to use the above signals for their
never@3156 548 // own purposes must, at this time, use the "-Xrs" option to prevent
never@3156 549 // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
never@3156 550 // (See bug 4345157, and other related bugs).
never@3156 551 // In reality, though, unblocking these signals is really a nop, since
never@3156 552 // these signals are not blocked by default.
never@3156 553 sigemptyset(&unblocked_sigs);
never@3156 554 sigemptyset(&allowdebug_blocked_sigs);
never@3156 555 sigaddset(&unblocked_sigs, SIGILL);
never@3156 556 sigaddset(&unblocked_sigs, SIGSEGV);
never@3156 557 sigaddset(&unblocked_sigs, SIGBUS);
never@3156 558 sigaddset(&unblocked_sigs, SIGFPE);
never@3156 559 sigaddset(&unblocked_sigs, SR_signum);
never@3156 560
never@3156 561 if (!ReduceSignalUsage) {
never@3156 562 if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
never@3156 563 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
never@3156 564 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
never@3156 565 }
never@3156 566 if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
never@3156 567 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
never@3156 568 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
never@3156 569 }
never@3156 570 if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
never@3156 571 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
never@3156 572 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
never@3156 573 }
never@3156 574 }
never@3156 575 // Fill in signals that are blocked by all but the VM thread.
never@3156 576 sigemptyset(&vm_sigs);
never@3156 577 if (!ReduceSignalUsage)
never@3156 578 sigaddset(&vm_sigs, BREAK_SIGNAL);
never@3156 579 debug_only(signal_sets_initialized = true);
never@3156 580
never@3156 581 }
never@3156 582
never@3156 583 // These are signals that are unblocked while a thread is running Java.
never@3156 584 // (For some reason, they get blocked by default.)
never@3156 585 sigset_t* os::Bsd::unblocked_signals() {
never@3156 586 assert(signal_sets_initialized, "Not initialized");
never@3156 587 return &unblocked_sigs;
never@3156 588 }
never@3156 589
never@3156 590 // These are the signals that are blocked while a (non-VM) thread is
never@3156 591 // running Java. Only the VM thread handles these signals.
never@3156 592 sigset_t* os::Bsd::vm_signals() {
never@3156 593 assert(signal_sets_initialized, "Not initialized");
never@3156 594 return &vm_sigs;
never@3156 595 }
never@3156 596
never@3156 597 // These are signals that are blocked during cond_wait to allow debugger in
never@3156 598 sigset_t* os::Bsd::allowdebug_blocked_signals() {
never@3156 599 assert(signal_sets_initialized, "Not initialized");
never@3156 600 return &allowdebug_blocked_sigs;
never@3156 601 }
never@3156 602
never@3156 603 void os::Bsd::hotspot_sigmask(Thread* thread) {
never@3156 604
never@3156 605 //Save caller's signal mask before setting VM signal mask
never@3156 606 sigset_t caller_sigmask;
never@3156 607 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
never@3156 608
never@3156 609 OSThread* osthread = thread->osthread();
never@3156 610 osthread->set_caller_sigmask(caller_sigmask);
never@3156 611
never@3156 612 pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
never@3156 613
never@3156 614 if (!ReduceSignalUsage) {
never@3156 615 if (thread->is_VM_thread()) {
never@3156 616 // Only the VM thread handles BREAK_SIGNAL ...
never@3156 617 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
never@3156 618 } else {
never@3156 619 // ... all other threads block BREAK_SIGNAL
never@3156 620 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
never@3156 621 }
never@3156 622 }
never@3156 623 }
never@3156 624
never@3156 625
never@3156 626 //////////////////////////////////////////////////////////////////////////////
never@3156 627 // create new thread
never@3156 628
never@3156 629 // check if it's safe to start a new thread
never@3156 630 static bool _thread_safety_check(Thread* thread) {
sla@4229 631 return true;
never@3156 632 }
never@3156 633
dcubed@3202 634 #ifdef __APPLE__
dcubed@3202 635 // library handle for calling objc_registerThreadWithCollector()
dcubed@3202 636 // without static linking to the libobjc library
dcubed@3202 637 #define OBJC_LIB "/usr/lib/libobjc.dylib"
dcubed@3202 638 #define OBJC_GCREGISTER "objc_registerThreadWithCollector"
dcubed@3202 639 typedef void (*objc_registerThreadWithCollector_t)();
dcubed@3202 640 extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
dcubed@3202 641 objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
dcubed@3202 642 #endif
dcubed@3202 643
sla@4564 644 #ifdef __APPLE__
sla@5563 645 static uint64_t locate_unique_thread_id(mach_port_t mach_thread_port) {
sla@4564 646 // Additional thread_id used to correlate threads in SA
sla@4564 647 thread_identifier_info_data_t m_ident_info;
sla@4564 648 mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
sla@4564 649
sla@5563 650 thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO,
sla@4564 651 (thread_info_t) &m_ident_info, &count);
sla@5563 652
sla@4564 653 return m_ident_info.thread_id;
sla@4564 654 }
sla@4564 655 #endif
sla@4564 656
never@3156 657 // Thread start routine for all newly created threads
never@3156 658 static void *java_start(Thread *thread) {
never@3156 659 // Try to randomize the cache line index of hot stack frames.
never@3156 660 // This helps when threads of the same stack traces evict each other's
never@3156 661 // cache lines. The threads can be either from the same JVM instance, or
never@3156 662 // from different JVM instances. The benefit is especially true for
never@3156 663 // processors with hyperthreading technology.
never@3156 664 static int counter = 0;
never@3156 665 int pid = os::current_process_id();
never@3156 666 alloca(((pid ^ counter++) & 7) * 128);
never@3156 667
never@3156 668 ThreadLocalStorage::set_thread(thread);
never@3156 669
never@3156 670 OSThread* osthread = thread->osthread();
never@3156 671 Monitor* sync = osthread->startThread_lock();
never@3156 672
never@3156 673 // non floating stack BsdThreads needs extra check, see above
never@3156 674 if (!_thread_safety_check(thread)) {
never@3156 675 // notify parent thread
never@3156 676 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
never@3156 677 osthread->set_state(ZOMBIE);
never@3156 678 sync->notify_all();
never@3156 679 return NULL;
never@3156 680 }
never@3156 681
sla@3587 682 #ifdef __APPLE__
sla@5563 683 // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
sla@5563 684 mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
sla@5563 685 guarantee(thread_id != 0, "thread id missing from pthreads");
sla@5563 686 osthread->set_thread_id(thread_id);
sla@5563 687
sla@5563 688 uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
sla@5563 689 guarantee(unique_thread_id != 0, "unique thread id was not found");
sla@5563 690 osthread->set_unique_thread_id(unique_thread_id);
sla@3587 691 #else
never@3156 692 // thread_id is pthread_id on BSD
never@3156 693 osthread->set_thread_id(::pthread_self());
sla@3587 694 #endif
never@3156 695 // initialize signal mask for this thread
never@3156 696 os::Bsd::hotspot_sigmask(thread);
never@3156 697
never@3156 698 // initialize floating point control register
never@3156 699 os::Bsd::init_thread_fpu_state();
never@3156 700
dcubed@3202 701 #ifdef __APPLE__
dcubed@3202 702 // register thread with objc gc
dcubed@3202 703 if (objc_registerThreadWithCollectorFunction != NULL) {
dcubed@3202 704 objc_registerThreadWithCollectorFunction();
dcubed@3202 705 }
dcubed@3202 706 #endif
dcubed@3202 707
never@3156 708 // handshaking with parent thread
never@3156 709 {
never@3156 710 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
never@3156 711
never@3156 712 // notify parent thread
never@3156 713 osthread->set_state(INITIALIZED);
never@3156 714 sync->notify_all();
never@3156 715
never@3156 716 // wait until os::start_thread()
never@3156 717 while (osthread->get_state() == INITIALIZED) {
never@3156 718 sync->wait(Mutex::_no_safepoint_check_flag);
never@3156 719 }
never@3156 720 }
never@3156 721
never@3156 722 // call one more level start routine
never@3156 723 thread->run();
never@3156 724
never@3156 725 return 0;
never@3156 726 }
never@3156 727
never@3156 728 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
never@3156 729 assert(thread->osthread() == NULL, "caller responsible");
never@3156 730
never@3156 731 // Allocate the OSThread object
never@3156 732 OSThread* osthread = new OSThread(NULL, NULL);
never@3156 733 if (osthread == NULL) {
never@3156 734 return false;
never@3156 735 }
never@3156 736
never@3156 737 // set the correct thread state
never@3156 738 osthread->set_thread_type(thr_type);
never@3156 739
never@3156 740 // Initial state is ALLOCATED but not INITIALIZED
never@3156 741 osthread->set_state(ALLOCATED);
never@3156 742
never@3156 743 thread->set_osthread(osthread);
never@3156 744
never@3156 745 // init thread attributes
never@3156 746 pthread_attr_t attr;
never@3156 747 pthread_attr_init(&attr);
never@3156 748 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
never@3156 749
never@3156 750 // stack size
never@3156 751 if (os::Bsd::supports_variable_stack_size()) {
never@3156 752 // calculate stack size if it's not specified by caller
never@3156 753 if (stack_size == 0) {
never@3156 754 stack_size = os::Bsd::default_stack_size(thr_type);
never@3156 755
never@3156 756 switch (thr_type) {
never@3156 757 case os::java_thread:
never@3156 758 // Java threads use ThreadStackSize which default value can be
never@3156 759 // changed with the flag -Xss
never@3156 760 assert (JavaThread::stack_size_at_create() > 0, "this should be set");
never@3156 761 stack_size = JavaThread::stack_size_at_create();
never@3156 762 break;
never@3156 763 case os::compiler_thread:
never@3156 764 if (CompilerThreadStackSize > 0) {
never@3156 765 stack_size = (size_t)(CompilerThreadStackSize * K);
never@3156 766 break;
never@3156 767 } // else fall through:
never@3156 768 // use VMThreadStackSize if CompilerThreadStackSize is not defined
never@3156 769 case os::vm_thread:
never@3156 770 case os::pgc_thread:
never@3156 771 case os::cgc_thread:
never@3156 772 case os::watcher_thread:
never@3156 773 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
never@3156 774 break;
never@3156 775 }
never@3156 776 }
never@3156 777
never@3156 778 stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
never@3156 779 pthread_attr_setstacksize(&attr, stack_size);
never@3156 780 } else {
never@3156 781 // let pthread_create() pick the default value.
never@3156 782 }
never@3156 783
never@3156 784 ThreadState state;
never@3156 785
never@3156 786 {
never@3156 787 pthread_t tid;
never@3156 788 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
never@3156 789
never@3156 790 pthread_attr_destroy(&attr);
never@3156 791
never@3156 792 if (ret != 0) {
never@3156 793 if (PrintMiscellaneous && (Verbose || WizardMode)) {
never@3156 794 perror("pthread_create()");
never@3156 795 }
never@3156 796 // Need to clean up stuff we've allocated so far
never@3156 797 thread->set_osthread(NULL);
never@3156 798 delete osthread;
never@3156 799 return false;
never@3156 800 }
never@3156 801
never@3156 802 // Store pthread info into the OSThread
never@3156 803 osthread->set_pthread_id(tid);
never@3156 804
never@3156 805 // Wait until child thread is either initialized or aborted
never@3156 806 {
never@3156 807 Monitor* sync_with_child = osthread->startThread_lock();
never@3156 808 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
never@3156 809 while ((state = osthread->get_state()) == ALLOCATED) {
never@3156 810 sync_with_child->wait(Mutex::_no_safepoint_check_flag);
never@3156 811 }
never@3156 812 }
never@3156 813
never@3156 814 }
never@3156 815
never@3156 816 // Aborted due to thread limit being reached
never@3156 817 if (state == ZOMBIE) {
never@3156 818 thread->set_osthread(NULL);
never@3156 819 delete osthread;
never@3156 820 return false;
never@3156 821 }
never@3156 822
never@3156 823 // The thread is returned suspended (in state INITIALIZED),
never@3156 824 // and is started higher up in the call chain
never@3156 825 assert(state == INITIALIZED, "race condition");
never@3156 826 return true;
never@3156 827 }
never@3156 828
never@3156 829 /////////////////////////////////////////////////////////////////////////////
never@3156 830 // attach existing thread
never@3156 831
never@3156 832 // bootstrap the main thread
never@3156 833 bool os::create_main_thread(JavaThread* thread) {
never@3156 834 assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
never@3156 835 return create_attached_thread(thread);
never@3156 836 }
never@3156 837
never@3156 838 bool os::create_attached_thread(JavaThread* thread) {
never@3156 839 #ifdef ASSERT
never@3156 840 thread->verify_not_published();
never@3156 841 #endif
never@3156 842
never@3156 843 // Allocate the OSThread object
never@3156 844 OSThread* osthread = new OSThread(NULL, NULL);
never@3156 845
never@3156 846 if (osthread == NULL) {
never@3156 847 return false;
never@3156 848 }
never@3156 849
never@3156 850 // Store pthread info into the OSThread
sla@3587 851 #ifdef __APPLE__
sla@5563 852 // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
sla@5563 853 mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
sla@5563 854 guarantee(thread_id != 0, "just checking");
sla@5563 855 osthread->set_thread_id(thread_id);
sla@5563 856
sla@5563 857 uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
sla@5563 858 guarantee(unique_thread_id != 0, "just checking");
sla@5563 859 osthread->set_unique_thread_id(unique_thread_id);
sla@3587 860 #else
never@3156 861 osthread->set_thread_id(::pthread_self());
sla@3587 862 #endif
never@3156 863 osthread->set_pthread_id(::pthread_self());
never@3156 864
never@3156 865 // initialize floating point control register
never@3156 866 os::Bsd::init_thread_fpu_state();
never@3156 867
never@3156 868 // Initial thread state is RUNNABLE
never@3156 869 osthread->set_state(RUNNABLE);
never@3156 870
never@3156 871 thread->set_osthread(osthread);
never@3156 872
never@3156 873 // initialize signal mask for this thread
never@3156 874 // and save the caller's signal mask
never@3156 875 os::Bsd::hotspot_sigmask(thread);
never@3156 876
never@3156 877 return true;
never@3156 878 }
never@3156 879
never@3156 880 void os::pd_start_thread(Thread* thread) {
never@3156 881 OSThread * osthread = thread->osthread();
never@3156 882 assert(osthread->get_state() != INITIALIZED, "just checking");
never@3156 883 Monitor* sync_with_child = osthread->startThread_lock();
never@3156 884 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
never@3156 885 sync_with_child->notify();
never@3156 886 }
never@3156 887
never@3156 888 // Free Bsd resources related to the OSThread
never@3156 889 void os::free_thread(OSThread* osthread) {
never@3156 890 assert(osthread != NULL, "osthread not set");
never@3156 891
never@3156 892 if (Thread::current()->osthread() == osthread) {
never@3156 893 // Restore caller's signal mask
never@3156 894 sigset_t sigmask = osthread->caller_sigmask();
never@3156 895 pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
never@3156 896 }
never@3156 897
never@3156 898 delete osthread;
never@3156 899 }
never@3156 900
never@3156 901 //////////////////////////////////////////////////////////////////////////////
never@3156 902 // thread local storage
never@3156 903
never@3156 904 int os::allocate_thread_local_storage() {
never@3156 905 pthread_key_t key;
never@3156 906 int rslt = pthread_key_create(&key, NULL);
never@3156 907 assert(rslt == 0, "cannot allocate thread local storage");
never@3156 908 return (int)key;
never@3156 909 }
never@3156 910
never@3156 911 // Note: This is currently not used by VM, as we don't destroy TLS key
never@3156 912 // on VM exit.
never@3156 913 void os::free_thread_local_storage(int index) {
never@3156 914 int rslt = pthread_key_delete((pthread_key_t)index);
never@3156 915 assert(rslt == 0, "invalid index");
never@3156 916 }
never@3156 917
never@3156 918 void os::thread_local_storage_at_put(int index, void* value) {
never@3156 919 int rslt = pthread_setspecific((pthread_key_t)index, value);
never@3156 920 assert(rslt == 0, "pthread_setspecific failed");
never@3156 921 }
never@3156 922
never@3156 923 extern "C" Thread* get_thread() {
never@3156 924 return ThreadLocalStorage::thread();
never@3156 925 }
never@3156 926
never@3156 927
never@3156 928 ////////////////////////////////////////////////////////////////////////////////
never@3156 929 // time support
never@3156 930
never@3156 931 // Time since start-up in seconds to a fine granularity.
never@3156 932 // Used by VMSelfDestructTimer and the MemProfiler.
never@3156 933 double os::elapsedTime() {
never@3156 934
never@3156 935 return (double)(os::elapsed_counter()) * 0.000001;
never@3156 936 }
never@3156 937
never@3156 938 jlong os::elapsed_counter() {
never@3156 939 timeval time;
never@3156 940 int status = gettimeofday(&time, NULL);
never@3156 941 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
never@3156 942 }
never@3156 943
never@3156 944 jlong os::elapsed_frequency() {
never@3156 945 return (1000 * 1000);
never@3156 946 }
never@3156 947
tschatzl@5204 948 bool os::supports_vtime() { return true; }
never@3156 949 bool os::enable_vtime() { return false; }
never@3156 950 bool os::vtime_enabled() { return false; }
tschatzl@5204 951
never@3156 952 double os::elapsedVTime() {
never@3156 953 // better than nothing, but not much
never@3156 954 return elapsedTime();
never@3156 955 }
never@3156 956
never@3156 957 jlong os::javaTimeMillis() {
never@3156 958 timeval time;
never@3156 959 int status = gettimeofday(&time, NULL);
never@3156 960 assert(status != -1, "bsd error");
never@3156 961 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
never@3156 962 }
never@3156 963
never@3156 964 #ifndef CLOCK_MONOTONIC
never@3156 965 #define CLOCK_MONOTONIC (1)
never@3156 966 #endif
never@3156 967
never@3156 968 #ifdef __APPLE__
never@3156 969 void os::Bsd::clock_init() {
never@3156 970 // XXXDARWIN: Investigate replacement monotonic clock
never@3156 971 }
sla@4229 972 #else
never@3156 973 void os::Bsd::clock_init() {
never@3156 974 struct timespec res;
never@3156 975 struct timespec tp;
never@3156 976 if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
never@3156 977 ::clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
never@3156 978 // yes, monotonic clock is supported
never@3156 979 _clock_gettime = ::clock_gettime;
never@3156 980 }
never@3156 981 }
never@3156 982 #endif
never@3156 983
never@3156 984
never@3156 985 jlong os::javaTimeNanos() {
never@3156 986 if (Bsd::supports_monotonic_clock()) {
never@3156 987 struct timespec tp;
never@3156 988 int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp);
never@3156 989 assert(status == 0, "gettime error");
never@3156 990 jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
never@3156 991 return result;
never@3156 992 } else {
never@3156 993 timeval time;
never@3156 994 int status = gettimeofday(&time, NULL);
never@3156 995 assert(status != -1, "bsd error");
never@3156 996 jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
never@3156 997 return 1000 * usecs;
never@3156 998 }
never@3156 999 }
never@3156 1000
never@3156 1001 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
never@3156 1002 if (Bsd::supports_monotonic_clock()) {
never@3156 1003 info_ptr->max_value = ALL_64_BITS;
never@3156 1004
never@3156 1005 // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
never@3156 1006 info_ptr->may_skip_backward = false; // not subject to resetting or drifting
never@3156 1007 info_ptr->may_skip_forward = false; // not subject to resetting or drifting
never@3156 1008 } else {
never@3156 1009 // gettimeofday - based on time in seconds since the Epoch thus does not wrap
never@3156 1010 info_ptr->max_value = ALL_64_BITS;
never@3156 1011
never@3156 1012 // gettimeofday is a real time clock so it skips
never@3156 1013 info_ptr->may_skip_backward = true;
never@3156 1014 info_ptr->may_skip_forward = true;
never@3156 1015 }
never@3156 1016
never@3156 1017 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
never@3156 1018 }
never@3156 1019
never@3156 1020 // Return the real, user, and system times in seconds from an
never@3156 1021 // arbitrary fixed point in the past.
never@3156 1022 bool os::getTimesSecs(double* process_real_time,
never@3156 1023 double* process_user_time,
never@3156 1024 double* process_system_time) {
never@3156 1025 struct tms ticks;
never@3156 1026 clock_t real_ticks = times(&ticks);
never@3156 1027
never@3156 1028 if (real_ticks == (clock_t) (-1)) {
never@3156 1029 return false;
never@3156 1030 } else {
never@3156 1031 double ticks_per_second = (double) clock_tics_per_sec;
never@3156 1032 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
never@3156 1033 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
never@3156 1034 *process_real_time = ((double) real_ticks) / ticks_per_second;
never@3156 1035
never@3156 1036 return true;
never@3156 1037 }
never@3156 1038 }
never@3156 1039
never@3156 1040
never@3156 1041 char * os::local_time_string(char *buf, size_t buflen) {
never@3156 1042 struct tm t;
never@3156 1043 time_t long_time;
never@3156 1044 time(&long_time);
never@3156 1045 localtime_r(&long_time, &t);
never@3156 1046 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
never@3156 1047 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
never@3156 1048 t.tm_hour, t.tm_min, t.tm_sec);
never@3156 1049 return buf;
never@3156 1050 }
never@3156 1051
never@3156 1052 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
never@3156 1053 return localtime_r(clock, res);
never@3156 1054 }
never@3156 1055
never@3156 1056 ////////////////////////////////////////////////////////////////////////////////
never@3156 1057 // runtime exit support
never@3156 1058
never@3156 1059 // Note: os::shutdown() might be called very early during initialization, or
never@3156 1060 // called from signal handler. Before adding something to os::shutdown(), make
never@3156 1061 // sure it is async-safe and can handle partially initialized VM.
never@3156 1062 void os::shutdown() {
never@3156 1063
never@3156 1064 // allow PerfMemory to attempt cleanup of any persistent resources
never@3156 1065 perfMemory_exit();
never@3156 1066
never@3156 1067 // needs to remove object in file system
never@3156 1068 AttachListener::abort();
never@3156 1069
never@3156 1070 // flush buffered output, finish log files
never@3156 1071 ostream_abort();
never@3156 1072
never@3156 1073 // Check for abort hook
never@3156 1074 abort_hook_t abort_hook = Arguments::abort_hook();
never@3156 1075 if (abort_hook != NULL) {
never@3156 1076 abort_hook();
never@3156 1077 }
never@3156 1078
never@3156 1079 }
never@3156 1080
never@3156 1081 // Note: os::abort() might be called very early during initialization, or
never@3156 1082 // called from signal handler. Before adding something to os::abort(), make
never@3156 1083 // sure it is async-safe and can handle partially initialized VM.
never@3156 1084 void os::abort(bool dump_core) {
never@3156 1085 os::shutdown();
never@3156 1086 if (dump_core) {
never@3156 1087 #ifndef PRODUCT
never@3156 1088 fdStream out(defaultStream::output_fd());
never@3156 1089 out.print_raw("Current thread is ");
never@3156 1090 char buf[16];
never@3156 1091 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
never@3156 1092 out.print_raw_cr(buf);
never@3156 1093 out.print_raw_cr("Dumping core ...");
never@3156 1094 #endif
never@3156 1095 ::abort(); // dump core
never@3156 1096 }
never@3156 1097
never@3156 1098 ::exit(1);
never@3156 1099 }
never@3156 1100
never@3156 1101 // Die immediately, no exit hook, no abort hook, no cleanup.
never@3156 1102 void os::die() {
never@3156 1103 // _exit() on BsdThreads only kills current thread
never@3156 1104 ::abort();
never@3156 1105 }
never@3156 1106
never@3156 1107 // unused on bsd for now.
never@3156 1108 void os::set_error_file(const char *logfile) {}
never@3156 1109
never@3156 1110
never@3156 1111 // This method is a copy of JDK's sysGetLastErrorString
never@3156 1112 // from src/solaris/hpi/src/system_md.c
never@3156 1113
never@3156 1114 size_t os::lasterror(char *buf, size_t len) {
never@3156 1115
never@3156 1116 if (errno == 0) return 0;
never@3156 1117
never@3156 1118 const char *s = ::strerror(errno);
never@3156 1119 size_t n = ::strlen(s);
never@3156 1120 if (n >= len) {
never@3156 1121 n = len - 1;
never@3156 1122 }
never@3156 1123 ::strncpy(buf, s, n);
never@3156 1124 buf[n] = '\0';
never@3156 1125 return n;
never@3156 1126 }
never@3156 1127
sla@3587 1128 intx os::current_thread_id() {
sla@3587 1129 #ifdef __APPLE__
sla@5563 1130 return (intx)::pthread_mach_thread_np(::pthread_self());
sla@3587 1131 #else
sla@3587 1132 return (intx)::pthread_self();
sla@3587 1133 #endif
sla@3587 1134 }
never@3156 1135 int os::current_process_id() {
never@3156 1136
never@3156 1137 // Under the old bsd thread library, bsd gives each thread
never@3156 1138 // its own process id. Because of this each thread will return
never@3156 1139 // a different pid if this method were to return the result
never@3156 1140 // of getpid(2). Bsd provides no api that returns the pid
never@3156 1141 // of the launcher thread for the vm. This implementation
never@3156 1142 // returns a unique pid, the pid of the launcher thread
never@3156 1143 // that starts the vm 'process'.
never@3156 1144
never@3156 1145 // Under the NPTL, getpid() returns the same pid as the
never@3156 1146 // launcher thread rather than a unique pid per thread.
never@3156 1147 // Use gettid() if you want the old pre NPTL behaviour.
never@3156 1148
never@3156 1149 // if you are looking for the result of a call to getpid() that
never@3156 1150 // returns a unique pid for the calling thread, then look at the
never@3156 1151 // OSThread::thread_id() method in osThread_bsd.hpp file
never@3156 1152
never@3156 1153 return (int)(_initial_pid ? _initial_pid : getpid());
never@3156 1154 }
never@3156 1155
never@3156 1156 // DLL functions
never@3156 1157
never@3156 1158 #define JNI_LIB_PREFIX "lib"
never@3156 1159 #ifdef __APPLE__
never@3156 1160 #define JNI_LIB_SUFFIX ".dylib"
never@3156 1161 #else
never@3156 1162 #define JNI_LIB_SUFFIX ".so"
never@3156 1163 #endif
never@3156 1164
never@3156 1165 const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
never@3156 1166
never@3156 1167 // This must be hard coded because it's the system's temporary
never@3156 1168 // directory not the java application's temp directory, ala java.io.tmpdir.
dcubed@3202 1169 #ifdef __APPLE__
dcubed@3202 1170 // macosx has a secure per-user temporary directory
dcubed@3202 1171 char temp_path_storage[PATH_MAX];
dcubed@3202 1172 const char* os::get_temp_directory() {
dcubed@3202 1173 static char *temp_path = NULL;
dcubed@3202 1174 if (temp_path == NULL) {
dcubed@3202 1175 int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
dcubed@3202 1176 if (pathSize == 0 || pathSize > PATH_MAX) {
dcubed@3202 1177 strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
dcubed@3202 1178 }
dcubed@3202 1179 temp_path = temp_path_storage;
dcubed@3202 1180 }
dcubed@3202 1181 return temp_path;
dcubed@3202 1182 }
dcubed@3202 1183 #else /* __APPLE__ */
never@3156 1184 const char* os::get_temp_directory() { return "/tmp"; }
dcubed@3202 1185 #endif /* __APPLE__ */
never@3156 1186
never@3156 1187 static bool file_exists(const char* filename) {
never@3156 1188 struct stat statbuf;
never@3156 1189 if (filename == NULL || strlen(filename) == 0) {
never@3156 1190 return false;
never@3156 1191 }
never@3156 1192 return os::stat(filename, &statbuf) == 0;
never@3156 1193 }
never@3156 1194
bpittore@4261 1195 bool os::dll_build_name(char* buffer, size_t buflen,
never@3156 1196 const char* pname, const char* fname) {
bpittore@4261 1197 bool retval = false;
never@3156 1198 // Copied from libhpi
never@3156 1199 const size_t pnamelen = pname ? strlen(pname) : 0;
never@3156 1200
bpittore@4261 1201 // Return error on buffer overflow.
never@3156 1202 if (pnamelen + strlen(fname) + strlen(JNI_LIB_PREFIX) + strlen(JNI_LIB_SUFFIX) + 2 > buflen) {
bpittore@4261 1203 return retval;
never@3156 1204 }
never@3156 1205
never@3156 1206 if (pnamelen == 0) {
never@3156 1207 snprintf(buffer, buflen, JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, fname);
bpittore@4261 1208 retval = true;
never@3156 1209 } else if (strchr(pname, *os::path_separator()) != NULL) {
never@3156 1210 int n;
never@3156 1211 char** pelements = split_path(pname, &n);
ccheung@4888 1212 if (pelements == NULL) {
dcubed@4891 1213 return false;
ccheung@4888 1214 }
never@3156 1215 for (int i = 0 ; i < n ; i++) {
never@3156 1216 // Really shouldn't be NULL, but check can't hurt
never@3156 1217 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
never@3156 1218 continue; // skip the empty path values
never@3156 1219 }
never@3156 1220 snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
never@3156 1221 pelements[i], fname);
never@3156 1222 if (file_exists(buffer)) {
bpittore@4261 1223 retval = true;
never@3156 1224 break;
never@3156 1225 }
never@3156 1226 }
never@3156 1227 // release the storage
never@3156 1228 for (int i = 0 ; i < n ; i++) {
never@3156 1229 if (pelements[i] != NULL) {
zgu@3900 1230 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
never@3156 1231 }
never@3156 1232 }
never@3156 1233 if (pelements != NULL) {
zgu@3900 1234 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
never@3156 1235 }
never@3156 1236 } else {
never@3156 1237 snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
bpittore@4261 1238 retval = true;
never@3156 1239 }
bpittore@4261 1240 return retval;
never@3156 1241 }
never@3156 1242
dcubed@4392 1243 // check if addr is inside libjvm.so
never@3156 1244 bool os::address_is_in_vm(address addr) {
never@3156 1245 static address libjvm_base_addr;
never@3156 1246 Dl_info dlinfo;
never@3156 1247
never@3156 1248 if (libjvm_base_addr == NULL) {
dcubed@5365 1249 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
dcubed@5365 1250 libjvm_base_addr = (address)dlinfo.dli_fbase;
dcubed@5365 1251 }
never@3156 1252 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
never@3156 1253 }
never@3156 1254
dcubed@5365 1255 if (dladdr((void *)addr, &dlinfo) != 0) {
never@3156 1256 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
never@3156 1257 }
never@3156 1258
never@3156 1259 return false;
never@3156 1260 }
never@3156 1261
zgu@3961 1262
zgu@3961 1263 #define MACH_MAXSYMLEN 256
zgu@3961 1264
never@3156 1265 bool os::dll_address_to_function_name(address addr, char *buf,
never@3156 1266 int buflen, int *offset) {
dcubed@5365 1267 // buf is not optional, but offset is optional
dcubed@5365 1268 assert(buf != NULL, "sanity check");
dcubed@5365 1269
never@3156 1270 Dl_info dlinfo;
zgu@3961 1271 char localbuf[MACH_MAXSYMLEN];
zgu@3961 1272
dcubed@5365 1273 if (dladdr((void*)addr, &dlinfo) != 0) {
dcubed@5365 1274 // see if we have a matching symbol
dcubed@5365 1275 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
dcubed@5365 1276 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
never@3156 1277 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
never@3156 1278 }
dcubed@5365 1279 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
dcubed@5365 1280 return true;
never@3156 1281 }
dcubed@5365 1282 // no matching symbol so try for just file info
dcubed@5365 1283 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
dcubed@5365 1284 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
dcubed@5365 1285 buf, buflen, offset, dlinfo.dli_fname)) {
dcubed@5365 1286 return true;
dcubed@5365 1287 }
dcubed@5365 1288 }
dcubed@5365 1289
dcubed@5365 1290 // Handle non-dynamic manually:
dcubed@5365 1291 if (dlinfo.dli_fbase != NULL &&
dcubed@5365 1292 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
dcubed@5365 1293 dlinfo.dli_fbase)) {
dcubed@5365 1294 if (!Decoder::demangle(localbuf, buf, buflen)) {
dcubed@5365 1295 jio_snprintf(buf, buflen, "%s", localbuf);
dcubed@5365 1296 }
dcubed@5365 1297 return true;
never@3156 1298 }
never@3156 1299 }
dcubed@5365 1300 buf[0] = '\0';
dcubed@5365 1301 if (offset != NULL) *offset = -1;
dcubed@5365 1302 return false;
dcubed@5365 1303 }
dcubed@5365 1304
dcubed@5365 1305 // ported from solaris version
dcubed@5365 1306 bool os::dll_address_to_library_name(address addr, char* buf,
dcubed@5365 1307 int buflen, int* offset) {
dcubed@5365 1308 // buf is not optional, but offset is optional
dcubed@5365 1309 assert(buf != NULL, "sanity check");
dcubed@5365 1310
dcubed@5365 1311 Dl_info dlinfo;
dcubed@5365 1312
dcubed@5365 1313 if (dladdr((void*)addr, &dlinfo) != 0) {
dcubed@5365 1314 if (dlinfo.dli_fname != NULL) {
dcubed@5365 1315 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
dcubed@5365 1316 }
dcubed@5365 1317 if (dlinfo.dli_fbase != NULL && offset != NULL) {
dcubed@5365 1318 *offset = addr - (address)dlinfo.dli_fbase;
zgu@3961 1319 }
zgu@3961 1320 return true;
zgu@3961 1321 }
dcubed@5365 1322
dcubed@5365 1323 buf[0] = '\0';
dcubed@5365 1324 if (offset) *offset = -1;
never@3156 1325 return false;
never@3156 1326 }
never@3156 1327
sla@4229 1328 // Loads .dll/.so and
sla@4229 1329 // in case of error it checks if .dll/.so was built for the
sla@4229 1330 // same architecture as Hotspot is running on
never@3156 1331
never@3156 1332 #ifdef __APPLE__
never@3156 1333 void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
never@3156 1334 void * result= ::dlopen(filename, RTLD_LAZY);
never@3156 1335 if (result != NULL) {
never@3156 1336 // Successful loading
never@3156 1337 return result;
never@3156 1338 }
never@3156 1339
never@3156 1340 // Read system error message into ebuf
never@3156 1341 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
never@3156 1342 ebuf[ebuflen-1]='\0';
never@3156 1343
never@3156 1344 return NULL;
never@3156 1345 }
never@3156 1346 #else
never@3156 1347 void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
never@3156 1348 {
never@3156 1349 void * result= ::dlopen(filename, RTLD_LAZY);
never@3156 1350 if (result != NULL) {
never@3156 1351 // Successful loading
never@3156 1352 return result;
never@3156 1353 }
never@3156 1354
never@3156 1355 Elf32_Ehdr elf_head;
never@3156 1356
never@3156 1357 // Read system error message into ebuf
never@3156 1358 // It may or may not be overwritten below
never@3156 1359 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
never@3156 1360 ebuf[ebuflen-1]='\0';
never@3156 1361 int diag_msg_max_length=ebuflen-strlen(ebuf);
never@3156 1362 char* diag_msg_buf=ebuf+strlen(ebuf);
never@3156 1363
never@3156 1364 if (diag_msg_max_length==0) {
never@3156 1365 // No more space in ebuf for additional diagnostics message
never@3156 1366 return NULL;
never@3156 1367 }
never@3156 1368
never@3156 1369
never@3156 1370 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
never@3156 1371
never@3156 1372 if (file_descriptor < 0) {
never@3156 1373 // Can't open library, report dlerror() message
never@3156 1374 return NULL;
never@3156 1375 }
never@3156 1376
never@3156 1377 bool failed_to_read_elf_head=
never@3156 1378 (sizeof(elf_head)!=
never@3156 1379 (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
never@3156 1380
never@3156 1381 ::close(file_descriptor);
never@3156 1382 if (failed_to_read_elf_head) {
never@3156 1383 // file i/o error - report dlerror() msg
never@3156 1384 return NULL;
never@3156 1385 }
never@3156 1386
never@3156 1387 typedef struct {
never@3156 1388 Elf32_Half code; // Actual value as defined in elf.h
never@3156 1389 Elf32_Half compat_class; // Compatibility of archs at VM's sense
never@3156 1390 char elf_class; // 32 or 64 bit
never@3156 1391 char endianess; // MSB or LSB
never@3156 1392 char* name; // String representation
never@3156 1393 } arch_t;
never@3156 1394
never@3156 1395 #ifndef EM_486
never@3156 1396 #define EM_486 6 /* Intel 80486 */
never@3156 1397 #endif
never@3156 1398
never@3156 1399 #ifndef EM_MIPS_RS3_LE
never@3156 1400 #define EM_MIPS_RS3_LE 10 /* MIPS */
never@3156 1401 #endif
never@3156 1402
never@3156 1403 #ifndef EM_PPC64
never@3156 1404 #define EM_PPC64 21 /* PowerPC64 */
never@3156 1405 #endif
never@3156 1406
never@3156 1407 #ifndef EM_S390
never@3156 1408 #define EM_S390 22 /* IBM System/390 */
never@3156 1409 #endif
never@3156 1410
never@3156 1411 #ifndef EM_IA_64
never@3156 1412 #define EM_IA_64 50 /* HP/Intel IA-64 */
never@3156 1413 #endif
never@3156 1414
never@3156 1415 #ifndef EM_X86_64
never@3156 1416 #define EM_X86_64 62 /* AMD x86-64 */
never@3156 1417 #endif
never@3156 1418
never@3156 1419 static const arch_t arch_array[]={
never@3156 1420 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
never@3156 1421 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
never@3156 1422 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
never@3156 1423 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
never@3156 1424 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
never@3156 1425 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
never@3156 1426 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
never@3156 1427 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
never@3156 1428 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
never@3156 1429 {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"},
never@3156 1430 {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
never@3156 1431 {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
never@3156 1432 {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
never@3156 1433 {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
never@3156 1434 {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
never@3156 1435 {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
never@3156 1436 };
never@3156 1437
never@3156 1438 #if (defined IA32)
never@3156 1439 static Elf32_Half running_arch_code=EM_386;
never@3156 1440 #elif (defined AMD64)
never@3156 1441 static Elf32_Half running_arch_code=EM_X86_64;
never@3156 1442 #elif (defined IA64)
never@3156 1443 static Elf32_Half running_arch_code=EM_IA_64;
never@3156 1444 #elif (defined __sparc) && (defined _LP64)
never@3156 1445 static Elf32_Half running_arch_code=EM_SPARCV9;
never@3156 1446 #elif (defined __sparc) && (!defined _LP64)
never@3156 1447 static Elf32_Half running_arch_code=EM_SPARC;
never@3156 1448 #elif (defined __powerpc64__)
never@3156 1449 static Elf32_Half running_arch_code=EM_PPC64;
never@3156 1450 #elif (defined __powerpc__)
never@3156 1451 static Elf32_Half running_arch_code=EM_PPC;
never@3156 1452 #elif (defined ARM)
never@3156 1453 static Elf32_Half running_arch_code=EM_ARM;
never@3156 1454 #elif (defined S390)
never@3156 1455 static Elf32_Half running_arch_code=EM_S390;
never@3156 1456 #elif (defined ALPHA)
never@3156 1457 static Elf32_Half running_arch_code=EM_ALPHA;
never@3156 1458 #elif (defined MIPSEL)
never@3156 1459 static Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
never@3156 1460 #elif (defined PARISC)
never@3156 1461 static Elf32_Half running_arch_code=EM_PARISC;
never@3156 1462 #elif (defined MIPS)
never@3156 1463 static Elf32_Half running_arch_code=EM_MIPS;
never@3156 1464 #elif (defined M68K)
never@3156 1465 static Elf32_Half running_arch_code=EM_68K;
never@3156 1466 #else
never@3156 1467 #error Method os::dll_load requires that one of following is defined:\
never@3156 1468 IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
never@3156 1469 #endif
never@3156 1470
never@3156 1471 // Identify compatability class for VM's architecture and library's architecture
never@3156 1472 // Obtain string descriptions for architectures
never@3156 1473
never@3156 1474 arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
never@3156 1475 int running_arch_index=-1;
never@3156 1476
never@3156 1477 for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
never@3156 1478 if (running_arch_code == arch_array[i].code) {
never@3156 1479 running_arch_index = i;
never@3156 1480 }
never@3156 1481 if (lib_arch.code == arch_array[i].code) {
never@3156 1482 lib_arch.compat_class = arch_array[i].compat_class;
never@3156 1483 lib_arch.name = arch_array[i].name;
never@3156 1484 }
never@3156 1485 }
never@3156 1486
never@3156 1487 assert(running_arch_index != -1,
never@3156 1488 "Didn't find running architecture code (running_arch_code) in arch_array");
never@3156 1489 if (running_arch_index == -1) {
never@3156 1490 // Even though running architecture detection failed
never@3156 1491 // we may still continue with reporting dlerror() message
never@3156 1492 return NULL;
never@3156 1493 }
never@3156 1494
never@3156 1495 if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
never@3156 1496 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
never@3156 1497 return NULL;
never@3156 1498 }
never@3156 1499
never@3156 1500 #ifndef S390
never@3156 1501 if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
never@3156 1502 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
never@3156 1503 return NULL;
never@3156 1504 }
never@3156 1505 #endif // !S390
never@3156 1506
never@3156 1507 if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
never@3156 1508 if ( lib_arch.name!=NULL ) {
never@3156 1509 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
never@3156 1510 " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
never@3156 1511 lib_arch.name, arch_array[running_arch_index].name);
never@3156 1512 } else {
never@3156 1513 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
never@3156 1514 " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
never@3156 1515 lib_arch.code,
never@3156 1516 arch_array[running_arch_index].name);
never@3156 1517 }
never@3156 1518 }
never@3156 1519
never@3156 1520 return NULL;
never@3156 1521 }
never@3156 1522 #endif /* !__APPLE__ */
never@3156 1523
never@3156 1524 // XXX: Do we need a lock around this as per Linux?
never@3156 1525 void* os::dll_lookup(void* handle, const char* name) {
never@3156 1526 return dlsym(handle, name);
never@3156 1527 }
never@3156 1528
never@3156 1529
never@3156 1530 static bool _print_ascii_file(const char* filename, outputStream* st) {
never@3156 1531 int fd = ::open(filename, O_RDONLY);
never@3156 1532 if (fd == -1) {
never@3156 1533 return false;
never@3156 1534 }
never@3156 1535
never@3156 1536 char buf[32];
never@3156 1537 int bytes;
never@3156 1538 while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
never@3156 1539 st->print_raw(buf, bytes);
never@3156 1540 }
never@3156 1541
never@3156 1542 ::close(fd);
never@3156 1543
never@3156 1544 return true;
never@3156 1545 }
never@3156 1546
never@3156 1547 void os::print_dll_info(outputStream *st) {
dcubed@5365 1548 st->print_cr("Dynamic libraries:");
never@3156 1549 #ifdef RTLD_DI_LINKMAP
dcubed@5365 1550 Dl_info dli;
dcubed@5365 1551 void *handle;
dcubed@5365 1552 Link_map *map;
dcubed@5365 1553 Link_map *p;
dcubed@5365 1554
dcubed@5365 1555 if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
dcubed@5365 1556 dli.dli_fname == NULL) {
dcubed@5365 1557 st->print_cr("Error: Cannot print dynamic libraries.");
dcubed@5365 1558 return;
dcubed@5365 1559 }
dcubed@5365 1560 handle = dlopen(dli.dli_fname, RTLD_LAZY);
dcubed@5365 1561 if (handle == NULL) {
dcubed@5365 1562 st->print_cr("Error: Cannot print dynamic libraries.");
dcubed@5365 1563 return;
dcubed@5365 1564 }
dcubed@5365 1565 dlinfo(handle, RTLD_DI_LINKMAP, &map);
dcubed@5365 1566 if (map == NULL) {
dcubed@5365 1567 st->print_cr("Error: Cannot print dynamic libraries.");
dcubed@5365 1568 return;
dcubed@5365 1569 }
dcubed@5365 1570
dcubed@5365 1571 while (map->l_prev != NULL)
dcubed@5365 1572 map = map->l_prev;
dcubed@5365 1573
dcubed@5365 1574 while (map != NULL) {
dcubed@5365 1575 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
dcubed@5365 1576 map = map->l_next;
dcubed@5365 1577 }
dcubed@5365 1578
dcubed@5365 1579 dlclose(handle);
never@3156 1580 #elif defined(__APPLE__)
dcubed@5365 1581 uint32_t count;
dcubed@5365 1582 uint32_t i;
dcubed@5365 1583
dcubed@5365 1584 count = _dyld_image_count();
dcubed@5365 1585 for (i = 1; i < count; i++) {
dcubed@5365 1586 const char *name = _dyld_get_image_name(i);
dcubed@5365 1587 intptr_t slide = _dyld_get_image_vmaddr_slide(i);
dcubed@5365 1588 st->print_cr(PTR_FORMAT " \t%s", slide, name);
dcubed@5365 1589 }
never@3156 1590 #else
dcubed@5365 1591 st->print_cr("Error: Cannot print dynamic libraries.");
never@3156 1592 #endif
never@3156 1593 }
never@3156 1594
nloodin@3783 1595 void os::print_os_info_brief(outputStream* st) {
nloodin@3783 1596 st->print("Bsd");
nloodin@3783 1597
nloodin@3783 1598 os::Posix::print_uname_info(st);
nloodin@3783 1599 }
never@3156 1600
never@3156 1601 void os::print_os_info(outputStream* st) {
never@3156 1602 st->print("OS:");
nloodin@3783 1603 st->print("Bsd");
nloodin@3783 1604
nloodin@3783 1605 os::Posix::print_uname_info(st);
nloodin@3783 1606
nloodin@3783 1607 os::Posix::print_rlimit_info(st);
nloodin@3783 1608
nloodin@3783 1609 os::Posix::print_load_average(st);
never@3156 1610 }
never@3156 1611
never@3156 1612 void os::pd_print_cpu_info(outputStream* st) {
never@3156 1613 // Nothing to do for now.
never@3156 1614 }
never@3156 1615
never@3156 1616 void os::print_memory_info(outputStream* st) {
never@3156 1617
never@3156 1618 st->print("Memory:");
never@3156 1619 st->print(" %dk page", os::vm_page_size()>>10);
never@3156 1620
never@3156 1621 st->print(", physical " UINT64_FORMAT "k",
never@3156 1622 os::physical_memory() >> 10);
never@3156 1623 st->print("(" UINT64_FORMAT "k free)",
never@3156 1624 os::available_memory() >> 10);
never@3156 1625 st->cr();
never@3156 1626
never@3156 1627 // meminfo
never@3156 1628 st->print("\n/proc/meminfo:\n");
never@3156 1629 _print_ascii_file("/proc/meminfo", st);
never@3156 1630 st->cr();
never@3156 1631 }
never@3156 1632
never@3156 1633 // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific
never@3156 1634 // but they're the same for all the bsd arch that we support
never@3156 1635 // and they're the same for solaris but there's no common place to put this.
never@3156 1636 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
never@3156 1637 "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
never@3156 1638 "ILL_COPROC", "ILL_BADSTK" };
never@3156 1639
never@3156 1640 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
never@3156 1641 "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
never@3156 1642 "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" };
never@3156 1643
never@3156 1644 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
never@3156 1645
never@3156 1646 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
never@3156 1647
never@3156 1648 void os::print_siginfo(outputStream* st, void* siginfo) {
never@3156 1649 st->print("siginfo:");
never@3156 1650
never@3156 1651 const int buflen = 100;
never@3156 1652 char buf[buflen];
never@3156 1653 siginfo_t *si = (siginfo_t*)siginfo;
never@3156 1654 st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
never@3156 1655 if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) {
never@3156 1656 st->print("si_errno=%s", buf);
never@3156 1657 } else {
never@3156 1658 st->print("si_errno=%d", si->si_errno);
never@3156 1659 }
never@3156 1660 const int c = si->si_code;
never@3156 1661 assert(c > 0, "unexpected si_code");
never@3156 1662 switch (si->si_signo) {
never@3156 1663 case SIGILL:
never@3156 1664 st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
never@3156 1665 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
never@3156 1666 break;
never@3156 1667 case SIGFPE:
never@3156 1668 st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
never@3156 1669 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
never@3156 1670 break;
never@3156 1671 case SIGSEGV:
never@3156 1672 st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
never@3156 1673 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
never@3156 1674 break;
never@3156 1675 case SIGBUS:
never@3156 1676 st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
never@3156 1677 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
never@3156 1678 break;
never@3156 1679 default:
never@3156 1680 st->print(", si_code=%d", si->si_code);
never@3156 1681 // no si_addr
never@3156 1682 }
never@3156 1683
never@3156 1684 if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
never@3156 1685 UseSharedSpaces) {
never@3156 1686 FileMapInfo* mapinfo = FileMapInfo::current_info();
never@3156 1687 if (mapinfo->is_in_shared_space(si->si_addr)) {
never@3156 1688 st->print("\n\nError accessing class data sharing archive." \
never@3156 1689 " Mapped file inaccessible during execution, " \
never@3156 1690 " possible disk/network problem.");
never@3156 1691 }
never@3156 1692 }
never@3156 1693 st->cr();
never@3156 1694 }
never@3156 1695
never@3156 1696
never@3156 1697 static void print_signal_handler(outputStream* st, int sig,
never@3156 1698 char* buf, size_t buflen);
never@3156 1699
never@3156 1700 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
never@3156 1701 st->print_cr("Signal Handlers:");
never@3156 1702 print_signal_handler(st, SIGSEGV, buf, buflen);
never@3156 1703 print_signal_handler(st, SIGBUS , buf, buflen);
never@3156 1704 print_signal_handler(st, SIGFPE , buf, buflen);
never@3156 1705 print_signal_handler(st, SIGPIPE, buf, buflen);
never@3156 1706 print_signal_handler(st, SIGXFSZ, buf, buflen);
never@3156 1707 print_signal_handler(st, SIGILL , buf, buflen);
never@3156 1708 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
never@3156 1709 print_signal_handler(st, SR_signum, buf, buflen);
never@3156 1710 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
never@3156 1711 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
never@3156 1712 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
never@3156 1713 print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
never@3156 1714 }
never@3156 1715
never@3156 1716 static char saved_jvm_path[MAXPATHLEN] = {0};
never@3156 1717
dcubed@4392 1718 // Find the full path to the current module, libjvm
never@3156 1719 void os::jvm_path(char *buf, jint buflen) {
never@3156 1720 // Error checking.
never@3156 1721 if (buflen < MAXPATHLEN) {
never@3156 1722 assert(false, "must use a large-enough buffer");
never@3156 1723 buf[0] = '\0';
never@3156 1724 return;
never@3156 1725 }
never@3156 1726 // Lazy resolve the path to current module.
never@3156 1727 if (saved_jvm_path[0] != 0) {
never@3156 1728 strcpy(buf, saved_jvm_path);
never@3156 1729 return;
never@3156 1730 }
never@3156 1731
never@3156 1732 char dli_fname[MAXPATHLEN];
never@3156 1733 bool ret = dll_address_to_library_name(
never@3156 1734 CAST_FROM_FN_PTR(address, os::jvm_path),
never@3156 1735 dli_fname, sizeof(dli_fname), NULL);
dcubed@5365 1736 assert(ret, "cannot locate libjvm");
dcubed@5365 1737 char *rp = NULL;
dcubed@5365 1738 if (ret && dli_fname[0] != '\0') {
dcubed@5365 1739 rp = realpath(dli_fname, buf);
dcubed@5365 1740 }
never@3156 1741 if (rp == NULL)
never@3156 1742 return;
never@3156 1743
never@3156 1744 if (Arguments::created_by_gamma_launcher()) {
never@3156 1745 // Support for the gamma launcher. Typical value for buf is
phh@3473 1746 // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm". If "/jre/lib/" appears at
never@3156 1747 // the right place in the string, then assume we are installed in a JDK and
phh@3473 1748 // we're done. Otherwise, check for a JAVA_HOME environment variable and
phh@3473 1749 // construct a path to the JVM being overridden.
phh@3473 1750
never@3156 1751 const char *p = buf + strlen(buf) - 1;
never@3156 1752 for (int count = 0; p > buf && count < 5; ++count) {
never@3156 1753 for (--p; p > buf && *p != '/'; --p)
never@3156 1754 /* empty */ ;
never@3156 1755 }
never@3156 1756
never@3156 1757 if (strncmp(p, "/jre/lib/", 9) != 0) {
never@3156 1758 // Look for JAVA_HOME in the environment.
never@3156 1759 char* java_home_var = ::getenv("JAVA_HOME");
never@3156 1760 if (java_home_var != NULL && java_home_var[0] != 0) {
never@3156 1761 char* jrelib_p;
never@3156 1762 int len;
never@3156 1763
dcubed@4392 1764 // Check the current module name "libjvm"
never@3156 1765 p = strrchr(buf, '/');
never@3156 1766 assert(strstr(p, "/libjvm") == p, "invalid library name");
never@3156 1767
never@3156 1768 rp = realpath(java_home_var, buf);
never@3156 1769 if (rp == NULL)
never@3156 1770 return;
never@3156 1771
never@3156 1772 // determine if this is a legacy image or modules image
never@3156 1773 // modules image doesn't have "jre" subdirectory
never@3156 1774 len = strlen(buf);
never@3156 1775 jrelib_p = buf + len;
phh@3473 1776
phh@3473 1777 // Add the appropriate library subdir
phh@3473 1778 snprintf(jrelib_p, buflen-len, "/jre/lib");
never@3156 1779 if (0 != access(buf, F_OK)) {
phh@3473 1780 snprintf(jrelib_p, buflen-len, "/lib");
never@3156 1781 }
never@3156 1782
phh@3473 1783 // Add the appropriate client or server subdir
phh@3473 1784 len = strlen(buf);
phh@3473 1785 jrelib_p = buf + len;
phh@3473 1786 snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
phh@3473 1787 if (0 != access(buf, F_OK)) {
phh@3473 1788 snprintf(jrelib_p, buflen-len, "");
phh@3473 1789 }
phh@3473 1790
phh@3473 1791 // If the path exists within JAVA_HOME, add the JVM library name
phh@3473 1792 // to complete the path to JVM being overridden. Otherwise fallback
phh@3473 1793 // to the path to the current library.
never@3156 1794 if (0 == access(buf, F_OK)) {
dcubed@4392 1795 // Use current module name "libjvm"
never@3156 1796 len = strlen(buf);
dcubed@4392 1797 snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
never@3156 1798 } else {
phh@3473 1799 // Fall back to path of current library
never@3156 1800 rp = realpath(dli_fname, buf);
never@3156 1801 if (rp == NULL)
never@3156 1802 return;
never@3156 1803 }
never@3156 1804 }
never@3156 1805 }
never@3156 1806 }
never@3156 1807
never@3156 1808 strcpy(saved_jvm_path, buf);
never@3156 1809 }
never@3156 1810
never@3156 1811 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
never@3156 1812 // no prefix required, not even "_"
never@3156 1813 }
never@3156 1814
never@3156 1815 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
never@3156 1816 // no suffix required
never@3156 1817 }
never@3156 1818
never@3156 1819 ////////////////////////////////////////////////////////////////////////////////
never@3156 1820 // sun.misc.Signal support
never@3156 1821
never@3156 1822 static volatile jint sigint_count = 0;
never@3156 1823
never@3156 1824 static void
never@3156 1825 UserHandler(int sig, void *siginfo, void *context) {
never@3156 1826 // 4511530 - sem_post is serialized and handled by the manager thread. When
never@3156 1827 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
never@3156 1828 // don't want to flood the manager thread with sem_post requests.
never@3156 1829 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
never@3156 1830 return;
never@3156 1831
never@3156 1832 // Ctrl-C is pressed during error reporting, likely because the error
never@3156 1833 // handler fails to abort. Let VM die immediately.
never@3156 1834 if (sig == SIGINT && is_error_reported()) {
never@3156 1835 os::die();
never@3156 1836 }
never@3156 1837
never@3156 1838 os::signal_notify(sig);
never@3156 1839 }
never@3156 1840
never@3156 1841 void* os::user_handler() {
never@3156 1842 return CAST_FROM_FN_PTR(void*, UserHandler);
never@3156 1843 }
never@3156 1844
never@3156 1845 extern "C" {
never@3156 1846 typedef void (*sa_handler_t)(int);
never@3156 1847 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
never@3156 1848 }
never@3156 1849
never@3156 1850 void* os::signal(int signal_number, void* handler) {
never@3156 1851 struct sigaction sigAct, oldSigAct;
never@3156 1852
never@3156 1853 sigfillset(&(sigAct.sa_mask));
never@3156 1854 sigAct.sa_flags = SA_RESTART|SA_SIGINFO;
never@3156 1855 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
never@3156 1856
never@3156 1857 if (sigaction(signal_number, &sigAct, &oldSigAct)) {
never@3156 1858 // -1 means registration failed
never@3156 1859 return (void *)-1;
never@3156 1860 }
never@3156 1861
never@3156 1862 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
never@3156 1863 }
never@3156 1864
never@3156 1865 void os::signal_raise(int signal_number) {
never@3156 1866 ::raise(signal_number);
never@3156 1867 }
never@3156 1868
never@3156 1869 /*
never@3156 1870 * The following code is moved from os.cpp for making this
never@3156 1871 * code platform specific, which it is by its very nature.
never@3156 1872 */
never@3156 1873
never@3156 1874 // Will be modified when max signal is changed to be dynamic
never@3156 1875 int os::sigexitnum_pd() {
never@3156 1876 return NSIG;
never@3156 1877 }
never@3156 1878
never@3156 1879 // a counter for each possible signal value
never@3156 1880 static volatile jint pending_signals[NSIG+1] = { 0 };
never@3156 1881
never@3156 1882 // Bsd(POSIX) specific hand shaking semaphore.
never@3156 1883 #ifdef __APPLE__
sla@5237 1884 typedef semaphore_t os_semaphore_t;
never@3156 1885 #define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
sla@5237 1886 #define SEM_WAIT(sem) semaphore_wait(sem)
sla@5237 1887 #define SEM_POST(sem) semaphore_signal(sem)
sla@5237 1888 #define SEM_DESTROY(sem) semaphore_destroy(mach_task_self(), sem)
never@3156 1889 #else
sla@5237 1890 typedef sem_t os_semaphore_t;
never@3156 1891 #define SEM_INIT(sem, value) sem_init(&sem, 0, value)
sla@5237 1892 #define SEM_WAIT(sem) sem_wait(&sem)
sla@5237 1893 #define SEM_POST(sem) sem_post(&sem)
sla@5237 1894 #define SEM_DESTROY(sem) sem_destroy(&sem)
never@3156 1895 #endif
never@3156 1896
sla@5237 1897 class Semaphore : public StackObj {
sla@5237 1898 public:
sla@5237 1899 Semaphore();
sla@5237 1900 ~Semaphore();
sla@5237 1901 void signal();
sla@5237 1902 void wait();
sla@5237 1903 bool trywait();
sla@5237 1904 bool timedwait(unsigned int sec, int nsec);
sla@5237 1905 private:
sla@5237 1906 jlong currenttime() const;
sla@5237 1907 semaphore_t _semaphore;
sla@5237 1908 };
sla@5237 1909
sla@5237 1910 Semaphore::Semaphore() : _semaphore(0) {
sla@5237 1911 SEM_INIT(_semaphore, 0);
sla@5237 1912 }
sla@5237 1913
sla@5237 1914 Semaphore::~Semaphore() {
sla@5237 1915 SEM_DESTROY(_semaphore);
sla@5237 1916 }
sla@5237 1917
sla@5237 1918 void Semaphore::signal() {
sla@5237 1919 SEM_POST(_semaphore);
sla@5237 1920 }
sla@5237 1921
sla@5237 1922 void Semaphore::wait() {
sla@5237 1923 SEM_WAIT(_semaphore);
sla@5237 1924 }
sla@5237 1925
sla@5237 1926 jlong Semaphore::currenttime() const {
sla@5237 1927 struct timeval tv;
sla@5237 1928 gettimeofday(&tv, NULL);
sla@5237 1929 return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000);
sla@5237 1930 }
sla@5237 1931
sla@5237 1932 #ifdef __APPLE__
sla@5237 1933 bool Semaphore::trywait() {
sla@5237 1934 return timedwait(0, 0);
sla@5237 1935 }
sla@5237 1936
sla@5237 1937 bool Semaphore::timedwait(unsigned int sec, int nsec) {
sla@5237 1938 kern_return_t kr = KERN_ABORTED;
sla@5237 1939 mach_timespec_t waitspec;
sla@5237 1940 waitspec.tv_sec = sec;
sla@5237 1941 waitspec.tv_nsec = nsec;
sla@5237 1942
sla@5237 1943 jlong starttime = currenttime();
sla@5237 1944
sla@5237 1945 kr = semaphore_timedwait(_semaphore, waitspec);
sla@5237 1946 while (kr == KERN_ABORTED) {
sla@5237 1947 jlong totalwait = (sec * NANOSECS_PER_SEC) + nsec;
sla@5237 1948
sla@5237 1949 jlong current = currenttime();
sla@5237 1950 jlong passedtime = current - starttime;
sla@5237 1951
sla@5237 1952 if (passedtime >= totalwait) {
sla@5237 1953 waitspec.tv_sec = 0;
sla@5237 1954 waitspec.tv_nsec = 0;
sla@5237 1955 } else {
sla@5237 1956 jlong waittime = totalwait - (current - starttime);
sla@5237 1957 waitspec.tv_sec = waittime / NANOSECS_PER_SEC;
sla@5237 1958 waitspec.tv_nsec = waittime % NANOSECS_PER_SEC;
sla@5237 1959 }
sla@5237 1960
sla@5237 1961 kr = semaphore_timedwait(_semaphore, waitspec);
sla@5237 1962 }
sla@5237 1963
sla@5237 1964 return kr == KERN_SUCCESS;
sla@5237 1965 }
sla@5237 1966
sla@5237 1967 #else
sla@5237 1968
sla@5237 1969 bool Semaphore::trywait() {
sla@5237 1970 return sem_trywait(&_semaphore) == 0;
sla@5237 1971 }
sla@5237 1972
sla@5237 1973 bool Semaphore::timedwait(unsigned int sec, int nsec) {
sla@5237 1974 struct timespec ts;
sla@5237 1975 jlong endtime = unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
sla@5237 1976
sla@5237 1977 while (1) {
sla@5237 1978 int result = sem_timedwait(&_semaphore, &ts);
sla@5237 1979 if (result == 0) {
sla@5237 1980 return true;
sla@5237 1981 } else if (errno == EINTR) {
sla@5237 1982 continue;
sla@5237 1983 } else if (errno == ETIMEDOUT) {
sla@5237 1984 return false;
sla@5237 1985 } else {
sla@5237 1986 return false;
sla@5237 1987 }
sla@5237 1988 }
sla@5237 1989 }
sla@5237 1990
sla@5237 1991 #endif // __APPLE__
sla@5237 1992
sla@5237 1993 static os_semaphore_t sig_sem;
sla@5237 1994 static Semaphore sr_semaphore;
sla@5237 1995
never@3156 1996 void os::signal_init_pd() {
never@3156 1997 // Initialize signal structures
never@3156 1998 ::memset((void*)pending_signals, 0, sizeof(pending_signals));
never@3156 1999
never@3156 2000 // Initialize signal semaphore
never@3156 2001 ::SEM_INIT(sig_sem, 0);
never@3156 2002 }
never@3156 2003
never@3156 2004 void os::signal_notify(int sig) {
never@3156 2005 Atomic::inc(&pending_signals[sig]);
never@3156 2006 ::SEM_POST(sig_sem);
never@3156 2007 }
never@3156 2008
never@3156 2009 static int check_pending_signals(bool wait) {
never@3156 2010 Atomic::store(0, &sigint_count);
never@3156 2011 for (;;) {
never@3156 2012 for (int i = 0; i < NSIG + 1; i++) {
never@3156 2013 jint n = pending_signals[i];
never@3156 2014 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
never@3156 2015 return i;
never@3156 2016 }
never@3156 2017 }
never@3156 2018 if (!wait) {
never@3156 2019 return -1;
never@3156 2020 }
never@3156 2021 JavaThread *thread = JavaThread::current();
never@3156 2022 ThreadBlockInVM tbivm(thread);
never@3156 2023
never@3156 2024 bool threadIsSuspended;
never@3156 2025 do {
never@3156 2026 thread->set_suspend_equivalent();
never@3156 2027 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
never@3156 2028 ::SEM_WAIT(sig_sem);
never@3156 2029
never@3156 2030 // were we externally suspended while we were waiting?
never@3156 2031 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
never@3156 2032 if (threadIsSuspended) {
never@3156 2033 //
never@3156 2034 // The semaphore has been incremented, but while we were waiting
never@3156 2035 // another thread suspended us. We don't want to continue running
never@3156 2036 // while suspended because that would surprise the thread that
never@3156 2037 // suspended us.
never@3156 2038 //
never@3156 2039 ::SEM_POST(sig_sem);
never@3156 2040
never@3156 2041 thread->java_suspend_self();
never@3156 2042 }
never@3156 2043 } while (threadIsSuspended);
never@3156 2044 }
never@3156 2045 }
never@3156 2046
never@3156 2047 int os::signal_lookup() {
never@3156 2048 return check_pending_signals(false);
never@3156 2049 }
never@3156 2050
never@3156 2051 int os::signal_wait() {
never@3156 2052 return check_pending_signals(true);
never@3156 2053 }
never@3156 2054
never@3156 2055 ////////////////////////////////////////////////////////////////////////////////
never@3156 2056 // Virtual Memory
never@3156 2057
never@3156 2058 int os::vm_page_size() {
never@3156 2059 // Seems redundant as all get out
never@3156 2060 assert(os::Bsd::page_size() != -1, "must call os::init");
never@3156 2061 return os::Bsd::page_size();
never@3156 2062 }
never@3156 2063
never@3156 2064 // Solaris allocates memory by pages.
never@3156 2065 int os::vm_allocation_granularity() {
never@3156 2066 assert(os::Bsd::page_size() != -1, "must call os::init");
never@3156 2067 return os::Bsd::page_size();
never@3156 2068 }
never@3156 2069
never@3156 2070 // Rationale behind this function:
never@3156 2071 // current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
never@3156 2072 // mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
never@3156 2073 // samples for JITted code. Here we create private executable mapping over the code cache
never@3156 2074 // and then we can use standard (well, almost, as mapping can change) way to provide
never@3156 2075 // info for the reporting script by storing timestamp and location of symbol
never@3156 2076 void bsd_wrap_code(char* base, size_t size) {
never@3156 2077 static volatile jint cnt = 0;
never@3156 2078
never@3156 2079 if (!UseOprofile) {
never@3156 2080 return;
never@3156 2081 }
never@3156 2082
never@3156 2083 char buf[PATH_MAX + 1];
never@3156 2084 int num = Atomic::add(1, &cnt);
never@3156 2085
never@3156 2086 snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
never@3156 2087 os::get_temp_directory(), os::current_process_id(), num);
never@3156 2088 unlink(buf);
never@3156 2089
never@3156 2090 int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
never@3156 2091
never@3156 2092 if (fd != -1) {
never@3156 2093 off_t rv = ::lseek(fd, size-2, SEEK_SET);
never@3156 2094 if (rv != (off_t)-1) {
never@3156 2095 if (::write(fd, "", 1) == 1) {
never@3156 2096 mmap(base, size,
never@3156 2097 PROT_READ|PROT_WRITE|PROT_EXEC,
never@3156 2098 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
never@3156 2099 }
never@3156 2100 }
never@3156 2101 ::close(fd);
never@3156 2102 unlink(buf);
never@3156 2103 }
never@3156 2104 }
never@3156 2105
dcubed@5255 2106 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
dcubed@5255 2107 int err) {
dcubed@5255 2108 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
dcubed@5255 2109 ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
dcubed@5255 2110 strerror(err), err);
dcubed@5255 2111 }
dcubed@5255 2112
never@3156 2113 // NOTE: Bsd kernel does not really reserve the pages for us.
never@3156 2114 // All it does is to check if there are enough free pages
never@3156 2115 // left at the time of mmap(). This could be a potential
never@3156 2116 // problem.
zgu@3900 2117 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
never@3156 2118 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
never@3156 2119 #ifdef __OpenBSD__
never@3156 2120 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
dcubed@5255 2121 if (::mprotect(addr, size, prot) == 0) {
dcubed@5255 2122 return true;
dcubed@5255 2123 }
never@3156 2124 #else
never@3156 2125 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
never@3156 2126 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
dcubed@5255 2127 if (res != (uintptr_t) MAP_FAILED) {
dcubed@5255 2128 return true;
dcubed@5255 2129 }
never@3156 2130 #endif
dcubed@5255 2131
dcubed@5255 2132 // Warn about any commit errors we see in non-product builds just
dcubed@5255 2133 // in case mmap() doesn't work as described on the man page.
dcubed@5255 2134 NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);)
dcubed@5255 2135
dcubed@5255 2136 return false;
never@3156 2137 }
never@3156 2138
zgu@3900 2139 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
never@3156 2140 bool exec) {
dcubed@5255 2141 // alignment_hint is ignored on this OS
dcubed@5255 2142 return pd_commit_memory(addr, size, exec);
dcubed@5255 2143 }
dcubed@5255 2144
dcubed@5255 2145 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
dcubed@5255 2146 const char* mesg) {
dcubed@5255 2147 assert(mesg != NULL, "mesg must be specified");
dcubed@5255 2148 if (!pd_commit_memory(addr, size, exec)) {
dcubed@5255 2149 // add extra info in product mode for vm_exit_out_of_memory():
dcubed@5255 2150 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
dcubed@5255 2151 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
dcubed@5255 2152 }
dcubed@5255 2153 }
dcubed@5255 2154
dcubed@5255 2155 void os::pd_commit_memory_or_exit(char* addr, size_t size,
dcubed@5255 2156 size_t alignment_hint, bool exec,
dcubed@5255 2157 const char* mesg) {
dcubed@5255 2158 // alignment_hint is ignored on this OS
dcubed@5255 2159 pd_commit_memory_or_exit(addr, size, exec, mesg);
never@3156 2160 }
never@3156 2161
zgu@3900 2162 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
never@3156 2163 }
never@3156 2164
zgu@3900 2165 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
never@3156 2166 ::madvise(addr, bytes, MADV_DONTNEED);
never@3156 2167 }
never@3156 2168
never@3156 2169 void os::numa_make_global(char *addr, size_t bytes) {
never@3156 2170 }
never@3156 2171
never@3156 2172 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
never@3156 2173 }
never@3156 2174
never@3156 2175 bool os::numa_topology_changed() { return false; }
never@3156 2176
never@3156 2177 size_t os::numa_get_groups_num() {
never@3156 2178 return 1;
never@3156 2179 }
never@3156 2180
never@3156 2181 int os::numa_get_group_id() {
never@3156 2182 return 0;
never@3156 2183 }
never@3156 2184
never@3156 2185 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
never@3156 2186 if (size > 0) {
never@3156 2187 ids[0] = 0;
never@3156 2188 return 1;
never@3156 2189 }
never@3156 2190 return 0;
never@3156 2191 }
never@3156 2192
never@3156 2193 bool os::get_page_info(char *start, page_info* info) {
never@3156 2194 return false;
never@3156 2195 }
never@3156 2196
never@3156 2197 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
never@3156 2198 return end;
never@3156 2199 }
never@3156 2200
never@3156 2201
zgu@3900 2202 bool os::pd_uncommit_memory(char* addr, size_t size) {
never@3156 2203 #ifdef __OpenBSD__
never@3156 2204 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
never@3156 2205 return ::mprotect(addr, size, PROT_NONE) == 0;
never@3156 2206 #else
never@3156 2207 uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
never@3156 2208 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
never@3156 2209 return res != (uintptr_t) MAP_FAILED;
never@3156 2210 #endif
never@3156 2211 }
never@3156 2212
zgu@3900 2213 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
dcubed@5255 2214 return os::commit_memory(addr, size, !ExecMem);
never@3156 2215 }
never@3156 2216
never@3156 2217 // If this is a growable mapping, remove the guard pages entirely by
never@3156 2218 // munmap()ping them. If not, just call uncommit_memory().
never@3156 2219 bool os::remove_stack_guard_pages(char* addr, size_t size) {
never@3156 2220 return os::uncommit_memory(addr, size);
never@3156 2221 }
never@3156 2222
never@3156 2223 static address _highest_vm_reserved_address = NULL;
never@3156 2224
never@3156 2225 // If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
never@3156 2226 // at 'requested_addr'. If there are existing memory mappings at the same
never@3156 2227 // location, however, they will be overwritten. If 'fixed' is false,
never@3156 2228 // 'requested_addr' is only treated as a hint, the return value may or
never@3156 2229 // may not start from the requested address. Unlike Bsd mmap(), this
never@3156 2230 // function returns NULL to indicate failure.
never@3156 2231 static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
never@3156 2232 char * addr;
never@3156 2233 int flags;
never@3156 2234
never@3156 2235 flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
never@3156 2236 if (fixed) {
never@3156 2237 assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
never@3156 2238 flags |= MAP_FIXED;
never@3156 2239 }
never@3156 2240
mikael@4989 2241 // Map reserved/uncommitted pages PROT_NONE so we fail early if we
mikael@4989 2242 // touch an uncommitted page. Otherwise, the read/write might
mikael@4989 2243 // succeed if we have enough swap space to back the physical page.
mikael@4989 2244 addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
never@3156 2245 flags, -1, 0);
never@3156 2246
never@3156 2247 if (addr != MAP_FAILED) {
never@3156 2248 // anon_mmap() should only get called during VM initialization,
never@3156 2249 // don't need lock (actually we can skip locking even it can be called
never@3156 2250 // from multiple threads, because _highest_vm_reserved_address is just a
never@3156 2251 // hint about the upper limit of non-stack memory regions.)
never@3156 2252 if ((address)addr + bytes > _highest_vm_reserved_address) {
never@3156 2253 _highest_vm_reserved_address = (address)addr + bytes;
never@3156 2254 }
never@3156 2255 }
never@3156 2256
never@3156 2257 return addr == MAP_FAILED ? NULL : addr;
never@3156 2258 }
never@3156 2259
never@3156 2260 // Don't update _highest_vm_reserved_address, because there might be memory
never@3156 2261 // regions above addr + size. If so, releasing a memory region only creates
never@3156 2262 // a hole in the address space, it doesn't help prevent heap-stack collision.
never@3156 2263 //
never@3156 2264 static int anon_munmap(char * addr, size_t size) {
never@3156 2265 return ::munmap(addr, size) == 0;
never@3156 2266 }
never@3156 2267
zgu@3900 2268 char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
never@3156 2269 size_t alignment_hint) {
never@3156 2270 return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
never@3156 2271 }
never@3156 2272
zgu@3900 2273 bool os::pd_release_memory(char* addr, size_t size) {
never@3156 2274 return anon_munmap(addr, size);
never@3156 2275 }
never@3156 2276
never@3156 2277 static bool bsd_mprotect(char* addr, size_t size, int prot) {
never@3156 2278 // Bsd wants the mprotect address argument to be page aligned.
never@3156 2279 char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
never@3156 2280
never@3156 2281 // According to SUSv3, mprotect() should only be used with mappings
never@3156 2282 // established by mmap(), and mmap() always maps whole pages. Unaligned
never@3156 2283 // 'addr' likely indicates problem in the VM (e.g. trying to change
never@3156 2284 // protection of malloc'ed or statically allocated memory). Check the
never@3156 2285 // caller if you hit this assert.
never@3156 2286 assert(addr == bottom, "sanity check");
never@3156 2287
never@3156 2288 size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
never@3156 2289 return ::mprotect(bottom, size, prot) == 0;
never@3156 2290 }
never@3156 2291
never@3156 2292 // Set protections specified
never@3156 2293 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
never@3156 2294 bool is_committed) {
never@3156 2295 unsigned int p = 0;
never@3156 2296 switch (prot) {
never@3156 2297 case MEM_PROT_NONE: p = PROT_NONE; break;
never@3156 2298 case MEM_PROT_READ: p = PROT_READ; break;
never@3156 2299 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
never@3156 2300 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
never@3156 2301 default:
never@3156 2302 ShouldNotReachHere();
never@3156 2303 }
never@3156 2304 // is_committed is unused.
never@3156 2305 return bsd_mprotect(addr, bytes, p);
never@3156 2306 }
never@3156 2307
never@3156 2308 bool os::guard_memory(char* addr, size_t size) {
never@3156 2309 return bsd_mprotect(addr, size, PROT_NONE);
never@3156 2310 }
never@3156 2311
never@3156 2312 bool os::unguard_memory(char* addr, size_t size) {
never@3156 2313 return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
never@3156 2314 }
never@3156 2315
never@3156 2316 bool os::Bsd::hugetlbfs_sanity_check(bool warn, size_t page_size) {
sla@4229 2317 return false;
never@3156 2318 }
never@3156 2319
never@3156 2320 // Large page support
never@3156 2321
never@3156 2322 static size_t _large_page_size = 0;
never@3156 2323
never@3156 2324 void os::large_page_init() {
never@3156 2325 }
never@3156 2326
never@3156 2327
stefank@5578 2328 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
stefank@5578 2329 fatal("This code is not used or maintained.");
stefank@5578 2330
never@3156 2331 // "exec" is passed in but not used. Creating the shared image for
never@3156 2332 // the code cache doesn't have an SHM_X executable permission to check.
never@3156 2333 assert(UseLargePages && UseSHM, "only for SHM large pages");
never@3156 2334
never@3156 2335 key_t key = IPC_PRIVATE;
never@3156 2336 char *addr;
never@3156 2337
never@3156 2338 bool warn_on_failure = UseLargePages &&
never@3156 2339 (!FLAG_IS_DEFAULT(UseLargePages) ||
never@3156 2340 !FLAG_IS_DEFAULT(LargePageSizeInBytes)
never@3156 2341 );
never@3156 2342 char msg[128];
never@3156 2343
never@3156 2344 // Create a large shared memory region to attach to based on size.
never@3156 2345 // Currently, size is the total size of the heap
never@3156 2346 int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
never@3156 2347 if (shmid == -1) {
never@3156 2348 // Possible reasons for shmget failure:
never@3156 2349 // 1. shmmax is too small for Java heap.
never@3156 2350 // > check shmmax value: cat /proc/sys/kernel/shmmax
never@3156 2351 // > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
never@3156 2352 // 2. not enough large page memory.
never@3156 2353 // > check available large pages: cat /proc/meminfo
never@3156 2354 // > increase amount of large pages:
never@3156 2355 // echo new_value > /proc/sys/vm/nr_hugepages
never@3156 2356 // Note 1: different Bsd may use different name for this property,
never@3156 2357 // e.g. on Redhat AS-3 it is "hugetlb_pool".
never@3156 2358 // Note 2: it's possible there's enough physical memory available but
never@3156 2359 // they are so fragmented after a long run that they can't
never@3156 2360 // coalesce into large pages. Try to reserve large pages when
never@3156 2361 // the system is still "fresh".
never@3156 2362 if (warn_on_failure) {
never@3156 2363 jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
never@3156 2364 warning(msg);
never@3156 2365 }
never@3156 2366 return NULL;
never@3156 2367 }
never@3156 2368
never@3156 2369 // attach to the region
never@3156 2370 addr = (char*)shmat(shmid, req_addr, 0);
never@3156 2371 int err = errno;
never@3156 2372
never@3156 2373 // Remove shmid. If shmat() is successful, the actual shared memory segment
never@3156 2374 // will be deleted when it's detached by shmdt() or when the process
never@3156 2375 // terminates. If shmat() is not successful this will remove the shared
never@3156 2376 // segment immediately.
never@3156 2377 shmctl(shmid, IPC_RMID, NULL);
never@3156 2378
never@3156 2379 if ((intptr_t)addr == -1) {
never@3156 2380 if (warn_on_failure) {
never@3156 2381 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
never@3156 2382 warning(msg);
never@3156 2383 }
never@3156 2384 return NULL;
never@3156 2385 }
never@3156 2386
zgu@4711 2387 // The memory is committed
zgu@5272 2388 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
zgu@4711 2389
never@3156 2390 return addr;
never@3156 2391 }
never@3156 2392
never@3156 2393 bool os::release_memory_special(char* base, size_t bytes) {
zgu@5272 2394 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
never@3156 2395 // detaching the SHM segment will also delete it, see reserve_memory_special()
never@3156 2396 int rslt = shmdt(base);
zgu@4711 2397 if (rslt == 0) {
zgu@5272 2398 tkr.record((address)base, bytes);
zgu@4711 2399 return true;
zgu@4711 2400 } else {
zgu@5272 2401 tkr.discard();
zgu@4711 2402 return false;
zgu@4711 2403 }
zgu@4711 2404
never@3156 2405 }
never@3156 2406
never@3156 2407 size_t os::large_page_size() {
never@3156 2408 return _large_page_size;
never@3156 2409 }
never@3156 2410
never@3156 2411 // HugeTLBFS allows application to commit large page memory on demand;
never@3156 2412 // with SysV SHM the entire memory region must be allocated as shared
never@3156 2413 // memory.
never@3156 2414 bool os::can_commit_large_page_memory() {
never@3156 2415 return UseHugeTLBFS;
never@3156 2416 }
never@3156 2417
never@3156 2418 bool os::can_execute_large_page_memory() {
never@3156 2419 return UseHugeTLBFS;
never@3156 2420 }
never@3156 2421
never@3156 2422 // Reserve memory at an arbitrary address, only if that area is
never@3156 2423 // available (and not reserved for something else).
never@3156 2424
zgu@3900 2425 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
never@3156 2426 const int max_tries = 10;
never@3156 2427 char* base[max_tries];
never@3156 2428 size_t size[max_tries];
never@3156 2429 const size_t gap = 0x000000;
never@3156 2430
never@3156 2431 // Assert only that the size is a multiple of the page size, since
never@3156 2432 // that's all that mmap requires, and since that's all we really know
never@3156 2433 // about at this low abstraction level. If we need higher alignment,
never@3156 2434 // we can either pass an alignment to this method or verify alignment
never@3156 2435 // in one of the methods further up the call chain. See bug 5044738.
never@3156 2436 assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
never@3156 2437
never@3156 2438 // Repeatedly allocate blocks until the block is allocated at the
never@3156 2439 // right spot. Give up after max_tries. Note that reserve_memory() will
never@3156 2440 // automatically update _highest_vm_reserved_address if the call is
never@3156 2441 // successful. The variable tracks the highest memory address every reserved
never@3156 2442 // by JVM. It is used to detect heap-stack collision if running with
never@3156 2443 // fixed-stack BsdThreads. Because here we may attempt to reserve more
never@3156 2444 // space than needed, it could confuse the collision detecting code. To
never@3156 2445 // solve the problem, save current _highest_vm_reserved_address and
never@3156 2446 // calculate the correct value before return.
never@3156 2447 address old_highest = _highest_vm_reserved_address;
never@3156 2448
never@3156 2449 // Bsd mmap allows caller to pass an address as hint; give it a try first,
never@3156 2450 // if kernel honors the hint then we can return immediately.
never@3156 2451 char * addr = anon_mmap(requested_addr, bytes, false);
never@3156 2452 if (addr == requested_addr) {
never@3156 2453 return requested_addr;
never@3156 2454 }
never@3156 2455
never@3156 2456 if (addr != NULL) {
never@3156 2457 // mmap() is successful but it fails to reserve at the requested address
never@3156 2458 anon_munmap(addr, bytes);
never@3156 2459 }
never@3156 2460
never@3156 2461 int i;
never@3156 2462 for (i = 0; i < max_tries; ++i) {
never@3156 2463 base[i] = reserve_memory(bytes);
never@3156 2464
never@3156 2465 if (base[i] != NULL) {
never@3156 2466 // Is this the block we wanted?
never@3156 2467 if (base[i] == requested_addr) {
never@3156 2468 size[i] = bytes;
never@3156 2469 break;
never@3156 2470 }
never@3156 2471
never@3156 2472 // Does this overlap the block we wanted? Give back the overlapped
never@3156 2473 // parts and try again.
never@3156 2474
never@3156 2475 size_t top_overlap = requested_addr + (bytes + gap) - base[i];
never@3156 2476 if (top_overlap >= 0 && top_overlap < bytes) {
never@3156 2477 unmap_memory(base[i], top_overlap);
never@3156 2478 base[i] += top_overlap;
never@3156 2479 size[i] = bytes - top_overlap;
never@3156 2480 } else {
never@3156 2481 size_t bottom_overlap = base[i] + bytes - requested_addr;
never@3156 2482 if (bottom_overlap >= 0 && bottom_overlap < bytes) {
never@3156 2483 unmap_memory(requested_addr, bottom_overlap);
never@3156 2484 size[i] = bytes - bottom_overlap;
never@3156 2485 } else {
never@3156 2486 size[i] = bytes;
never@3156 2487 }
never@3156 2488 }
never@3156 2489 }
never@3156 2490 }
never@3156 2491
never@3156 2492 // Give back the unused reserved pieces.
never@3156 2493
never@3156 2494 for (int j = 0; j < i; ++j) {
never@3156 2495 if (base[j] != NULL) {
never@3156 2496 unmap_memory(base[j], size[j]);
never@3156 2497 }
never@3156 2498 }
never@3156 2499
never@3156 2500 if (i < max_tries) {
never@3156 2501 _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
never@3156 2502 return requested_addr;
never@3156 2503 } else {
never@3156 2504 _highest_vm_reserved_address = old_highest;
never@3156 2505 return NULL;
never@3156 2506 }
never@3156 2507 }
never@3156 2508
never@3156 2509 size_t os::read(int fd, void *buf, unsigned int nBytes) {
never@3156 2510 RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
never@3156 2511 }
never@3156 2512
never@3156 2513 // TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
never@3156 2514 // Solaris uses poll(), bsd uses park().
never@3156 2515 // Poll() is likely a better choice, assuming that Thread.interrupt()
never@3156 2516 // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
never@3156 2517 // SIGSEGV, see 4355769.
never@3156 2518
never@3156 2519 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
never@3156 2520 assert(thread == Thread::current(), "thread consistency check");
never@3156 2521
never@3156 2522 ParkEvent * const slp = thread->_SleepEvent ;
never@3156 2523 slp->reset() ;
never@3156 2524 OrderAccess::fence() ;
never@3156 2525
never@3156 2526 if (interruptible) {
never@3156 2527 jlong prevtime = javaTimeNanos();
never@3156 2528
never@3156 2529 for (;;) {
never@3156 2530 if (os::is_interrupted(thread, true)) {
never@3156 2531 return OS_INTRPT;
never@3156 2532 }
never@3156 2533
never@3156 2534 jlong newtime = javaTimeNanos();
never@3156 2535
never@3156 2536 if (newtime - prevtime < 0) {
never@3156 2537 // time moving backwards, should only happen if no monotonic clock
never@3156 2538 // not a guarantee() because JVM should not abort on kernel/glibc bugs
never@3156 2539 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
never@3156 2540 } else {
johnc@3339 2541 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
never@3156 2542 }
never@3156 2543
never@3156 2544 if(millis <= 0) {
never@3156 2545 return OS_OK;
never@3156 2546 }
never@3156 2547
never@3156 2548 prevtime = newtime;
never@3156 2549
never@3156 2550 {
never@3156 2551 assert(thread->is_Java_thread(), "sanity check");
never@3156 2552 JavaThread *jt = (JavaThread *) thread;
never@3156 2553 ThreadBlockInVM tbivm(jt);
never@3156 2554 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
never@3156 2555
never@3156 2556 jt->set_suspend_equivalent();
never@3156 2557 // cleared by handle_special_suspend_equivalent_condition() or
never@3156 2558 // java_suspend_self() via check_and_wait_while_suspended()
never@3156 2559
never@3156 2560 slp->park(millis);
never@3156 2561
never@3156 2562 // were we externally suspended while we were waiting?
never@3156 2563 jt->check_and_wait_while_suspended();
never@3156 2564 }
never@3156 2565 }
never@3156 2566 } else {
never@3156 2567 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
never@3156 2568 jlong prevtime = javaTimeNanos();
never@3156 2569
never@3156 2570 for (;;) {
never@3156 2571 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
never@3156 2572 // the 1st iteration ...
never@3156 2573 jlong newtime = javaTimeNanos();
never@3156 2574
never@3156 2575 if (newtime - prevtime < 0) {
never@3156 2576 // time moving backwards, should only happen if no monotonic clock
never@3156 2577 // not a guarantee() because JVM should not abort on kernel/glibc bugs
never@3156 2578 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
never@3156 2579 } else {
johnc@3339 2580 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
never@3156 2581 }
never@3156 2582
never@3156 2583 if(millis <= 0) break ;
never@3156 2584
never@3156 2585 prevtime = newtime;
never@3156 2586 slp->park(millis);
never@3156 2587 }
never@3156 2588 return OS_OK ;
never@3156 2589 }
never@3156 2590 }
never@3156 2591
never@3156 2592 int os::naked_sleep() {
never@3156 2593 // %% make the sleep time an integer flag. for now use 1 millisec.
never@3156 2594 return os::sleep(Thread::current(), 1, false);
never@3156 2595 }
never@3156 2596
never@3156 2597 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
never@3156 2598 void os::infinite_sleep() {
never@3156 2599 while (true) { // sleep forever ...
never@3156 2600 ::sleep(100); // ... 100 seconds at a time
never@3156 2601 }
never@3156 2602 }
never@3156 2603
never@3156 2604 // Used to convert frequent JVM_Yield() to nops
never@3156 2605 bool os::dont_yield() {
never@3156 2606 return DontYieldALot;
never@3156 2607 }
never@3156 2608
never@3156 2609 void os::yield() {
never@3156 2610 sched_yield();
never@3156 2611 }
never@3156 2612
never@3156 2613 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
never@3156 2614
never@3156 2615 void os::yield_all(int attempts) {
never@3156 2616 // Yields to all threads, including threads with lower priorities
never@3156 2617 // Threads on Bsd are all with same priority. The Solaris style
never@3156 2618 // os::yield_all() with nanosleep(1ms) is not necessary.
never@3156 2619 sched_yield();
never@3156 2620 }
never@3156 2621
never@3156 2622 // Called from the tight loops to possibly influence time-sharing heuristics
never@3156 2623 void os::loop_breaker(int attempts) {
never@3156 2624 os::yield_all(attempts);
never@3156 2625 }
never@3156 2626
never@3156 2627 ////////////////////////////////////////////////////////////////////////////////
never@3156 2628 // thread priority support
never@3156 2629
never@3156 2630 // Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
never@3156 2631 // only supports dynamic priority, static priority must be zero. For real-time
never@3156 2632 // applications, Bsd supports SCHED_RR which allows static priority (1-99).
never@3156 2633 // However, for large multi-threaded applications, SCHED_RR is not only slower
never@3156 2634 // than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
never@3156 2635 // of 5 runs - Sep 2005).
never@3156 2636 //
never@3156 2637 // The following code actually changes the niceness of kernel-thread/LWP. It
never@3156 2638 // has an assumption that setpriority() only modifies one kernel-thread/LWP,
never@3156 2639 // not the entire user process, and user level threads are 1:1 mapped to kernel
never@3156 2640 // threads. It has always been the case, but could change in the future. For
never@3156 2641 // this reason, the code should not be used as default (ThreadPriorityPolicy=0).
never@3156 2642 // It is only used when ThreadPriorityPolicy=1 and requires root privilege.
never@3156 2643
sla@4229 2644 #if !defined(__APPLE__)
phh@3481 2645 int os::java_to_os_priority[CriticalPriority + 1] = {
never@3156 2646 19, // 0 Entry should never be used
never@3156 2647
never@3156 2648 0, // 1 MinPriority
never@3156 2649 3, // 2
never@3156 2650 6, // 3
never@3156 2651
phh@3481 2652 10, // 4
phh@3481 2653 15, // 5 NormPriority
phh@3481 2654 18, // 6
phh@3481 2655
phh@3481 2656 21, // 7
phh@3481 2657 25, // 8
phh@3481 2658 28, // 9 NearMaxPriority
phh@3481 2659
phh@3481 2660 31, // 10 MaxPriority
phh@3481 2661
phh@3481 2662 31 // 11 CriticalPriority
never@3156 2663 };
sla@4229 2664 #else
never@3156 2665 /* Using Mach high-level priority assignments */
phh@3481 2666 int os::java_to_os_priority[CriticalPriority + 1] = {
never@3156 2667 0, // 0 Entry should never be used (MINPRI_USER)
never@3156 2668
never@3156 2669 27, // 1 MinPriority
never@3156 2670 28, // 2
never@3156 2671 29, // 3
never@3156 2672
never@3156 2673 30, // 4
never@3156 2674 31, // 5 NormPriority (BASEPRI_DEFAULT)
never@3156 2675 32, // 6
never@3156 2676
never@3156 2677 33, // 7
never@3156 2678 34, // 8
never@3156 2679 35, // 9 NearMaxPriority
never@3156 2680
phh@3481 2681 36, // 10 MaxPriority
phh@3481 2682
phh@3481 2683 36 // 11 CriticalPriority
never@3156 2684 };
never@3156 2685 #endif
never@3156 2686
never@3156 2687 static int prio_init() {
never@3156 2688 if (ThreadPriorityPolicy == 1) {
never@3156 2689 // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
never@3156 2690 // if effective uid is not root. Perhaps, a more elegant way of doing
never@3156 2691 // this is to test CAP_SYS_NICE capability, but that will require libcap.so
never@3156 2692 if (geteuid() != 0) {
never@3156 2693 if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
never@3156 2694 warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
never@3156 2695 }
never@3156 2696 ThreadPriorityPolicy = 0;
never@3156 2697 }
never@3156 2698 }
phh@3481 2699 if (UseCriticalJavaThreadPriority) {
phh@3481 2700 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
phh@3481 2701 }
never@3156 2702 return 0;
never@3156 2703 }
never@3156 2704
never@3156 2705 OSReturn os::set_native_priority(Thread* thread, int newpri) {
never@3156 2706 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
never@3156 2707
never@3156 2708 #ifdef __OpenBSD__
never@3156 2709 // OpenBSD pthread_setprio starves low priority threads
never@3156 2710 return OS_OK;
never@3156 2711 #elif defined(__FreeBSD__)
never@3156 2712 int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
never@3156 2713 #elif defined(__APPLE__) || defined(__NetBSD__)
never@3156 2714 struct sched_param sp;
never@3156 2715 int policy;
never@3156 2716 pthread_t self = pthread_self();
never@3156 2717
never@3156 2718 if (pthread_getschedparam(self, &policy, &sp) != 0)
never@3156 2719 return OS_ERR;
never@3156 2720
never@3156 2721 sp.sched_priority = newpri;
never@3156 2722 if (pthread_setschedparam(self, policy, &sp) != 0)
never@3156 2723 return OS_ERR;
never@3156 2724
never@3156 2725 return OS_OK;
never@3156 2726 #else
never@3156 2727 int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
never@3156 2728 return (ret == 0) ? OS_OK : OS_ERR;
never@3156 2729 #endif
never@3156 2730 }
never@3156 2731
never@3156 2732 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
never@3156 2733 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
never@3156 2734 *priority_ptr = java_to_os_priority[NormPriority];
never@3156 2735 return OS_OK;
never@3156 2736 }
never@3156 2737
never@3156 2738 errno = 0;
never@3156 2739 #if defined(__OpenBSD__) || defined(__FreeBSD__)
never@3156 2740 *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
never@3156 2741 #elif defined(__APPLE__) || defined(__NetBSD__)
never@3156 2742 int policy;
never@3156 2743 struct sched_param sp;
never@3156 2744
never@3156 2745 pthread_getschedparam(pthread_self(), &policy, &sp);
never@3156 2746 *priority_ptr = sp.sched_priority;
never@3156 2747 #else
never@3156 2748 *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
never@3156 2749 #endif
never@3156 2750 return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
never@3156 2751 }
never@3156 2752
never@3156 2753 // Hint to the underlying OS that a task switch would not be good.
never@3156 2754 // Void return because it's a hint and can fail.
never@3156 2755 void os::hint_no_preempt() {}
never@3156 2756
never@3156 2757 ////////////////////////////////////////////////////////////////////////////////
never@3156 2758 // suspend/resume support
never@3156 2759
never@3156 2760 // the low-level signal-based suspend/resume support is a remnant from the
never@3156 2761 // old VM-suspension that used to be for java-suspension, safepoints etc,
never@3156 2762 // within hotspot. Now there is a single use-case for this:
never@3156 2763 // - calling get_thread_pc() on the VMThread by the flat-profiler task
never@3156 2764 // that runs in the watcher thread.
never@3156 2765 // The remaining code is greatly simplified from the more general suspension
never@3156 2766 // code that used to be used.
never@3156 2767 //
never@3156 2768 // The protocol is quite simple:
never@3156 2769 // - suspend:
never@3156 2770 // - sends a signal to the target thread
never@3156 2771 // - polls the suspend state of the osthread using a yield loop
never@3156 2772 // - target thread signal handler (SR_handler) sets suspend state
never@3156 2773 // and blocks in sigsuspend until continued
never@3156 2774 // - resume:
never@3156 2775 // - sets target osthread state to continue
never@3156 2776 // - sends signal to end the sigsuspend loop in the SR_handler
never@3156 2777 //
never@3156 2778 // Note that the SR_lock plays no role in this suspend/resume protocol.
never@3156 2779 //
never@3156 2780
never@3156 2781 static void resume_clear_context(OSThread *osthread) {
never@3156 2782 osthread->set_ucontext(NULL);
never@3156 2783 osthread->set_siginfo(NULL);
never@3156 2784 }
never@3156 2785
never@3156 2786 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
never@3156 2787 osthread->set_ucontext(context);
never@3156 2788 osthread->set_siginfo(siginfo);
never@3156 2789 }
never@3156 2790
never@3156 2791 //
never@3156 2792 // Handler function invoked when a thread's execution is suspended or
never@3156 2793 // resumed. We have to be careful that only async-safe functions are
never@3156 2794 // called here (Note: most pthread functions are not async safe and
never@3156 2795 // should be avoided.)
never@3156 2796 //
never@3156 2797 // Note: sigwait() is a more natural fit than sigsuspend() from an
never@3156 2798 // interface point of view, but sigwait() prevents the signal hander
never@3156 2799 // from being run. libpthread would get very confused by not having
never@3156 2800 // its signal handlers run and prevents sigwait()'s use with the
never@3156 2801 // mutex granting granting signal.
never@3156 2802 //
sla@5237 2803 // Currently only ever called on the VMThread or JavaThread
never@3156 2804 //
never@3156 2805 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
never@3156 2806 // Save and restore errno to avoid confusing native code with EINTR
never@3156 2807 // after sigsuspend.
never@3156 2808 int old_errno = errno;
never@3156 2809
never@3156 2810 Thread* thread = Thread::current();
never@3156 2811 OSThread* osthread = thread->osthread();
sla@5237 2812 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
sla@5237 2813
sla@5237 2814 os::SuspendResume::State current = osthread->sr.state();
sla@5237 2815 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
never@3156 2816 suspend_save_context(osthread, siginfo, context);
never@3156 2817
sla@5237 2818 // attempt to switch the state, we assume we had a SUSPEND_REQUEST
sla@5237 2819 os::SuspendResume::State state = osthread->sr.suspended();
sla@5237 2820 if (state == os::SuspendResume::SR_SUSPENDED) {
sla@5237 2821 sigset_t suspend_set; // signals for sigsuspend()
sla@5237 2822
sla@5237 2823 // get current set of blocked signals and unblock resume signal
sla@5237 2824 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
sla@5237 2825 sigdelset(&suspend_set, SR_signum);
sla@5237 2826
sla@5237 2827 sr_semaphore.signal();
sla@5237 2828 // wait here until we are resumed
sla@5237 2829 while (1) {
sla@5237 2830 sigsuspend(&suspend_set);
sla@5237 2831
sla@5237 2832 os::SuspendResume::State result = osthread->sr.running();
sla@5237 2833 if (result == os::SuspendResume::SR_RUNNING) {
sla@5237 2834 sr_semaphore.signal();
sla@5237 2835 break;
sla@5237 2836 } else if (result != os::SuspendResume::SR_SUSPENDED) {
sla@5237 2837 ShouldNotReachHere();
sla@5237 2838 }
sla@5237 2839 }
sla@5237 2840
sla@5237 2841 } else if (state == os::SuspendResume::SR_RUNNING) {
sla@5237 2842 // request was cancelled, continue
sla@5237 2843 } else {
sla@5237 2844 ShouldNotReachHere();
sla@5237 2845 }
never@3156 2846
never@3156 2847 resume_clear_context(osthread);
sla@5237 2848 } else if (current == os::SuspendResume::SR_RUNNING) {
sla@5237 2849 // request was cancelled, continue
sla@5237 2850 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
sla@5237 2851 // ignore
never@3156 2852 } else {
sla@5237 2853 // ignore
never@3156 2854 }
never@3156 2855
never@3156 2856 errno = old_errno;
never@3156 2857 }
never@3156 2858
never@3156 2859
never@3156 2860 static int SR_initialize() {
never@3156 2861 struct sigaction act;
never@3156 2862 char *s;
never@3156 2863 /* Get signal number to use for suspend/resume */
never@3156 2864 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
never@3156 2865 int sig = ::strtol(s, 0, 10);
never@3156 2866 if (sig > 0 || sig < NSIG) {
never@3156 2867 SR_signum = sig;
never@3156 2868 }
never@3156 2869 }
never@3156 2870
never@3156 2871 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
never@3156 2872 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
never@3156 2873
never@3156 2874 sigemptyset(&SR_sigset);
never@3156 2875 sigaddset(&SR_sigset, SR_signum);
never@3156 2876
never@3156 2877 /* Set up signal handler for suspend/resume */
never@3156 2878 act.sa_flags = SA_RESTART|SA_SIGINFO;
never@3156 2879 act.sa_handler = (void (*)(int)) SR_handler;
never@3156 2880
never@3156 2881 // SR_signum is blocked by default.
never@3156 2882 // 4528190 - We also need to block pthread restart signal (32 on all
never@3156 2883 // supported Bsd platforms). Note that BsdThreads need to block
never@3156 2884 // this signal for all threads to work properly. So we don't have
never@3156 2885 // to use hard-coded signal number when setting up the mask.
never@3156 2886 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
never@3156 2887
never@3156 2888 if (sigaction(SR_signum, &act, 0) == -1) {
never@3156 2889 return -1;
never@3156 2890 }
never@3156 2891
never@3156 2892 // Save signal flag
never@3156 2893 os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
never@3156 2894 return 0;
never@3156 2895 }
never@3156 2896
sla@5237 2897 static int sr_notify(OSThread* osthread) {
sla@5237 2898 int status = pthread_kill(osthread->pthread_id(), SR_signum);
sla@5237 2899 assert_status(status == 0, status, "pthread_kill");
sla@5237 2900 return status;
sla@5237 2901 }
sla@5237 2902
sla@5237 2903 // "Randomly" selected value for how long we want to spin
sla@5237 2904 // before bailing out on suspending a thread, also how often
sla@5237 2905 // we send a signal to a thread we want to resume
sla@5237 2906 static const int RANDOMLY_LARGE_INTEGER = 1000000;
sla@5237 2907 static const int RANDOMLY_LARGE_INTEGER2 = 100;
never@3156 2908
never@3156 2909 // returns true on success and false on error - really an error is fatal
never@3156 2910 // but this seems the normal response to library errors
never@3156 2911 static bool do_suspend(OSThread* osthread) {
sla@5237 2912 assert(osthread->sr.is_running(), "thread should be running");
sla@5237 2913 assert(!sr_semaphore.trywait(), "semaphore has invalid state");
sla@5237 2914
never@3156 2915 // mark as suspended and send signal
sla@5237 2916 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
sla@5237 2917 // failed to switch, state wasn't running?
sla@5237 2918 ShouldNotReachHere();
never@3156 2919 return false;
never@3156 2920 }
sla@5237 2921
sla@5237 2922 if (sr_notify(osthread) != 0) {
sla@5237 2923 ShouldNotReachHere();
sla@5237 2924 }
sla@5237 2925
sla@5237 2926 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
sla@5237 2927 while (true) {
sla@5237 2928 if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
sla@5237 2929 break;
sla@5237 2930 } else {
sla@5237 2931 // timeout
sla@5237 2932 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
sla@5237 2933 if (cancelled == os::SuspendResume::SR_RUNNING) {
sla@5237 2934 return false;
sla@5237 2935 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
sla@5237 2936 // make sure that we consume the signal on the semaphore as well
sla@5237 2937 sr_semaphore.wait();
sla@5237 2938 break;
sla@5237 2939 } else {
sla@5237 2940 ShouldNotReachHere();
sla@5237 2941 return false;
sla@5237 2942 }
sla@5237 2943 }
sla@5237 2944 }
sla@5237 2945
sla@5237 2946 guarantee(osthread->sr.is_suspended(), "Must be suspended");
sla@5237 2947 return true;
never@3156 2948 }
never@3156 2949
never@3156 2950 static void do_resume(OSThread* osthread) {
never@3156 2951 assert(osthread->sr.is_suspended(), "thread should be suspended");
sla@5237 2952 assert(!sr_semaphore.trywait(), "invalid semaphore state");
sla@5237 2953
sla@5237 2954 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
sla@5237 2955 // failed to switch to WAKEUP_REQUEST
sla@5237 2956 ShouldNotReachHere();
sla@5237 2957 return;
sla@5237 2958 }
sla@5237 2959
sla@5237 2960 while (true) {
sla@5237 2961 if (sr_notify(osthread) == 0) {
sla@5237 2962 if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
sla@5237 2963 if (osthread->sr.is_running()) {
sla@5237 2964 return;
sla@5237 2965 }
sla@5237 2966 }
sla@5237 2967 } else {
sla@5237 2968 ShouldNotReachHere();
never@3156 2969 }
never@3156 2970 }
sla@5237 2971
sla@5237 2972 guarantee(osthread->sr.is_running(), "Must be running!");
never@3156 2973 }
never@3156 2974
never@3156 2975 ////////////////////////////////////////////////////////////////////////////////
never@3156 2976 // interrupt support
never@3156 2977
never@3156 2978 void os::interrupt(Thread* thread) {
never@3156 2979 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
never@3156 2980 "possibility of dangling Thread pointer");
never@3156 2981
never@3156 2982 OSThread* osthread = thread->osthread();
never@3156 2983
never@3156 2984 if (!osthread->interrupted()) {
never@3156 2985 osthread->set_interrupted(true);
never@3156 2986 // More than one thread can get here with the same value of osthread,
never@3156 2987 // resulting in multiple notifications. We do, however, want the store
never@3156 2988 // to interrupted() to be visible to other threads before we execute unpark().
never@3156 2989 OrderAccess::fence();
never@3156 2990 ParkEvent * const slp = thread->_SleepEvent ;
never@3156 2991 if (slp != NULL) slp->unpark() ;
never@3156 2992 }
never@3156 2993
never@3156 2994 // For JSR166. Unpark even if interrupt status already was set
never@3156 2995 if (thread->is_Java_thread())
never@3156 2996 ((JavaThread*)thread)->parker()->unpark();
never@3156 2997
never@3156 2998 ParkEvent * ev = thread->_ParkEvent ;
never@3156 2999 if (ev != NULL) ev->unpark() ;
never@3156 3000
never@3156 3001 }
never@3156 3002
never@3156 3003 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
never@3156 3004 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
never@3156 3005 "possibility of dangling Thread pointer");
never@3156 3006
never@3156 3007 OSThread* osthread = thread->osthread();
never@3156 3008
never@3156 3009 bool interrupted = osthread->interrupted();
never@3156 3010
never@3156 3011 if (interrupted && clear_interrupted) {
never@3156 3012 osthread->set_interrupted(false);
never@3156 3013 // consider thread->_SleepEvent->reset() ... optional optimization
never@3156 3014 }
never@3156 3015
never@3156 3016 return interrupted;
never@3156 3017 }
never@3156 3018
never@3156 3019 ///////////////////////////////////////////////////////////////////////////////////
never@3156 3020 // signal handling (except suspend/resume)
never@3156 3021
never@3156 3022 // This routine may be used by user applications as a "hook" to catch signals.
never@3156 3023 // The user-defined signal handler must pass unrecognized signals to this
never@3156 3024 // routine, and if it returns true (non-zero), then the signal handler must
never@3156 3025 // return immediately. If the flag "abort_if_unrecognized" is true, then this
never@3156 3026 // routine will never retun false (zero), but instead will execute a VM panic
never@3156 3027 // routine kill the process.
never@3156 3028 //
never@3156 3029 // If this routine returns false, it is OK to call it again. This allows
never@3156 3030 // the user-defined signal handler to perform checks either before or after
never@3156 3031 // the VM performs its own checks. Naturally, the user code would be making
never@3156 3032 // a serious error if it tried to handle an exception (such as a null check
never@3156 3033 // or breakpoint) that the VM was generating for its own correct operation.
never@3156 3034 //
never@3156 3035 // This routine may recognize any of the following kinds of signals:
never@3156 3036 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
never@3156 3037 // It should be consulted by handlers for any of those signals.
never@3156 3038 //
never@3156 3039 // The caller of this routine must pass in the three arguments supplied
never@3156 3040 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
never@3156 3041 // field of the structure passed to sigaction(). This routine assumes that
never@3156 3042 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
never@3156 3043 //
never@3156 3044 // Note that the VM will print warnings if it detects conflicting signal
never@3156 3045 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
never@3156 3046 //
never@3156 3047 extern "C" JNIEXPORT int
never@3156 3048 JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
never@3156 3049 void* ucontext, int abort_if_unrecognized);
never@3156 3050
never@3156 3051 void signalHandler(int sig, siginfo_t* info, void* uc) {
never@3156 3052 assert(info != NULL && uc != NULL, "it must be old kernel");
hseigel@4608 3053 int orig_errno = errno; // Preserve errno value over signal handler.
never@3156 3054 JVM_handle_bsd_signal(sig, info, uc, true);
hseigel@4608 3055 errno = orig_errno;
never@3156 3056 }
never@3156 3057
never@3156 3058
never@3156 3059 // This boolean allows users to forward their own non-matching signals
never@3156 3060 // to JVM_handle_bsd_signal, harmlessly.
never@3156 3061 bool os::Bsd::signal_handlers_are_installed = false;
never@3156 3062
never@3156 3063 // For signal-chaining
never@3156 3064 struct sigaction os::Bsd::sigact[MAXSIGNUM];
never@3156 3065 unsigned int os::Bsd::sigs = 0;
never@3156 3066 bool os::Bsd::libjsig_is_loaded = false;
never@3156 3067 typedef struct sigaction *(*get_signal_t)(int);
never@3156 3068 get_signal_t os::Bsd::get_signal_action = NULL;
never@3156 3069
never@3156 3070 struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
never@3156 3071 struct sigaction *actp = NULL;
never@3156 3072
never@3156 3073 if (libjsig_is_loaded) {
never@3156 3074 // Retrieve the old signal handler from libjsig
never@3156 3075 actp = (*get_signal_action)(sig);
never@3156 3076 }
never@3156 3077 if (actp == NULL) {
never@3156 3078 // Retrieve the preinstalled signal handler from jvm
never@3156 3079 actp = get_preinstalled_handler(sig);
never@3156 3080 }
never@3156 3081
never@3156 3082 return actp;
never@3156 3083 }
never@3156 3084
never@3156 3085 static bool call_chained_handler(struct sigaction *actp, int sig,
never@3156 3086 siginfo_t *siginfo, void *context) {
never@3156 3087 // Call the old signal handler
never@3156 3088 if (actp->sa_handler == SIG_DFL) {
never@3156 3089 // It's more reasonable to let jvm treat it as an unexpected exception
never@3156 3090 // instead of taking the default action.
never@3156 3091 return false;
never@3156 3092 } else if (actp->sa_handler != SIG_IGN) {
never@3156 3093 if ((actp->sa_flags & SA_NODEFER) == 0) {
never@3156 3094 // automaticlly block the signal
never@3156 3095 sigaddset(&(actp->sa_mask), sig);
never@3156 3096 }
never@3156 3097
never@3156 3098 sa_handler_t hand;
never@3156 3099 sa_sigaction_t sa;
never@3156 3100 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
never@3156 3101 // retrieve the chained handler
never@3156 3102 if (siginfo_flag_set) {
never@3156 3103 sa = actp->sa_sigaction;
never@3156 3104 } else {
never@3156 3105 hand = actp->sa_handler;
never@3156 3106 }
never@3156 3107
never@3156 3108 if ((actp->sa_flags & SA_RESETHAND) != 0) {
never@3156 3109 actp->sa_handler = SIG_DFL;
never@3156 3110 }
never@3156 3111
never@3156 3112 // try to honor the signal mask
never@3156 3113 sigset_t oset;
never@3156 3114 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
never@3156 3115
never@3156 3116 // call into the chained handler
never@3156 3117 if (siginfo_flag_set) {
never@3156 3118 (*sa)(sig, siginfo, context);
never@3156 3119 } else {
never@3156 3120 (*hand)(sig);
never@3156 3121 }
never@3156 3122
never@3156 3123 // restore the signal mask
never@3156 3124 pthread_sigmask(SIG_SETMASK, &oset, 0);
never@3156 3125 }
never@3156 3126 // Tell jvm's signal handler the signal is taken care of.
never@3156 3127 return true;
never@3156 3128 }
never@3156 3129
never@3156 3130 bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
never@3156 3131 bool chained = false;
never@3156 3132 // signal-chaining
never@3156 3133 if (UseSignalChaining) {
never@3156 3134 struct sigaction *actp = get_chained_signal_action(sig);
never@3156 3135 if (actp != NULL) {
never@3156 3136 chained = call_chained_handler(actp, sig, siginfo, context);
never@3156 3137 }
never@3156 3138 }
never@3156 3139 return chained;
never@3156 3140 }
never@3156 3141
never@3156 3142 struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
never@3156 3143 if ((( (unsigned int)1 << sig ) & sigs) != 0) {
never@3156 3144 return &sigact[sig];
never@3156 3145 }
never@3156 3146 return NULL;
never@3156 3147 }
never@3156 3148
never@3156 3149 void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
never@3156 3150 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
never@3156 3151 sigact[sig] = oldAct;
never@3156 3152 sigs |= (unsigned int)1 << sig;
never@3156 3153 }
never@3156 3154
never@3156 3155 // for diagnostic
never@3156 3156 int os::Bsd::sigflags[MAXSIGNUM];
never@3156 3157
never@3156 3158 int os::Bsd::get_our_sigflags(int sig) {
never@3156 3159 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
never@3156 3160 return sigflags[sig];
never@3156 3161 }
never@3156 3162
never@3156 3163 void os::Bsd::set_our_sigflags(int sig, int flags) {
never@3156 3164 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
never@3156 3165 sigflags[sig] = flags;
never@3156 3166 }
never@3156 3167
never@3156 3168 void os::Bsd::set_signal_handler(int sig, bool set_installed) {
never@3156 3169 // Check for overwrite.
never@3156 3170 struct sigaction oldAct;
never@3156 3171 sigaction(sig, (struct sigaction*)NULL, &oldAct);
never@3156 3172
never@3156 3173 void* oldhand = oldAct.sa_sigaction
never@3156 3174 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
never@3156 3175 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
never@3156 3176 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
never@3156 3177 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
never@3156 3178 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
never@3156 3179 if (AllowUserSignalHandlers || !set_installed) {
never@3156 3180 // Do not overwrite; user takes responsibility to forward to us.
never@3156 3181 return;
never@3156 3182 } else if (UseSignalChaining) {
never@3156 3183 // save the old handler in jvm
never@3156 3184 save_preinstalled_handler(sig, oldAct);
never@3156 3185 // libjsig also interposes the sigaction() call below and saves the
never@3156 3186 // old sigaction on it own.
never@3156 3187 } else {
never@3156 3188 fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
never@3156 3189 "%#lx for signal %d.", (long)oldhand, sig));
never@3156 3190 }
never@3156 3191 }
never@3156 3192
never@3156 3193 struct sigaction sigAct;
never@3156 3194 sigfillset(&(sigAct.sa_mask));
never@3156 3195 sigAct.sa_handler = SIG_DFL;
never@3156 3196 if (!set_installed) {
never@3156 3197 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
never@3156 3198 } else {
never@3156 3199 sigAct.sa_sigaction = signalHandler;
never@3156 3200 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
never@3156 3201 }
hseigel@5218 3202 #if __APPLE__
hseigel@5218 3203 // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV
hseigel@5218 3204 // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages"
hseigel@5218 3205 // if the signal handler declares it will handle it on alternate stack.
hseigel@5218 3206 // Notice we only declare we will handle it on alt stack, but we are not
hseigel@5218 3207 // actually going to use real alt stack - this is just a workaround.
hseigel@5218 3208 // Please see ux_exception.c, method catch_mach_exception_raise for details
hseigel@5218 3209 // link http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/bsd/uxkern/ux_exception.c
hseigel@5218 3210 if (sig == SIGSEGV) {
hseigel@5218 3211 sigAct.sa_flags |= SA_ONSTACK;
hseigel@5218 3212 }
hseigel@5218 3213 #endif
hseigel@5218 3214
never@3156 3215 // Save flags, which are set by ours
never@3156 3216 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
never@3156 3217 sigflags[sig] = sigAct.sa_flags;
never@3156 3218
never@3156 3219 int ret = sigaction(sig, &sigAct, &oldAct);
never@3156 3220 assert(ret == 0, "check");
never@3156 3221
never@3156 3222 void* oldhand2 = oldAct.sa_sigaction
never@3156 3223 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
never@3156 3224 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
never@3156 3225 assert(oldhand2 == oldhand, "no concurrent signal handler installation");
never@3156 3226 }
never@3156 3227
never@3156 3228 // install signal handlers for signals that HotSpot needs to
never@3156 3229 // handle in order to support Java-level exception handling.
never@3156 3230
never@3156 3231 void os::Bsd::install_signal_handlers() {
never@3156 3232 if (!signal_handlers_are_installed) {
never@3156 3233 signal_handlers_are_installed = true;
never@3156 3234
never@3156 3235 // signal-chaining
never@3156 3236 typedef void (*signal_setting_t)();
never@3156 3237 signal_setting_t begin_signal_setting = NULL;
never@3156 3238 signal_setting_t end_signal_setting = NULL;
never@3156 3239 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
never@3156 3240 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
never@3156 3241 if (begin_signal_setting != NULL) {
never@3156 3242 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
never@3156 3243 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
never@3156 3244 get_signal_action = CAST_TO_FN_PTR(get_signal_t,
never@3156 3245 dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
never@3156 3246 libjsig_is_loaded = true;
never@3156 3247 assert(UseSignalChaining, "should enable signal-chaining");
never@3156 3248 }
never@3156 3249 if (libjsig_is_loaded) {
never@3156 3250 // Tell libjsig jvm is setting signal handlers
never@3156 3251 (*begin_signal_setting)();
never@3156 3252 }
never@3156 3253
never@3156 3254 set_signal_handler(SIGSEGV, true);
never@3156 3255 set_signal_handler(SIGPIPE, true);
never@3156 3256 set_signal_handler(SIGBUS, true);
never@3156 3257 set_signal_handler(SIGILL, true);
never@3156 3258 set_signal_handler(SIGFPE, true);
never@3156 3259 set_signal_handler(SIGXFSZ, true);
never@3156 3260
never@3156 3261 #if defined(__APPLE__)
never@3156 3262 // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
never@3156 3263 // signals caught and handled by the JVM. To work around this, we reset the mach task
never@3156 3264 // signal handler that's placed on our process by CrashReporter. This disables
never@3156 3265 // CrashReporter-based reporting.
never@3156 3266 //
never@3156 3267 // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
never@3156 3268 // on caught fatal signals.
never@3156 3269 //
never@3156 3270 // Additionally, gdb installs both standard BSD signal handlers, and mach exception
never@3156 3271 // handlers. By replacing the existing task exception handler, we disable gdb's mach
never@3156 3272 // exception handling, while leaving the standard BSD signal handlers functional.
never@3156 3273 kern_return_t kr;
never@3156 3274 kr = task_set_exception_ports(mach_task_self(),
never@3156 3275 EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
never@3156 3276 MACH_PORT_NULL,
never@3156 3277 EXCEPTION_STATE_IDENTITY,
never@3156 3278 MACHINE_THREAD_STATE);
never@3156 3279
never@3156 3280 assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
never@3156 3281 #endif
never@3156 3282
never@3156 3283 if (libjsig_is_loaded) {
never@3156 3284 // Tell libjsig jvm finishes setting signal handlers
never@3156 3285 (*end_signal_setting)();
never@3156 3286 }
never@3156 3287
never@3156 3288 // We don't activate signal checker if libjsig is in place, we trust ourselves
never@3156 3289 // and if UserSignalHandler is installed all bets are off
never@3156 3290 if (CheckJNICalls) {
never@3156 3291 if (libjsig_is_loaded) {
hseigel@5564 3292 if (PrintJNIResolving) {
hseigel@5564 3293 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
hseigel@5564 3294 }
never@3156 3295 check_signals = false;
never@3156 3296 }
never@3156 3297 if (AllowUserSignalHandlers) {
hseigel@5564 3298 if (PrintJNIResolving) {
hseigel@5564 3299 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
hseigel@5564 3300 }
never@3156 3301 check_signals = false;
never@3156 3302 }
never@3156 3303 }
never@3156 3304 }
never@3156 3305 }
never@3156 3306
never@3156 3307
never@3156 3308 /////
never@3156 3309 // glibc on Bsd platform uses non-documented flag
never@3156 3310 // to indicate, that some special sort of signal
never@3156 3311 // trampoline is used.
never@3156 3312 // We will never set this flag, and we should
never@3156 3313 // ignore this flag in our diagnostic
never@3156 3314 #ifdef SIGNIFICANT_SIGNAL_MASK
never@3156 3315 #undef SIGNIFICANT_SIGNAL_MASK
never@3156 3316 #endif
never@3156 3317 #define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
never@3156 3318
never@3156 3319 static const char* get_signal_handler_name(address handler,
never@3156 3320 char* buf, int buflen) {
never@3156 3321 int offset;
never@3156 3322 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
never@3156 3323 if (found) {
never@3156 3324 // skip directory names
never@3156 3325 const char *p1, *p2;
never@3156 3326 p1 = buf;
never@3156 3327 size_t len = strlen(os::file_separator());
never@3156 3328 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
never@3156 3329 jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
never@3156 3330 } else {
never@3156 3331 jio_snprintf(buf, buflen, PTR_FORMAT, handler);
never@3156 3332 }
never@3156 3333 return buf;
never@3156 3334 }
never@3156 3335
never@3156 3336 static void print_signal_handler(outputStream* st, int sig,
never@3156 3337 char* buf, size_t buflen) {
never@3156 3338 struct sigaction sa;
never@3156 3339
never@3156 3340 sigaction(sig, NULL, &sa);
never@3156 3341
never@3156 3342 // See comment for SIGNIFICANT_SIGNAL_MASK define
never@3156 3343 sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
never@3156 3344
never@3156 3345 st->print("%s: ", os::exception_name(sig, buf, buflen));
never@3156 3346
never@3156 3347 address handler = (sa.sa_flags & SA_SIGINFO)
never@3156 3348 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
never@3156 3349 : CAST_FROM_FN_PTR(address, sa.sa_handler);
never@3156 3350
never@3156 3351 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
never@3156 3352 st->print("SIG_DFL");
never@3156 3353 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
never@3156 3354 st->print("SIG_IGN");
never@3156 3355 } else {
never@3156 3356 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
never@3156 3357 }
never@3156 3358
never@3156 3359 st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
never@3156 3360
never@3156 3361 address rh = VMError::get_resetted_sighandler(sig);
never@3156 3362 // May be, handler was resetted by VMError?
never@3156 3363 if(rh != NULL) {
never@3156 3364 handler = rh;
never@3156 3365 sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
never@3156 3366 }
never@3156 3367
never@3156 3368 st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags);
never@3156 3369
never@3156 3370 // Check: is it our handler?
never@3156 3371 if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
never@3156 3372 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
never@3156 3373 // It is our signal handler
never@3156 3374 // check for flags, reset system-used one!
never@3156 3375 if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
never@3156 3376 st->print(
never@3156 3377 ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
never@3156 3378 os::Bsd::get_our_sigflags(sig));
never@3156 3379 }
never@3156 3380 }
never@3156 3381 st->cr();
never@3156 3382 }
never@3156 3383
never@3156 3384
never@3156 3385 #define DO_SIGNAL_CHECK(sig) \
never@3156 3386 if (!sigismember(&check_signal_done, sig)) \
never@3156 3387 os::Bsd::check_signal_handler(sig)
never@3156 3388
never@3156 3389 // This method is a periodic task to check for misbehaving JNI applications
never@3156 3390 // under CheckJNI, we can add any periodic checks here
never@3156 3391
never@3156 3392 void os::run_periodic_checks() {
never@3156 3393
never@3156 3394 if (check_signals == false) return;
never@3156 3395
never@3156 3396 // SEGV and BUS if overridden could potentially prevent
never@3156 3397 // generation of hs*.log in the event of a crash, debugging
never@3156 3398 // such a case can be very challenging, so we absolutely
never@3156 3399 // check the following for a good measure:
never@3156 3400 DO_SIGNAL_CHECK(SIGSEGV);
never@3156 3401 DO_SIGNAL_CHECK(SIGILL);
never@3156 3402 DO_SIGNAL_CHECK(SIGFPE);
never@3156 3403 DO_SIGNAL_CHECK(SIGBUS);
never@3156 3404 DO_SIGNAL_CHECK(SIGPIPE);
never@3156 3405 DO_SIGNAL_CHECK(SIGXFSZ);
never@3156 3406
never@3156 3407
never@3156 3408 // ReduceSignalUsage allows the user to override these handlers
never@3156 3409 // see comments at the very top and jvm_solaris.h
never@3156 3410 if (!ReduceSignalUsage) {
never@3156 3411 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
never@3156 3412 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
never@3156 3413 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
never@3156 3414 DO_SIGNAL_CHECK(BREAK_SIGNAL);
never@3156 3415 }
never@3156 3416
never@3156 3417 DO_SIGNAL_CHECK(SR_signum);
never@3156 3418 DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
never@3156 3419 }
never@3156 3420
never@3156 3421 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
never@3156 3422
never@3156 3423 static os_sigaction_t os_sigaction = NULL;
never@3156 3424
never@3156 3425 void os::Bsd::check_signal_handler(int sig) {
never@3156 3426 char buf[O_BUFLEN];
never@3156 3427 address jvmHandler = NULL;
never@3156 3428
never@3156 3429
never@3156 3430 struct sigaction act;
never@3156 3431 if (os_sigaction == NULL) {
never@3156 3432 // only trust the default sigaction, in case it has been interposed
never@3156 3433 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
never@3156 3434 if (os_sigaction == NULL) return;
never@3156 3435 }
never@3156 3436
never@3156 3437 os_sigaction(sig, (struct sigaction*)NULL, &act);
never@3156 3438
never@3156 3439
never@3156 3440 act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
never@3156 3441
never@3156 3442 address thisHandler = (act.sa_flags & SA_SIGINFO)
never@3156 3443 ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
never@3156 3444 : CAST_FROM_FN_PTR(address, act.sa_handler) ;
never@3156 3445
never@3156 3446
never@3156 3447 switch(sig) {
never@3156 3448 case SIGSEGV:
never@3156 3449 case SIGBUS:
never@3156 3450 case SIGFPE:
never@3156 3451 case SIGPIPE:
never@3156 3452 case SIGILL:
never@3156 3453 case SIGXFSZ:
never@3156 3454 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
never@3156 3455 break;
never@3156 3456
never@3156 3457 case SHUTDOWN1_SIGNAL:
never@3156 3458 case SHUTDOWN2_SIGNAL:
never@3156 3459 case SHUTDOWN3_SIGNAL:
never@3156 3460 case BREAK_SIGNAL:
never@3156 3461 jvmHandler = (address)user_handler();
never@3156 3462 break;
never@3156 3463
never@3156 3464 case INTERRUPT_SIGNAL:
never@3156 3465 jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
never@3156 3466 break;
never@3156 3467
never@3156 3468 default:
never@3156 3469 if (sig == SR_signum) {
never@3156 3470 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
never@3156 3471 } else {
never@3156 3472 return;
never@3156 3473 }
never@3156 3474 break;
never@3156 3475 }
never@3156 3476
never@3156 3477 if (thisHandler != jvmHandler) {
never@3156 3478 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
never@3156 3479 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
never@3156 3480 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
never@3156 3481 // No need to check this sig any longer
never@3156 3482 sigaddset(&check_signal_done, sig);
never@3156 3483 } else if(os::Bsd::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Bsd::get_our_sigflags(sig)) {
never@3156 3484 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
never@3156 3485 tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
never@3156 3486 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags);
never@3156 3487 // No need to check this sig any longer
never@3156 3488 sigaddset(&check_signal_done, sig);
never@3156 3489 }
never@3156 3490
never@3156 3491 // Dump all the signal
never@3156 3492 if (sigismember(&check_signal_done, sig)) {
never@3156 3493 print_signal_handlers(tty, buf, O_BUFLEN);
never@3156 3494 }
never@3156 3495 }
never@3156 3496
never@3156 3497 extern void report_error(char* file_name, int line_no, char* title, char* format, ...);
never@3156 3498
never@3156 3499 extern bool signal_name(int signo, char* buf, size_t len);
never@3156 3500
never@3156 3501 const char* os::exception_name(int exception_code, char* buf, size_t size) {
never@3156 3502 if (0 < exception_code && exception_code <= SIGRTMAX) {
never@3156 3503 // signal
never@3156 3504 if (!signal_name(exception_code, buf, size)) {
never@3156 3505 jio_snprintf(buf, size, "SIG%d", exception_code);
never@3156 3506 }
never@3156 3507 return buf;
never@3156 3508 } else {
never@3156 3509 return NULL;
never@3156 3510 }
never@3156 3511 }
never@3156 3512
never@3156 3513 // this is called _before_ the most of global arguments have been parsed
never@3156 3514 void os::init(void) {
never@3156 3515 char dummy; /* used to get a guess on initial stack address */
never@3156 3516 // first_hrtime = gethrtime();
never@3156 3517
never@3156 3518 // With BsdThreads the JavaMain thread pid (primordial thread)
never@3156 3519 // is different than the pid of the java launcher thread.
never@3156 3520 // So, on Bsd, the launcher thread pid is passed to the VM
never@3156 3521 // via the sun.java.launcher.pid property.
never@3156 3522 // Use this property instead of getpid() if it was correctly passed.
never@3156 3523 // See bug 6351349.
never@3156 3524 pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
never@3156 3525
never@3156 3526 _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
never@3156 3527
never@3156 3528 clock_tics_per_sec = CLK_TCK;
never@3156 3529
never@3156 3530 init_random(1234567);
never@3156 3531
never@3156 3532 ThreadCritical::initialize();
never@3156 3533
never@3156 3534 Bsd::set_page_size(getpagesize());
never@3156 3535 if (Bsd::page_size() == -1) {
never@3156 3536 fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
never@3156 3537 strerror(errno)));
never@3156 3538 }
never@3156 3539 init_page_sizes((size_t) Bsd::page_size());
never@3156 3540
never@3156 3541 Bsd::initialize_system_info();
never@3156 3542
never@3156 3543 // main_thread points to the aboriginal thread
never@3156 3544 Bsd::_main_thread = pthread_self();
never@3156 3545
never@3156 3546 Bsd::clock_init();
never@3156 3547 initial_time_count = os::elapsed_counter();
never@3156 3548
never@3156 3549 #ifdef __APPLE__
never@3156 3550 // XXXDARWIN
never@3156 3551 // Work around the unaligned VM callbacks in hotspot's
never@3156 3552 // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
never@3156 3553 // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
never@3156 3554 // alignment when doing symbol lookup. To work around this, we force early
never@3156 3555 // binding of all symbols now, thus binding when alignment is known-good.
never@3156 3556 _dyld_bind_fully_image_containing_address((const void *) &os::init);
never@3156 3557 #endif
never@3156 3558 }
never@3156 3559
never@3156 3560 // To install functions for atexit system call
never@3156 3561 extern "C" {
never@3156 3562 static void perfMemory_exit_helper() {
never@3156 3563 perfMemory_exit();
never@3156 3564 }
never@3156 3565 }
never@3156 3566
never@3156 3567 // this is called _after_ the global arguments have been parsed
never@3156 3568 jint os::init_2(void)
never@3156 3569 {
never@3156 3570 // Allocate a single page and mark it as readable for safepoint polling
never@3156 3571 address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
never@3156 3572 guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
never@3156 3573
never@3156 3574 os::set_polling_page( polling_page );
never@3156 3575
never@3156 3576 #ifndef PRODUCT
never@3156 3577 if(Verbose && PrintMiscellaneous)
never@3156 3578 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
never@3156 3579 #endif
never@3156 3580
never@3156 3581 if (!UseMembar) {
never@3156 3582 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
dcubed@5255 3583 guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
never@3156 3584 os::set_memory_serialize_page( mem_serialize_page );
never@3156 3585
never@3156 3586 #ifndef PRODUCT
never@3156 3587 if(Verbose && PrintMiscellaneous)
never@3156 3588 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
never@3156 3589 #endif
never@3156 3590 }
never@3156 3591
never@3156 3592 // initialize suspend/resume support - must do this before signal_sets_init()
never@3156 3593 if (SR_initialize() != 0) {
never@3156 3594 perror("SR_initialize failed");
never@3156 3595 return JNI_ERR;
never@3156 3596 }
never@3156 3597
never@3156 3598 Bsd::signal_sets_init();
never@3156 3599 Bsd::install_signal_handlers();
never@3156 3600
never@3156 3601 // Check minimum allowable stack size for thread creation and to initialize
never@3156 3602 // the java system classes, including StackOverflowError - depends on page
never@3156 3603 // size. Add a page for compiler2 recursion in main thread.
never@3156 3604 // Add in 2*BytesPerWord times page size to account for VM stack during
never@3156 3605 // class initialization depending on 32 or 64 bit VM.
never@3156 3606 os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
never@3156 3607 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
never@3156 3608 2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
never@3156 3609
never@3156 3610 size_t threadStackSizeInBytes = ThreadStackSize * K;
never@3156 3611 if (threadStackSizeInBytes != 0 &&
never@3156 3612 threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
never@3156 3613 tty->print_cr("\nThe stack size specified is too small, "
never@3156 3614 "Specify at least %dk",
never@3156 3615 os::Bsd::min_stack_allowed/ K);
never@3156 3616 return JNI_ERR;
never@3156 3617 }
never@3156 3618
never@3156 3619 // Make the stack size a multiple of the page size so that
never@3156 3620 // the yellow/red zones can be guarded.
never@3156 3621 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
never@3156 3622 vm_page_size()));
never@3156 3623
never@3156 3624 if (MaxFDLimit) {
never@3156 3625 // set the number of file descriptors to max. print out error
never@3156 3626 // if getrlimit/setrlimit fails but continue regardless.
never@3156 3627 struct rlimit nbr_files;
never@3156 3628 int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
never@3156 3629 if (status != 0) {
never@3156 3630 if (PrintMiscellaneous && (Verbose || WizardMode))
never@3156 3631 perror("os::init_2 getrlimit failed");
never@3156 3632 } else {
never@3156 3633 nbr_files.rlim_cur = nbr_files.rlim_max;
never@3156 3634
never@3156 3635 #ifdef __APPLE__
never@3156 3636 // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
never@3156 3637 // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
never@3156 3638 // be used instead
never@3156 3639 nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
never@3156 3640 #endif
never@3156 3641
never@3156 3642 status = setrlimit(RLIMIT_NOFILE, &nbr_files);
never@3156 3643 if (status != 0) {
never@3156 3644 if (PrintMiscellaneous && (Verbose || WizardMode))
never@3156 3645 perror("os::init_2 setrlimit failed");
never@3156 3646 }
never@3156 3647 }
never@3156 3648 }
never@3156 3649
never@3156 3650 // at-exit methods are called in the reverse order of their registration.
never@3156 3651 // atexit functions are called on return from main or as a result of a
never@3156 3652 // call to exit(3C). There can be only 32 of these functions registered
never@3156 3653 // and atexit() does not set errno.
never@3156 3654
never@3156 3655 if (PerfAllowAtExitRegistration) {
never@3156 3656 // only register atexit functions if PerfAllowAtExitRegistration is set.
never@3156 3657 // atexit functions can be delayed until process exit time, which
never@3156 3658 // can be problematic for embedded VM situations. Embedded VMs should
never@3156 3659 // call DestroyJavaVM() to assure that VM resources are released.
never@3156 3660
never@3156 3661 // note: perfMemory_exit_helper atexit function may be removed in
never@3156 3662 // the future if the appropriate cleanup code can be added to the
never@3156 3663 // VM_Exit VMOperation's doit method.
never@3156 3664 if (atexit(perfMemory_exit_helper) != 0) {
never@3156 3665 warning("os::init2 atexit(perfMemory_exit_helper) failed");
never@3156 3666 }
never@3156 3667 }
never@3156 3668
never@3156 3669 // initialize thread priority policy
never@3156 3670 prio_init();
never@3156 3671
dcubed@3202 3672 #ifdef __APPLE__
dcubed@3202 3673 // dynamically link to objective c gc registration
dcubed@3202 3674 void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
dcubed@3202 3675 if (handleLibObjc != NULL) {
dcubed@3202 3676 objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
dcubed@3202 3677 }
dcubed@3202 3678 #endif
dcubed@3202 3679
never@3156 3680 return JNI_OK;
never@3156 3681 }
never@3156 3682
never@3156 3683 // this is called at the end of vm_initialization
never@3156 3684 void os::init_3(void) { }
never@3156 3685
never@3156 3686 // Mark the polling page as unreadable
never@3156 3687 void os::make_polling_page_unreadable(void) {
never@3156 3688 if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
never@3156 3689 fatal("Could not disable polling page");
never@3156 3690 };
never@3156 3691
never@3156 3692 // Mark the polling page as readable
never@3156 3693 void os::make_polling_page_readable(void) {
never@3156 3694 if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
never@3156 3695 fatal("Could not enable polling page");
never@3156 3696 }
never@3156 3697 };
never@3156 3698
never@3156 3699 int os::active_processor_count() {
never@3156 3700 return _processor_count;
never@3156 3701 }
never@3156 3702
dcubed@3202 3703 void os::set_native_thread_name(const char *name) {
dcubed@3202 3704 #if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
dcubed@3202 3705 // This is only supported in Snow Leopard and beyond
dcubed@3202 3706 if (name != NULL) {
dcubed@3202 3707 // Add a "Java: " prefix to the name
dcubed@3202 3708 char buf[MAXTHREADNAMESIZE];
dcubed@3202 3709 snprintf(buf, sizeof(buf), "Java: %s", name);
dcubed@3202 3710 pthread_setname_np(buf);
dcubed@3202 3711 }
dcubed@3202 3712 #endif
dcubed@3202 3713 }
dcubed@3202 3714
never@3156 3715 bool os::distribute_processes(uint length, uint* distribution) {
never@3156 3716 // Not yet implemented.
never@3156 3717 return false;
never@3156 3718 }
never@3156 3719
never@3156 3720 bool os::bind_to_processor(uint processor_id) {
never@3156 3721 // Not yet implemented.
never@3156 3722 return false;
never@3156 3723 }
never@3156 3724
sla@5237 3725 void os::SuspendedThreadTask::internal_do_task() {
sla@5237 3726 if (do_suspend(_thread->osthread())) {
sla@5237 3727 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
sla@5237 3728 do_task(context);
sla@5237 3729 do_resume(_thread->osthread());
sla@5237 3730 }
sla@5237 3731 }
sla@5237 3732
never@3156 3733 ///
sla@5237 3734 class PcFetcher : public os::SuspendedThreadTask {
sla@5237 3735 public:
sla@5237 3736 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
sla@5237 3737 ExtendedPC result();
sla@5237 3738 protected:
sla@5237 3739 void do_task(const os::SuspendedThreadTaskContext& context);
sla@5237 3740 private:
sla@5237 3741 ExtendedPC _epc;
sla@5237 3742 };
sla@5237 3743
sla@5237 3744 ExtendedPC PcFetcher::result() {
sla@5237 3745 guarantee(is_done(), "task is not done yet.");
sla@5237 3746 return _epc;
sla@5237 3747 }
sla@5237 3748
sla@5237 3749 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
sla@5237 3750 Thread* thread = context.thread();
sla@5237 3751 OSThread* osthread = thread->osthread();
sla@5237 3752 if (osthread->ucontext() != NULL) {
sla@5237 3753 _epc = os::Bsd::ucontext_get_pc((ucontext_t *) context.ucontext());
sla@5237 3754 } else {
sla@5237 3755 // NULL context is unexpected, double-check this is the VMThread
sla@5237 3756 guarantee(thread->is_VM_thread(), "can only be called for VMThread");
sla@5237 3757 }
sla@5237 3758 }
never@3156 3759
never@3156 3760 // Suspends the target using the signal mechanism and then grabs the PC before
never@3156 3761 // resuming the target. Used by the flat-profiler only
never@3156 3762 ExtendedPC os::get_thread_pc(Thread* thread) {
never@3156 3763 // Make sure that it is called by the watcher for the VMThread
never@3156 3764 assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
never@3156 3765 assert(thread->is_VM_thread(), "Can only be called for VMThread");
never@3156 3766
sla@5237 3767 PcFetcher fetcher(thread);
sla@5237 3768 fetcher.run();
sla@5237 3769 return fetcher.result();
never@3156 3770 }
never@3156 3771
never@3156 3772 int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime)
never@3156 3773 {
never@3156 3774 return pthread_cond_timedwait(_cond, _mutex, _abstime);
never@3156 3775 }
never@3156 3776
never@3156 3777 ////////////////////////////////////////////////////////////////////////////////
never@3156 3778 // debug support
never@3156 3779
never@3156 3780 bool os::find(address addr, outputStream* st) {
never@3156 3781 Dl_info dlinfo;
never@3156 3782 memset(&dlinfo, 0, sizeof(dlinfo));
dcubed@5365 3783 if (dladdr(addr, &dlinfo) != 0) {
never@3156 3784 st->print(PTR_FORMAT ": ", addr);
dcubed@5365 3785 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
never@3156 3786 st->print("%s+%#x", dlinfo.dli_sname,
never@3156 3787 addr - (intptr_t)dlinfo.dli_saddr);
dcubed@5365 3788 } else if (dlinfo.dli_fbase != NULL) {
never@3156 3789 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
never@3156 3790 } else {
never@3156 3791 st->print("<absolute address>");
never@3156 3792 }
dcubed@5365 3793 if (dlinfo.dli_fname != NULL) {
never@3156 3794 st->print(" in %s", dlinfo.dli_fname);
never@3156 3795 }
dcubed@5365 3796 if (dlinfo.dli_fbase != NULL) {
never@3156 3797 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
never@3156 3798 }
never@3156 3799 st->cr();
never@3156 3800
never@3156 3801 if (Verbose) {
never@3156 3802 // decode some bytes around the PC
mikael@4889 3803 address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
mikael@4889 3804 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
never@3156 3805 address lowest = (address) dlinfo.dli_sname;
never@3156 3806 if (!lowest) lowest = (address) dlinfo.dli_fbase;
never@3156 3807 if (begin < lowest) begin = lowest;
never@3156 3808 Dl_info dlinfo2;
dcubed@5365 3809 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
never@3156 3810 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
never@3156 3811 end = (address) dlinfo2.dli_saddr;
never@3156 3812 Disassembler::decode(begin, end, st);
never@3156 3813 }
never@3156 3814 return true;
never@3156 3815 }
never@3156 3816 return false;
never@3156 3817 }
never@3156 3818
never@3156 3819 ////////////////////////////////////////////////////////////////////////////////
never@3156 3820 // misc
never@3156 3821
never@3156 3822 // This does not do anything on Bsd. This is basically a hook for being
never@3156 3823 // able to use structured exception handling (thread-local exception filters)
never@3156 3824 // on, e.g., Win32.
never@3156 3825 void
never@3156 3826 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
never@3156 3827 JavaCallArguments* args, Thread* thread) {
never@3156 3828 f(value, method, args, thread);
never@3156 3829 }
never@3156 3830
never@3156 3831 void os::print_statistics() {
never@3156 3832 }
never@3156 3833
never@3156 3834 int os::message_box(const char* title, const char* message) {
never@3156 3835 int i;
never@3156 3836 fdStream err(defaultStream::error_fd());
never@3156 3837 for (i = 0; i < 78; i++) err.print_raw("=");
never@3156 3838 err.cr();
never@3156 3839 err.print_raw_cr(title);
never@3156 3840 for (i = 0; i < 78; i++) err.print_raw("-");
never@3156 3841 err.cr();
never@3156 3842 err.print_raw_cr(message);
never@3156 3843 for (i = 0; i < 78; i++) err.print_raw("=");
never@3156 3844 err.cr();
never@3156 3845
never@3156 3846 char buf[16];
never@3156 3847 // Prevent process from exiting upon "read error" without consuming all CPU
never@3156 3848 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
never@3156 3849
never@3156 3850 return buf[0] == 'y' || buf[0] == 'Y';
never@3156 3851 }
never@3156 3852
never@3156 3853 int os::stat(const char *path, struct stat *sbuf) {
never@3156 3854 char pathbuf[MAX_PATH];
never@3156 3855 if (strlen(path) > MAX_PATH - 1) {
never@3156 3856 errno = ENAMETOOLONG;
never@3156 3857 return -1;
never@3156 3858 }
never@3156 3859 os::native_path(strcpy(pathbuf, path));
never@3156 3860 return ::stat(pathbuf, sbuf);
never@3156 3861 }
never@3156 3862
never@3156 3863 bool os::check_heap(bool force) {
never@3156 3864 return true;
never@3156 3865 }
never@3156 3866
never@3156 3867 int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
never@3156 3868 return ::vsnprintf(buf, count, format, args);
never@3156 3869 }
never@3156 3870
never@3156 3871 // Is a (classpath) directory empty?
never@3156 3872 bool os::dir_is_empty(const char* path) {
never@3156 3873 DIR *dir = NULL;
never@3156 3874 struct dirent *ptr;
never@3156 3875
never@3156 3876 dir = opendir(path);
never@3156 3877 if (dir == NULL) return true;
never@3156 3878
never@3156 3879 /* Scan the directory */
never@3156 3880 bool result = true;
never@3156 3881 char buf[sizeof(struct dirent) + MAX_PATH];
never@3156 3882 while (result && (ptr = ::readdir(dir)) != NULL) {
never@3156 3883 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
never@3156 3884 result = false;
never@3156 3885 }
never@3156 3886 }
never@3156 3887 closedir(dir);
never@3156 3888 return result;
never@3156 3889 }
never@3156 3890
never@3156 3891 // This code originates from JDK's sysOpen and open64_w
never@3156 3892 // from src/solaris/hpi/src/system_md.c
never@3156 3893
never@3156 3894 #ifndef O_DELETE
never@3156 3895 #define O_DELETE 0x10000
never@3156 3896 #endif
never@3156 3897
never@3156 3898 // Open a file. Unlink the file immediately after open returns
never@3156 3899 // if the specified oflag has the O_DELETE flag set.
never@3156 3900 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
never@3156 3901
never@3156 3902 int os::open(const char *path, int oflag, int mode) {
never@3156 3903
never@3156 3904 if (strlen(path) > MAX_PATH - 1) {
never@3156 3905 errno = ENAMETOOLONG;
never@3156 3906 return -1;
never@3156 3907 }
never@3156 3908 int fd;
never@3156 3909 int o_delete = (oflag & O_DELETE);
never@3156 3910 oflag = oflag & ~O_DELETE;
never@3156 3911
never@3156 3912 fd = ::open(path, oflag, mode);
never@3156 3913 if (fd == -1) return -1;
never@3156 3914
never@3156 3915 //If the open succeeded, the file might still be a directory
never@3156 3916 {
never@3156 3917 struct stat buf;
never@3156 3918 int ret = ::fstat(fd, &buf);
never@3156 3919 int st_mode = buf.st_mode;
never@3156 3920
never@3156 3921 if (ret != -1) {
never@3156 3922 if ((st_mode & S_IFMT) == S_IFDIR) {
never@3156 3923 errno = EISDIR;
never@3156 3924 ::close(fd);
never@3156 3925 return -1;
never@3156 3926 }
never@3156 3927 } else {
never@3156 3928 ::close(fd);
never@3156 3929 return -1;
never@3156 3930 }
never@3156 3931 }
never@3156 3932
never@3156 3933 /*
never@3156 3934 * All file descriptors that are opened in the JVM and not
never@3156 3935 * specifically destined for a subprocess should have the
never@3156 3936 * close-on-exec flag set. If we don't set it, then careless 3rd
never@3156 3937 * party native code might fork and exec without closing all
never@3156 3938 * appropriate file descriptors (e.g. as we do in closeDescriptors in
never@3156 3939 * UNIXProcess.c), and this in turn might:
never@3156 3940 *
never@3156 3941 * - cause end-of-file to fail to be detected on some file
never@3156 3942 * descriptors, resulting in mysterious hangs, or
never@3156 3943 *
never@3156 3944 * - might cause an fopen in the subprocess to fail on a system
never@3156 3945 * suffering from bug 1085341.
never@3156 3946 *
never@3156 3947 * (Yes, the default setting of the close-on-exec flag is a Unix
never@3156 3948 * design flaw)
never@3156 3949 *
never@3156 3950 * See:
never@3156 3951 * 1085341: 32-bit stdio routines should support file descriptors >255
never@3156 3952 * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
never@3156 3953 * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
never@3156 3954 */
never@3156 3955 #ifdef FD_CLOEXEC
never@3156 3956 {
never@3156 3957 int flags = ::fcntl(fd, F_GETFD);
never@3156 3958 if (flags != -1)
never@3156 3959 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
never@3156 3960 }
never@3156 3961 #endif
never@3156 3962
never@3156 3963 if (o_delete != 0) {
never@3156 3964 ::unlink(path);
never@3156 3965 }
never@3156 3966 return fd;
never@3156 3967 }
never@3156 3968
never@3156 3969
never@3156 3970 // create binary file, rewriting existing file if required
never@3156 3971 int os::create_binary_file(const char* path, bool rewrite_existing) {
never@3156 3972 int oflags = O_WRONLY | O_CREAT;
never@3156 3973 if (!rewrite_existing) {
never@3156 3974 oflags |= O_EXCL;
never@3156 3975 }
never@3156 3976 return ::open(path, oflags, S_IREAD | S_IWRITE);
never@3156 3977 }
never@3156 3978
never@3156 3979 // return current position of file pointer
never@3156 3980 jlong os::current_file_offset(int fd) {
never@3156 3981 return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
never@3156 3982 }
never@3156 3983
never@3156 3984 // move file pointer to the specified offset
never@3156 3985 jlong os::seek_to_file_offset(int fd, jlong offset) {
never@3156 3986 return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
never@3156 3987 }
never@3156 3988
never@3156 3989 // This code originates from JDK's sysAvailable
never@3156 3990 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
never@3156 3991
never@3156 3992 int os::available(int fd, jlong *bytes) {
never@3156 3993 jlong cur, end;
never@3156 3994 int mode;
never@3156 3995 struct stat buf;
never@3156 3996
never@3156 3997 if (::fstat(fd, &buf) >= 0) {
never@3156 3998 mode = buf.st_mode;
never@3156 3999 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
never@3156 4000 /*
never@3156 4001 * XXX: is the following call interruptible? If so, this might
never@3156 4002 * need to go through the INTERRUPT_IO() wrapper as for other
never@3156 4003 * blocking, interruptible calls in this file.
never@3156 4004 */
never@3156 4005 int n;
never@3156 4006 if (::ioctl(fd, FIONREAD, &n) >= 0) {
never@3156 4007 *bytes = n;
never@3156 4008 return 1;
never@3156 4009 }
never@3156 4010 }
never@3156 4011 }
never@3156 4012 if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
never@3156 4013 return 0;
never@3156 4014 } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
never@3156 4015 return 0;
never@3156 4016 } else if (::lseek(fd, cur, SEEK_SET) == -1) {
never@3156 4017 return 0;
never@3156 4018 }
never@3156 4019 *bytes = end - cur;
never@3156 4020 return 1;
never@3156 4021 }
never@3156 4022
never@3156 4023 int os::socket_available(int fd, jint *pbytes) {
never@3156 4024 if (fd < 0)
never@3156 4025 return OS_OK;
never@3156 4026
never@3156 4027 int ret;
never@3156 4028
never@3156 4029 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
never@3156 4030
never@3156 4031 //%% note ioctl can return 0 when successful, JVM_SocketAvailable
never@3156 4032 // is expected to return 0 on failure and 1 on success to the jdk.
never@3156 4033
never@3156 4034 return (ret == OS_ERR) ? 0 : 1;
never@3156 4035 }
never@3156 4036
never@3156 4037 // Map a block of memory.
zgu@3900 4038 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
never@3156 4039 char *addr, size_t bytes, bool read_only,
never@3156 4040 bool allow_exec) {
never@3156 4041 int prot;
never@3156 4042 int flags;
never@3156 4043
never@3156 4044 if (read_only) {
never@3156 4045 prot = PROT_READ;
never@3156 4046 flags = MAP_SHARED;
never@3156 4047 } else {
never@3156 4048 prot = PROT_READ | PROT_WRITE;
never@3156 4049 flags = MAP_PRIVATE;
never@3156 4050 }
never@3156 4051
never@3156 4052 if (allow_exec) {
never@3156 4053 prot |= PROT_EXEC;
never@3156 4054 }
never@3156 4055
never@3156 4056 if (addr != NULL) {
never@3156 4057 flags |= MAP_FIXED;
never@3156 4058 }
never@3156 4059
never@3156 4060 char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
never@3156 4061 fd, file_offset);
never@3156 4062 if (mapped_address == MAP_FAILED) {
never@3156 4063 return NULL;
never@3156 4064 }
never@3156 4065 return mapped_address;
never@3156 4066 }
never@3156 4067
never@3156 4068
never@3156 4069 // Remap a block of memory.
zgu@3900 4070 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
never@3156 4071 char *addr, size_t bytes, bool read_only,
never@3156 4072 bool allow_exec) {
never@3156 4073 // same as map_memory() on this OS
never@3156 4074 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
never@3156 4075 allow_exec);
never@3156 4076 }
never@3156 4077
never@3156 4078
never@3156 4079 // Unmap a block of memory.
zgu@3900 4080 bool os::pd_unmap_memory(char* addr, size_t bytes) {
never@3156 4081 return munmap(addr, bytes) == 0;
never@3156 4082 }
never@3156 4083
never@3156 4084 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
never@3156 4085 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
never@3156 4086 // of a thread.
never@3156 4087 //
never@3156 4088 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
never@3156 4089 // the fast estimate available on the platform.
never@3156 4090
never@3156 4091 jlong os::current_thread_cpu_time() {
never@3156 4092 #ifdef __APPLE__
never@3156 4093 return os::thread_cpu_time(Thread::current(), true /* user + sys */);
morris@4689 4094 #else
morris@4689 4095 Unimplemented();
morris@4689 4096 return 0;
never@3156 4097 #endif
never@3156 4098 }
never@3156 4099
never@3156 4100 jlong os::thread_cpu_time(Thread* thread) {
morris@4689 4101 #ifdef __APPLE__
morris@4689 4102 return os::thread_cpu_time(thread, true /* user + sys */);
morris@4689 4103 #else
morris@4689 4104 Unimplemented();
morris@4689 4105 return 0;
morris@4689 4106 #endif
never@3156 4107 }
never@3156 4108
never@3156 4109 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
never@3156 4110 #ifdef __APPLE__
never@3156 4111 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
morris@4689 4112 #else
morris@4689 4113 Unimplemented();
morris@4689 4114 return 0;
never@3156 4115 #endif
never@3156 4116 }
never@3156 4117
never@3156 4118 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
never@3156 4119 #ifdef __APPLE__
never@3156 4120 struct thread_basic_info tinfo;
never@3156 4121 mach_msg_type_number_t tcount = THREAD_INFO_MAX;
never@3156 4122 kern_return_t kr;
sla@3587 4123 thread_t mach_thread;
sla@3587 4124
sla@3587 4125 mach_thread = thread->osthread()->thread_id();
never@3156 4126 kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
never@3156 4127 if (kr != KERN_SUCCESS)
never@3156 4128 return -1;
never@3156 4129
never@3156 4130 if (user_sys_cpu_time) {
never@3156 4131 jlong nanos;
never@3156 4132 nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
never@3156 4133 nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
never@3156 4134 return nanos;
never@3156 4135 } else {
never@3156 4136 return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
never@3156 4137 }
morris@4689 4138 #else
morris@4689 4139 Unimplemented();
morris@4689 4140 return 0;
never@3156 4141 #endif
never@3156 4142 }
never@3156 4143
never@3156 4144
never@3156 4145 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
never@3156 4146 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
never@3156 4147 info_ptr->may_skip_backward = false; // elapsed time not wall time
never@3156 4148 info_ptr->may_skip_forward = false; // elapsed time not wall time
never@3156 4149 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
never@3156 4150 }
never@3156 4151
never@3156 4152 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
never@3156 4153 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
never@3156 4154 info_ptr->may_skip_backward = false; // elapsed time not wall time
never@3156 4155 info_ptr->may_skip_forward = false; // elapsed time not wall time
never@3156 4156 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
never@3156 4157 }
never@3156 4158
never@3156 4159 bool os::is_thread_cpu_time_supported() {
never@3156 4160 #ifdef __APPLE__
never@3156 4161 return true;
sla@4229 4162 #else
never@3156 4163 return false;
never@3156 4164 #endif
never@3156 4165 }
never@3156 4166
never@3156 4167 // System loadavg support. Returns -1 if load average cannot be obtained.
never@3156 4168 // Bsd doesn't yet have a (official) notion of processor sets,
never@3156 4169 // so just return the system wide load average.
never@3156 4170 int os::loadavg(double loadavg[], int nelem) {
never@3156 4171 return ::getloadavg(loadavg, nelem);
never@3156 4172 }
never@3156 4173
never@3156 4174 void os::pause() {
never@3156 4175 char filename[MAX_PATH];
never@3156 4176 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
never@3156 4177 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
never@3156 4178 } else {
never@3156 4179 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
never@3156 4180 }
never@3156 4181
never@3156 4182 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
never@3156 4183 if (fd != -1) {
never@3156 4184 struct stat buf;
never@3156 4185 ::close(fd);
never@3156 4186 while (::stat(filename, &buf) == 0) {
never@3156 4187 (void)::poll(NULL, 0, 100);
never@3156 4188 }
never@3156 4189 } else {
never@3156 4190 jio_fprintf(stderr,
never@3156 4191 "Could not open pause file '%s', continuing immediately.\n", filename);
never@3156 4192 }
never@3156 4193 }
never@3156 4194
never@3156 4195
never@3156 4196 // Refer to the comments in os_solaris.cpp park-unpark.
never@3156 4197 //
never@3156 4198 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
never@3156 4199 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
never@3156 4200 // For specifics regarding the bug see GLIBC BUGID 261237 :
never@3156 4201 // http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
never@3156 4202 // Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
never@3156 4203 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
never@3156 4204 // is used. (The simple C test-case provided in the GLIBC bug report manifests the
never@3156 4205 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
never@3156 4206 // and monitorenter when we're using 1-0 locking. All those operations may result in
never@3156 4207 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
never@3156 4208 // of libpthread avoids the problem, but isn't practical.
never@3156 4209 //
never@3156 4210 // Possible remedies:
never@3156 4211 //
never@3156 4212 // 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work.
never@3156 4213 // This is palliative and probabilistic, however. If the thread is preempted
never@3156 4214 // between the call to compute_abstime() and pthread_cond_timedwait(), more
never@3156 4215 // than the minimum period may have passed, and the abstime may be stale (in the
never@3156 4216 // past) resultin in a hang. Using this technique reduces the odds of a hang
never@3156 4217 // but the JVM is still vulnerable, particularly on heavily loaded systems.
never@3156 4218 //
never@3156 4219 // 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
never@3156 4220 // of the usual flag-condvar-mutex idiom. The write side of the pipe is set
never@3156 4221 // NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
never@3156 4222 // reduces to poll()+read(). This works well, but consumes 2 FDs per extant
never@3156 4223 // thread.
never@3156 4224 //
never@3156 4225 // 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread
never@3156 4226 // that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
never@3156 4227 // a timeout request to the chron thread and then blocking via pthread_cond_wait().
never@3156 4228 // This also works well. In fact it avoids kernel-level scalability impediments
never@3156 4229 // on certain platforms that don't handle lots of active pthread_cond_timedwait()
never@3156 4230 // timers in a graceful fashion.
never@3156 4231 //
never@3156 4232 // 4. When the abstime value is in the past it appears that control returns
never@3156 4233 // correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
never@3156 4234 // Subsequent timedwait/wait calls may hang indefinitely. Given that, we
never@3156 4235 // can avoid the problem by reinitializing the condvar -- by cond_destroy()
never@3156 4236 // followed by cond_init() -- after all calls to pthread_cond_timedwait().
never@3156 4237 // It may be possible to avoid reinitialization by checking the return
never@3156 4238 // value from pthread_cond_timedwait(). In addition to reinitializing the
never@3156 4239 // condvar we must establish the invariant that cond_signal() is only called
never@3156 4240 // within critical sections protected by the adjunct mutex. This prevents
never@3156 4241 // cond_signal() from "seeing" a condvar that's in the midst of being
never@3156 4242 // reinitialized or that is corrupt. Sadly, this invariant obviates the
never@3156 4243 // desirable signal-after-unlock optimization that avoids futile context switching.
never@3156 4244 //
never@3156 4245 // I'm also concerned that some versions of NTPL might allocate an auxilliary
never@3156 4246 // structure when a condvar is used or initialized. cond_destroy() would
never@3156 4247 // release the helper structure. Our reinitialize-after-timedwait fix
never@3156 4248 // put excessive stress on malloc/free and locks protecting the c-heap.
never@3156 4249 //
never@3156 4250 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
never@3156 4251 // It may be possible to refine (4) by checking the kernel and NTPL verisons
never@3156 4252 // and only enabling the work-around for vulnerable environments.
never@3156 4253
never@3156 4254 // utility to compute the abstime argument to timedwait:
never@3156 4255 // millis is the relative timeout time
never@3156 4256 // abstime will be the absolute timeout time
never@3156 4257 // TODO: replace compute_abstime() with unpackTime()
never@3156 4258
never@3156 4259 static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
never@3156 4260 if (millis < 0) millis = 0;
never@3156 4261 struct timeval now;
never@3156 4262 int status = gettimeofday(&now, NULL);
never@3156 4263 assert(status == 0, "gettimeofday");
never@3156 4264 jlong seconds = millis / 1000;
never@3156 4265 millis %= 1000;
never@3156 4266 if (seconds > 50000000) { // see man cond_timedwait(3T)
never@3156 4267 seconds = 50000000;
never@3156 4268 }
never@3156 4269 abstime->tv_sec = now.tv_sec + seconds;
never@3156 4270 long usec = now.tv_usec + millis * 1000;
never@3156 4271 if (usec >= 1000000) {
never@3156 4272 abstime->tv_sec += 1;
never@3156 4273 usec -= 1000000;
never@3156 4274 }
never@3156 4275 abstime->tv_nsec = usec * 1000;
never@3156 4276 return abstime;
never@3156 4277 }
never@3156 4278
never@3156 4279
never@3156 4280 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
never@3156 4281 // Conceptually TryPark() should be equivalent to park(0).
never@3156 4282
never@3156 4283 int os::PlatformEvent::TryPark() {
never@3156 4284 for (;;) {
never@3156 4285 const int v = _Event ;
never@3156 4286 guarantee ((v == 0) || (v == 1), "invariant") ;
never@3156 4287 if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
never@3156 4288 }
never@3156 4289 }
never@3156 4290
never@3156 4291 void os::PlatformEvent::park() { // AKA "down()"
never@3156 4292 // Invariant: Only the thread associated with the Event/PlatformEvent
never@3156 4293 // may call park().
never@3156 4294 // TODO: assert that _Assoc != NULL or _Assoc == Self
never@3156 4295 int v ;
never@3156 4296 for (;;) {
never@3156 4297 v = _Event ;
never@3156 4298 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
never@3156 4299 }
never@3156 4300 guarantee (v >= 0, "invariant") ;
never@3156 4301 if (v == 0) {
never@3156 4302 // Do this the hard way by blocking ...
never@3156 4303 int status = pthread_mutex_lock(_mutex);
never@3156 4304 assert_status(status == 0, status, "mutex_lock");
never@3156 4305 guarantee (_nParked == 0, "invariant") ;
never@3156 4306 ++ _nParked ;
never@3156 4307 while (_Event < 0) {
never@3156 4308 status = pthread_cond_wait(_cond, _mutex);
never@3156 4309 // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
never@3156 4310 // Treat this the same as if the wait was interrupted
never@3156 4311 if (status == ETIMEDOUT) { status = EINTR; }
never@3156 4312 assert_status(status == 0 || status == EINTR, status, "cond_wait");
never@3156 4313 }
never@3156 4314 -- _nParked ;
never@3156 4315
never@3156 4316 _Event = 0 ;
never@3156 4317 status = pthread_mutex_unlock(_mutex);
never@3156 4318 assert_status(status == 0, status, "mutex_unlock");
dcubed@4471 4319 // Paranoia to ensure our locked and lock-free paths interact
dcubed@4471 4320 // correctly with each other.
dcubed@4471 4321 OrderAccess::fence();
never@3156 4322 }
never@3156 4323 guarantee (_Event >= 0, "invariant") ;
never@3156 4324 }
never@3156 4325
never@3156 4326 int os::PlatformEvent::park(jlong millis) {
never@3156 4327 guarantee (_nParked == 0, "invariant") ;
never@3156 4328
never@3156 4329 int v ;
never@3156 4330 for (;;) {
never@3156 4331 v = _Event ;
never@3156 4332 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
never@3156 4333 }
never@3156 4334 guarantee (v >= 0, "invariant") ;
never@3156 4335 if (v != 0) return OS_OK ;
never@3156 4336
never@3156 4337 // We do this the hard way, by blocking the thread.
never@3156 4338 // Consider enforcing a minimum timeout value.
never@3156 4339 struct timespec abst;
never@3156 4340 compute_abstime(&abst, millis);
never@3156 4341
never@3156 4342 int ret = OS_TIMEOUT;
never@3156 4343 int status = pthread_mutex_lock(_mutex);
never@3156 4344 assert_status(status == 0, status, "mutex_lock");
never@3156 4345 guarantee (_nParked == 0, "invariant") ;
never@3156 4346 ++_nParked ;
never@3156 4347
never@3156 4348 // Object.wait(timo) will return because of
never@3156 4349 // (a) notification
never@3156 4350 // (b) timeout
never@3156 4351 // (c) thread.interrupt
never@3156 4352 //
never@3156 4353 // Thread.interrupt and object.notify{All} both call Event::set.
never@3156 4354 // That is, we treat thread.interrupt as a special case of notification.
never@3156 4355 // The underlying Solaris implementation, cond_timedwait, admits
never@3156 4356 // spurious/premature wakeups, but the JLS/JVM spec prevents the
never@3156 4357 // JVM from making those visible to Java code. As such, we must
never@3156 4358 // filter out spurious wakeups. We assume all ETIME returns are valid.
never@3156 4359 //
never@3156 4360 // TODO: properly differentiate simultaneous notify+interrupt.
never@3156 4361 // In that case, we should propagate the notify to another waiter.
never@3156 4362
never@3156 4363 while (_Event < 0) {
never@3156 4364 status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
never@3156 4365 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
never@3156 4366 pthread_cond_destroy (_cond);
never@3156 4367 pthread_cond_init (_cond, NULL) ;
never@3156 4368 }
never@3156 4369 assert_status(status == 0 || status == EINTR ||
never@3156 4370 status == ETIMEDOUT,
never@3156 4371 status, "cond_timedwait");
never@3156 4372 if (!FilterSpuriousWakeups) break ; // previous semantics
never@3156 4373 if (status == ETIMEDOUT) break ;
never@3156 4374 // We consume and ignore EINTR and spurious wakeups.
never@3156 4375 }
never@3156 4376 --_nParked ;
never@3156 4377 if (_Event >= 0) {
never@3156 4378 ret = OS_OK;
never@3156 4379 }
never@3156 4380 _Event = 0 ;
never@3156 4381 status = pthread_mutex_unlock(_mutex);
never@3156 4382 assert_status(status == 0, status, "mutex_unlock");
never@3156 4383 assert (_nParked == 0, "invariant") ;
dcubed@4471 4384 // Paranoia to ensure our locked and lock-free paths interact
dcubed@4471 4385 // correctly with each other.
dcubed@4471 4386 OrderAccess::fence();
never@3156 4387 return ret;
never@3156 4388 }
never@3156 4389
never@3156 4390 void os::PlatformEvent::unpark() {
dcubed@4471 4391 // Transitions for _Event:
dcubed@4471 4392 // 0 :=> 1
dcubed@4471 4393 // 1 :=> 1
dcubed@4471 4394 // -1 :=> either 0 or 1; must signal target thread
dcubed@4471 4395 // That is, we can safely transition _Event from -1 to either
dcubed@4471 4396 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back
dcubed@4471 4397 // unpark() calls.
dcubed@4471 4398 // See also: "Semaphores in Plan 9" by Mullender & Cox
dcubed@4471 4399 //
dcubed@4471 4400 // Note: Forcing a transition from "-1" to "1" on an unpark() means
dcubed@4471 4401 // that it will take two back-to-back park() calls for the owning
dcubed@4471 4402 // thread to block. This has the benefit of forcing a spurious return
dcubed@4471 4403 // from the first park() call after an unpark() call which will help
dcubed@4471 4404 // shake out uses of park() and unpark() without condition variables.
dcubed@4471 4405
dcubed@4471 4406 if (Atomic::xchg(1, &_Event) >= 0) return;
dcubed@4471 4407
dcubed@4471 4408 // Wait for the thread associated with the event to vacate
dcubed@4471 4409 int status = pthread_mutex_lock(_mutex);
dcubed@4471 4410 assert_status(status == 0, status, "mutex_lock");
dcubed@4471 4411 int AnyWaiters = _nParked;
dcubed@4471 4412 assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
dcubed@4471 4413 if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
dcubed@4471 4414 AnyWaiters = 0;
dcubed@4471 4415 pthread_cond_signal(_cond);
never@3156 4416 }
dcubed@4471 4417 status = pthread_mutex_unlock(_mutex);
dcubed@4471 4418 assert_status(status == 0, status, "mutex_unlock");
dcubed@4471 4419 if (AnyWaiters != 0) {
dcubed@4471 4420 status = pthread_cond_signal(_cond);
dcubed@4471 4421 assert_status(status == 0, status, "cond_signal");
never@3156 4422 }
never@3156 4423
never@3156 4424 // Note that we signal() _after dropping the lock for "immortal" Events.
never@3156 4425 // This is safe and avoids a common class of futile wakeups. In rare
never@3156 4426 // circumstances this can cause a thread to return prematurely from
never@3156 4427 // cond_{timed}wait() but the spurious wakeup is benign and the victim will
never@3156 4428 // simply re-test the condition and re-park itself.
never@3156 4429 }
never@3156 4430
never@3156 4431
never@3156 4432 // JSR166
never@3156 4433 // -------------------------------------------------------
never@3156 4434
never@3156 4435 /*
never@3156 4436 * The solaris and bsd implementations of park/unpark are fairly
never@3156 4437 * conservative for now, but can be improved. They currently use a
never@3156 4438 * mutex/condvar pair, plus a a count.
never@3156 4439 * Park decrements count if > 0, else does a condvar wait. Unpark
never@3156 4440 * sets count to 1 and signals condvar. Only one thread ever waits
never@3156 4441 * on the condvar. Contention seen when trying to park implies that someone
never@3156 4442 * is unparking you, so don't wait. And spurious returns are fine, so there
never@3156 4443 * is no need to track notifications.
never@3156 4444 */
never@3156 4445
never@3156 4446 #define MAX_SECS 100000000
never@3156 4447 /*
never@3156 4448 * This code is common to bsd and solaris and will be moved to a
never@3156 4449 * common place in dolphin.
never@3156 4450 *
never@3156 4451 * The passed in time value is either a relative time in nanoseconds
never@3156 4452 * or an absolute time in milliseconds. Either way it has to be unpacked
never@3156 4453 * into suitable seconds and nanoseconds components and stored in the
never@3156 4454 * given timespec structure.
never@3156 4455 * Given time is a 64-bit value and the time_t used in the timespec is only
never@3156 4456 * a signed-32-bit value (except on 64-bit Bsd) we have to watch for
never@3156 4457 * overflow if times way in the future are given. Further on Solaris versions
never@3156 4458 * prior to 10 there is a restriction (see cond_timedwait) that the specified
never@3156 4459 * number of seconds, in abstime, is less than current_time + 100,000,000.
never@3156 4460 * As it will be 28 years before "now + 100000000" will overflow we can
never@3156 4461 * ignore overflow and just impose a hard-limit on seconds using the value
never@3156 4462 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
never@3156 4463 * years from "now".
never@3156 4464 */
never@3156 4465
never@3156 4466 static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
never@3156 4467 assert (time > 0, "convertTime");
never@3156 4468
never@3156 4469 struct timeval now;
never@3156 4470 int status = gettimeofday(&now, NULL);
never@3156 4471 assert(status == 0, "gettimeofday");
never@3156 4472
never@3156 4473 time_t max_secs = now.tv_sec + MAX_SECS;
never@3156 4474
never@3156 4475 if (isAbsolute) {
never@3156 4476 jlong secs = time / 1000;
never@3156 4477 if (secs > max_secs) {
never@3156 4478 absTime->tv_sec = max_secs;
never@3156 4479 }
never@3156 4480 else {
never@3156 4481 absTime->tv_sec = secs;
never@3156 4482 }
never@3156 4483 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
never@3156 4484 }
never@3156 4485 else {
never@3156 4486 jlong secs = time / NANOSECS_PER_SEC;
never@3156 4487 if (secs >= MAX_SECS) {
never@3156 4488 absTime->tv_sec = max_secs;
never@3156 4489 absTime->tv_nsec = 0;
never@3156 4490 }
never@3156 4491 else {
never@3156 4492 absTime->tv_sec = now.tv_sec + secs;
never@3156 4493 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
never@3156 4494 if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
never@3156 4495 absTime->tv_nsec -= NANOSECS_PER_SEC;
never@3156 4496 ++absTime->tv_sec; // note: this must be <= max_secs
never@3156 4497 }
never@3156 4498 }
never@3156 4499 }
never@3156 4500 assert(absTime->tv_sec >= 0, "tv_sec < 0");
never@3156 4501 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
never@3156 4502 assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
never@3156 4503 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
never@3156 4504 }
never@3156 4505
never@3156 4506 void Parker::park(bool isAbsolute, jlong time) {
dcubed@4471 4507 // Ideally we'd do something useful while spinning, such
dcubed@4471 4508 // as calling unpackTime().
dcubed@4471 4509
never@3156 4510 // Optional fast-path check:
never@3156 4511 // Return immediately if a permit is available.
dcubed@4471 4512 // We depend on Atomic::xchg() having full barrier semantics
dcubed@4471 4513 // since we are doing a lock-free update to _counter.
dcubed@4471 4514 if (Atomic::xchg(0, &_counter) > 0) return;
never@3156 4515
never@3156 4516 Thread* thread = Thread::current();
never@3156 4517 assert(thread->is_Java_thread(), "Must be JavaThread");
never@3156 4518 JavaThread *jt = (JavaThread *)thread;
never@3156 4519
never@3156 4520 // Optional optimization -- avoid state transitions if there's an interrupt pending.
never@3156 4521 // Check interrupt before trying to wait
never@3156 4522 if (Thread::is_interrupted(thread, false)) {
never@3156 4523 return;
never@3156 4524 }
never@3156 4525
never@3156 4526 // Next, demultiplex/decode time arguments
never@3156 4527 struct timespec absTime;
never@3156 4528 if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
never@3156 4529 return;
never@3156 4530 }
never@3156 4531 if (time > 0) {
never@3156 4532 unpackTime(&absTime, isAbsolute, time);
never@3156 4533 }
never@3156 4534
never@3156 4535
never@3156 4536 // Enter safepoint region
never@3156 4537 // Beware of deadlocks such as 6317397.
never@3156 4538 // The per-thread Parker:: mutex is a classic leaf-lock.
never@3156 4539 // In particular a thread must never block on the Threads_lock while
never@3156 4540 // holding the Parker:: mutex. If safepoints are pending both the
never@3156 4541 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
never@3156 4542 ThreadBlockInVM tbivm(jt);
never@3156 4543
never@3156 4544 // Don't wait if cannot get lock since interference arises from
never@3156 4545 // unblocking. Also. check interrupt before trying wait
never@3156 4546 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
never@3156 4547 return;
never@3156 4548 }
never@3156 4549
never@3156 4550 int status ;
never@3156 4551 if (_counter > 0) { // no wait needed
never@3156 4552 _counter = 0;
never@3156 4553 status = pthread_mutex_unlock(_mutex);
never@3156 4554 assert (status == 0, "invariant") ;
dcubed@4471 4555 // Paranoia to ensure our locked and lock-free paths interact
dcubed@4471 4556 // correctly with each other and Java-level accesses.
never@3156 4557 OrderAccess::fence();
never@3156 4558 return;
never@3156 4559 }
never@3156 4560
never@3156 4561 #ifdef ASSERT
never@3156 4562 // Don't catch signals while blocked; let the running threads have the signals.
never@3156 4563 // (This allows a debugger to break into the running thread.)
never@3156 4564 sigset_t oldsigs;
never@3156 4565 sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
never@3156 4566 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
never@3156 4567 #endif
never@3156 4568
never@3156 4569 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
never@3156 4570 jt->set_suspend_equivalent();
never@3156 4571 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
never@3156 4572
never@3156 4573 if (time == 0) {
never@3156 4574 status = pthread_cond_wait (_cond, _mutex) ;
never@3156 4575 } else {
never@3156 4576 status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
never@3156 4577 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
never@3156 4578 pthread_cond_destroy (_cond) ;
never@3156 4579 pthread_cond_init (_cond, NULL);
never@3156 4580 }
never@3156 4581 }
never@3156 4582 assert_status(status == 0 || status == EINTR ||
never@3156 4583 status == ETIMEDOUT,
never@3156 4584 status, "cond_timedwait");
never@3156 4585
never@3156 4586 #ifdef ASSERT
never@3156 4587 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
never@3156 4588 #endif
never@3156 4589
never@3156 4590 _counter = 0 ;
never@3156 4591 status = pthread_mutex_unlock(_mutex) ;
never@3156 4592 assert_status(status == 0, status, "invariant") ;
dcubed@4471 4593 // Paranoia to ensure our locked and lock-free paths interact
dcubed@4471 4594 // correctly with each other and Java-level accesses.
dcubed@4471 4595 OrderAccess::fence();
dcubed@4471 4596
never@3156 4597 // If externally suspended while waiting, re-suspend
never@3156 4598 if (jt->handle_special_suspend_equivalent_condition()) {
never@3156 4599 jt->java_suspend_self();
never@3156 4600 }
never@3156 4601 }
never@3156 4602
never@3156 4603 void Parker::unpark() {
never@3156 4604 int s, status ;
never@3156 4605 status = pthread_mutex_lock(_mutex);
never@3156 4606 assert (status == 0, "invariant") ;
never@3156 4607 s = _counter;
never@3156 4608 _counter = 1;
never@3156 4609 if (s < 1) {
never@3156 4610 if (WorkAroundNPTLTimedWaitHang) {
never@3156 4611 status = pthread_cond_signal (_cond) ;
never@3156 4612 assert (status == 0, "invariant") ;
never@3156 4613 status = pthread_mutex_unlock(_mutex);
never@3156 4614 assert (status == 0, "invariant") ;
never@3156 4615 } else {
never@3156 4616 status = pthread_mutex_unlock(_mutex);
never@3156 4617 assert (status == 0, "invariant") ;
never@3156 4618 status = pthread_cond_signal (_cond) ;
never@3156 4619 assert (status == 0, "invariant") ;
never@3156 4620 }
never@3156 4621 } else {
never@3156 4622 pthread_mutex_unlock(_mutex);
never@3156 4623 assert (status == 0, "invariant") ;
never@3156 4624 }
never@3156 4625 }
never@3156 4626
never@3156 4627
never@3156 4628 /* Darwin has no "environ" in a dynamic library. */
never@3156 4629 #ifdef __APPLE__
never@3156 4630 #include <crt_externs.h>
never@3156 4631 #define environ (*_NSGetEnviron())
never@3156 4632 #else
never@3156 4633 extern char** environ;
never@3156 4634 #endif
never@3156 4635
never@3156 4636 // Run the specified command in a separate process. Return its exit value,
never@3156 4637 // or -1 on failure (e.g. can't fork a new process).
never@3156 4638 // Unlike system(), this function can be called from signal handler. It
never@3156 4639 // doesn't block SIGINT et al.
never@3156 4640 int os::fork_and_exec(char* cmd) {
never@3156 4641 const char * argv[4] = {"sh", "-c", cmd, NULL};
never@3156 4642
never@3156 4643 // fork() in BsdThreads/NPTL is not async-safe. It needs to run
never@3156 4644 // pthread_atfork handlers and reset pthread library. All we need is a
never@3156 4645 // separate process to execve. Make a direct syscall to fork process.
never@3156 4646 // On IA64 there's no fork syscall, we have to use fork() and hope for
never@3156 4647 // the best...
never@3156 4648 pid_t pid = fork();
never@3156 4649
never@3156 4650 if (pid < 0) {
never@3156 4651 // fork failed
never@3156 4652 return -1;
never@3156 4653
never@3156 4654 } else if (pid == 0) {
never@3156 4655 // child process
never@3156 4656
never@3156 4657 // execve() in BsdThreads will call pthread_kill_other_threads_np()
never@3156 4658 // first to kill every thread on the thread list. Because this list is
never@3156 4659 // not reset by fork() (see notes above), execve() will instead kill
never@3156 4660 // every thread in the parent process. We know this is the only thread
never@3156 4661 // in the new process, so make a system call directly.
never@3156 4662 // IA64 should use normal execve() from glibc to match the glibc fork()
never@3156 4663 // above.
never@3156 4664 execve("/bin/sh", (char* const*)argv, environ);
never@3156 4665
never@3156 4666 // execve failed
never@3156 4667 _exit(-1);
never@3156 4668
never@3156 4669 } else {
never@3156 4670 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
never@3156 4671 // care about the actual exit code, for now.
never@3156 4672
never@3156 4673 int status;
never@3156 4674
never@3156 4675 // Wait for the child process to exit. This returns immediately if
never@3156 4676 // the child has already exited. */
never@3156 4677 while (waitpid(pid, &status, 0) < 0) {
never@3156 4678 switch (errno) {
never@3156 4679 case ECHILD: return 0;
never@3156 4680 case EINTR: break;
never@3156 4681 default: return -1;
never@3156 4682 }
never@3156 4683 }
never@3156 4684
never@3156 4685 if (WIFEXITED(status)) {
never@3156 4686 // The child exited normally; get its exit code.
never@3156 4687 return WEXITSTATUS(status);
never@3156 4688 } else if (WIFSIGNALED(status)) {
never@3156 4689 // The child exited because of a signal
never@3156 4690 // The best value to return is 0x80 + signal number,
never@3156 4691 // because that is what all Unix shells do, and because
never@3156 4692 // it allows callers to distinguish between process exit and
never@3156 4693 // process death by signal.
never@3156 4694 return 0x80 + WTERMSIG(status);
never@3156 4695 } else {
never@3156 4696 // Unknown exit code; pass it through
never@3156 4697 return status;
never@3156 4698 }
never@3156 4699 }
never@3156 4700 }
never@3156 4701
never@3156 4702 // is_headless_jre()
never@3156 4703 //
dholmes@3281 4704 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
never@3156 4705 // in order to report if we are running in a headless jre
never@3156 4706 //
dholmes@3281 4707 // Since JDK8 xawt/libmawt.so was moved into the same directory
dholmes@3281 4708 // as libawt.so, and renamed libawt_xawt.so
dholmes@3281 4709 //
never@3156 4710 bool os::is_headless_jre() {
never@3156 4711 struct stat statbuf;
never@3156 4712 char buf[MAXPATHLEN];
never@3156 4713 char libmawtpath[MAXPATHLEN];
dcubed@3202 4714 const char *xawtstr = "/xawt/libmawt" JNI_LIB_SUFFIX;
dcubed@3625 4715 const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
never@3156 4716 char *p;
never@3156 4717
never@3156 4718 // Get path to libjvm.so
never@3156 4719 os::jvm_path(buf, sizeof(buf));
never@3156 4720
never@3156 4721 // Get rid of libjvm.so
never@3156 4722 p = strrchr(buf, '/');
never@3156 4723 if (p == NULL) return false;
never@3156 4724 else *p = '\0';
never@3156 4725
never@3156 4726 // Get rid of client or server
never@3156 4727 p = strrchr(buf, '/');
never@3156 4728 if (p == NULL) return false;
never@3156 4729 else *p = '\0';
never@3156 4730
never@3156 4731 // check xawt/libmawt.so
never@3156 4732 strcpy(libmawtpath, buf);
never@3156 4733 strcat(libmawtpath, xawtstr);
never@3156 4734 if (::stat(libmawtpath, &statbuf) == 0) return false;
never@3156 4735
dholmes@3281 4736 // check libawt_xawt.so
never@3156 4737 strcpy(libmawtpath, buf);
dholmes@3281 4738 strcat(libmawtpath, new_xawtstr);
never@3156 4739 if (::stat(libmawtpath, &statbuf) == 0) return false;
never@3156 4740
never@3156 4741 return true;
never@3156 4742 }
mikael@3903 4743
mikael@3903 4744 // Get the default path to the core file
mikael@3903 4745 // Returns the length of the string
mikael@3903 4746 int os::get_core_path(char* buffer, size_t bufferSize) {
mikael@3903 4747 int n = jio_snprintf(buffer, bufferSize, "/cores");
mikael@3903 4748
mikael@3903 4749 // Truncate if theoretical string was longer than bufferSize
mikael@3903 4750 n = MIN2(n, (int)bufferSize);
mikael@3903 4751
mikael@3903 4752 return n;
mikael@3903 4753 }
sla@5237 4754
stefank@5578 4755 #ifndef PRODUCT
stefank@5578 4756 void TestReserveMemorySpecial_test() {
stefank@5578 4757 // No tests available for this platform
stefank@5578 4758 }
stefank@5578 4759 #endif

mercurial