src/os/bsd/vm/os_bsd.cpp

Wed, 27 Mar 2013 19:21:18 +0100

author
tschatzl
date
Wed, 27 Mar 2013 19:21:18 +0100
changeset 4854
754c24457b20
parent 4713
252ad8d5f22b
child 4891
8be1318fbe77
permissions
-rw-r--r--

7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method.
Reviewed-by: jmasa, tamao

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

mercurial