Wed, 31 Jan 2018 19:24:57 -0500
8189170: Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM
Reviewed-by: dcubed
1 /*
2 * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
3 * Copyright 2012, 2014 SAP AG. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
26 // According to the AIX OS doc #pragma alloca must be used
27 // with C++ compiler before referencing the function alloca()
28 #pragma alloca
30 // no precompiled headers
31 #include "classfile/classLoader.hpp"
32 #include "classfile/systemDictionary.hpp"
33 #include "classfile/vmSymbols.hpp"
34 #include "code/icBuffer.hpp"
35 #include "code/vtableStubs.hpp"
36 #include "compiler/compileBroker.hpp"
37 #include "interpreter/interpreter.hpp"
38 #include "jvm_aix.h"
39 #include "libperfstat_aix.hpp"
40 #include "loadlib_aix.hpp"
41 #include "memory/allocation.inline.hpp"
42 #include "memory/filemap.hpp"
43 #include "mutex_aix.inline.hpp"
44 #include "oops/oop.inline.hpp"
45 #include "os_share_aix.hpp"
46 #include "porting_aix.hpp"
47 #include "prims/jniFastGetField.hpp"
48 #include "prims/jvm.h"
49 #include "prims/jvm_misc.hpp"
50 #include "runtime/arguments.hpp"
51 #include "runtime/extendedPC.hpp"
52 #include "runtime/globals.hpp"
53 #include "runtime/interfaceSupport.hpp"
54 #include "runtime/java.hpp"
55 #include "runtime/javaCalls.hpp"
56 #include "runtime/mutexLocker.hpp"
57 #include "runtime/objectMonitor.hpp"
58 #include "runtime/orderAccess.inline.hpp"
59 #include "runtime/osThread.hpp"
60 #include "runtime/perfMemory.hpp"
61 #include "runtime/sharedRuntime.hpp"
62 #include "runtime/statSampler.hpp"
63 #include "runtime/stubRoutines.hpp"
64 #include "runtime/thread.inline.hpp"
65 #include "runtime/threadCritical.hpp"
66 #include "runtime/timer.hpp"
67 #include "services/attachListener.hpp"
68 #include "services/runtimeService.hpp"
69 #include "utilities/decoder.hpp"
70 #include "utilities/defaultStream.hpp"
71 #include "utilities/events.hpp"
72 #include "utilities/growableArray.hpp"
73 #include "utilities/vmError.hpp"
75 // put OS-includes here (sorted alphabetically)
76 #include <errno.h>
77 #include <fcntl.h>
78 #include <inttypes.h>
79 #include <poll.h>
80 #include <procinfo.h>
81 #include <pthread.h>
82 #include <pwd.h>
83 #include <semaphore.h>
84 #include <signal.h>
85 #include <stdint.h>
86 #include <stdio.h>
87 #include <string.h>
88 #include <unistd.h>
89 #include <sys/ioctl.h>
90 #include <sys/ipc.h>
91 #include <sys/mman.h>
92 #include <sys/resource.h>
93 #include <sys/select.h>
94 #include <sys/shm.h>
95 #include <sys/socket.h>
96 #include <sys/stat.h>
97 #include <sys/sysinfo.h>
98 #include <sys/systemcfg.h>
99 #include <sys/time.h>
100 #include <sys/times.h>
101 #include <sys/types.h>
102 #include <sys/utsname.h>
103 #include <sys/vminfo.h>
104 #include <sys/wait.h>
106 // Add missing declarations (should be in procinfo.h but isn't until AIX 6.1).
107 #if !defined(_AIXVERSION_610)
108 extern "C" {
109 int getthrds64(pid_t ProcessIdentifier,
110 struct thrdentry64* ThreadBuffer,
111 int ThreadSize,
112 tid64_t* IndexPointer,
113 int Count);
114 }
115 #endif
117 #define MAX_PATH (2 * K)
119 // for timer info max values which include all bits
120 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
121 // for multipage initialization error analysis (in 'g_multipage_error')
122 #define ERROR_MP_OS_TOO_OLD 100
123 #define ERROR_MP_EXTSHM_ACTIVE 101
124 #define ERROR_MP_VMGETINFO_FAILED 102
125 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103
127 // The semantics in this file are thus that codeptr_t is a *real code ptr*.
128 // This means that any function taking codeptr_t as arguments will assume
129 // a real codeptr and won't handle function descriptors (eg getFuncName),
130 // whereas functions taking address as args will deal with function
131 // descriptors (eg os::dll_address_to_library_name).
132 typedef unsigned int* codeptr_t;
134 // Typedefs for stackslots, stack pointers, pointers to op codes.
135 typedef unsigned long stackslot_t;
136 typedef stackslot_t* stackptr_t;
138 // Excerpts from systemcfg.h definitions newer than AIX 5.3.
139 #ifndef PV_7
140 #define PV_7 0x200000 /* Power PC 7 */
141 #define PV_7_Compat 0x208000 /* Power PC 7 */
142 #endif
143 #ifndef PV_8
144 #define PV_8 0x300000 /* Power PC 8 */
145 #define PV_8_Compat 0x308000 /* Power PC 8 */
146 #endif
148 #define trcVerbose(fmt, ...) { /* PPC port */ \
149 if (Verbose) { \
150 fprintf(stderr, fmt, ##__VA_ARGS__); \
151 fputc('\n', stderr); fflush(stderr); \
152 } \
153 }
154 #define trc(fmt, ...) /* PPC port */
156 #define ERRBYE(s) { \
157 trcVerbose(s); \
158 return -1; \
159 }
161 // query dimensions of the stack of the calling thread
162 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size);
164 // function to check a given stack pointer against given stack limits
165 inline bool is_valid_stackpointer(stackptr_t sp, stackptr_t stack_base, size_t stack_size) {
166 if (((uintptr_t)sp) & 0x7) {
167 return false;
168 }
169 if (sp > stack_base) {
170 return false;
171 }
172 if (sp < (stackptr_t) ((address)stack_base - stack_size)) {
173 return false;
174 }
175 return true;
176 }
178 // returns true if function is a valid codepointer
179 inline bool is_valid_codepointer(codeptr_t p) {
180 if (!p) {
181 return false;
182 }
183 if (((uintptr_t)p) & 0x3) {
184 return false;
185 }
186 if (LoadedLibraries::find_for_text_address((address)p) == NULL) {
187 return false;
188 }
189 return true;
190 }
192 // Macro to check a given stack pointer against given stack limits and to die if test fails.
193 #define CHECK_STACK_PTR(sp, stack_base, stack_size) { \
194 guarantee(is_valid_stackpointer((stackptr_t)(sp), (stackptr_t)(stack_base), stack_size), "Stack Pointer Invalid"); \
195 }
197 // Macro to check the current stack pointer against given stacklimits.
198 #define CHECK_CURRENT_STACK_PTR(stack_base, stack_size) { \
199 address sp; \
200 sp = os::current_stack_pointer(); \
201 CHECK_STACK_PTR(sp, stack_base, stack_size); \
202 }
204 ////////////////////////////////////////////////////////////////////////////////
205 // global variables (for a description see os_aix.hpp)
207 julong os::Aix::_physical_memory = 0;
208 pthread_t os::Aix::_main_thread = ((pthread_t)0);
209 int os::Aix::_page_size = -1;
210 int os::Aix::_on_pase = -1;
211 int os::Aix::_os_version = -1;
212 int os::Aix::_stack_page_size = -1;
213 size_t os::Aix::_shm_default_page_size = -1;
214 int os::Aix::_can_use_64K_pages = -1;
215 int os::Aix::_can_use_16M_pages = -1;
216 int os::Aix::_xpg_sus_mode = -1;
217 int os::Aix::_extshm = -1;
218 int os::Aix::_logical_cpus = -1;
220 ////////////////////////////////////////////////////////////////////////////////
221 // local variables
223 static int g_multipage_error = -1; // error analysis for multipage initialization
224 static jlong initial_time_count = 0;
225 static int clock_tics_per_sec = 100;
226 static sigset_t check_signal_done; // For diagnostics to print a message once (see run_periodic_checks)
227 static bool check_signals = true;
228 static pid_t _initial_pid = 0;
229 static int SR_signum = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769)
230 static sigset_t SR_sigset;
231 static pthread_mutex_t dl_mutex; // Used to protect dlsym() calls.
233 julong os::available_memory() {
234 return Aix::available_memory();
235 }
237 julong os::Aix::available_memory() {
238 os::Aix::meminfo_t mi;
239 if (os::Aix::get_meminfo(&mi)) {
240 return mi.real_free;
241 } else {
242 return 0xFFFFFFFFFFFFFFFFLL;
243 }
244 }
246 julong os::physical_memory() {
247 return Aix::physical_memory();
248 }
250 ////////////////////////////////////////////////////////////////////////////////
251 // environment support
253 bool os::getenv(const char* name, char* buf, int len) {
254 const char* val = ::getenv(name);
255 if (val != NULL && strlen(val) < (size_t)len) {
256 strcpy(buf, val);
257 return true;
258 }
259 if (len > 0) buf[0] = 0; // return a null string
260 return false;
261 }
263 // Return true if user is running as root.
265 bool os::have_special_privileges() {
266 static bool init = false;
267 static bool privileges = false;
268 if (!init) {
269 privileges = (getuid() != geteuid()) || (getgid() != getegid());
270 init = true;
271 }
272 return privileges;
273 }
275 // Helper function, emulates disclaim64 using multiple 32bit disclaims
276 // because we cannot use disclaim64() on AS/400 and old AIX releases.
277 static bool my_disclaim64(char* addr, size_t size) {
279 if (size == 0) {
280 return true;
281 }
283 // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.)
284 const unsigned int maxDisclaimSize = 0x80000000;
286 const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize);
287 const unsigned int lastDisclaimSize = (size % maxDisclaimSize);
289 char* p = addr;
291 for (int i = 0; i < numFullDisclaimsNeeded; i ++) {
292 if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
293 trc("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
294 return false;
295 }
296 p += maxDisclaimSize;
297 }
299 if (lastDisclaimSize > 0) {
300 if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
301 trc("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
302 return false;
303 }
304 }
306 return true;
307 }
309 // Cpu architecture string
310 #if defined(PPC32)
311 static char cpu_arch[] = "ppc";
312 #elif defined(PPC64)
313 static char cpu_arch[] = "ppc64";
314 #else
315 #error Add appropriate cpu_arch setting
316 #endif
319 // Given an address, returns the size of the page backing that address.
320 size_t os::Aix::query_pagesize(void* addr) {
322 vm_page_info pi;
323 pi.addr = (uint64_t)addr;
324 if (::vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) {
325 return pi.pagesize;
326 } else {
327 fprintf(stderr, "vmgetinfo failed to retrieve page size for address %p (errno %d).\n", addr, errno);
328 assert(false, "vmgetinfo failed to retrieve page size");
329 return SIZE_4K;
330 }
332 }
334 // Returns the kernel thread id of the currently running thread.
335 pid_t os::Aix::gettid() {
336 return (pid_t) thread_self();
337 }
339 void os::Aix::initialize_system_info() {
341 // Get the number of online(logical) cpus instead of configured.
342 os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN);
343 assert(_processor_count > 0, "_processor_count must be > 0");
345 // Retrieve total physical storage.
346 os::Aix::meminfo_t mi;
347 if (!os::Aix::get_meminfo(&mi)) {
348 fprintf(stderr, "os::Aix::get_meminfo failed.\n"); fflush(stderr);
349 assert(false, "os::Aix::get_meminfo failed.");
350 }
351 _physical_memory = (julong) mi.real_total;
352 }
354 // Helper function for tracing page sizes.
355 static const char* describe_pagesize(size_t pagesize) {
356 switch (pagesize) {
357 case SIZE_4K : return "4K";
358 case SIZE_64K: return "64K";
359 case SIZE_16M: return "16M";
360 case SIZE_16G: return "16G";
361 default:
362 assert(false, "surprise");
363 return "??";
364 }
365 }
367 // Retrieve information about multipage size support. Will initialize
368 // Aix::_page_size, Aix::_stack_page_size, Aix::_can_use_64K_pages,
369 // Aix::_can_use_16M_pages.
370 // Must be called before calling os::large_page_init().
371 void os::Aix::query_multipage_support() {
373 guarantee(_page_size == -1 &&
374 _stack_page_size == -1 &&
375 _can_use_64K_pages == -1 &&
376 _can_use_16M_pages == -1 &&
377 g_multipage_error == -1,
378 "do not call twice");
380 _page_size = ::sysconf(_SC_PAGESIZE);
382 // This really would surprise me.
383 assert(_page_size == SIZE_4K, "surprise!");
386 // Query default data page size (default page size for C-Heap, pthread stacks and .bss).
387 // Default data page size is influenced either by linker options (-bdatapsize)
388 // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given,
389 // default should be 4K.
390 size_t data_page_size = SIZE_4K;
391 {
392 void* p = ::malloc(SIZE_16M);
393 guarantee(p != NULL, "malloc failed");
394 data_page_size = os::Aix::query_pagesize(p);
395 ::free(p);
396 }
398 // query default shm page size (LDR_CNTRL SHMPSIZE)
399 {
400 const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
401 guarantee(shmid != -1, "shmget failed");
402 void* p = ::shmat(shmid, NULL, 0);
403 ::shmctl(shmid, IPC_RMID, NULL);
404 guarantee(p != (void*) -1, "shmat failed");
405 _shm_default_page_size = os::Aix::query_pagesize(p);
406 ::shmdt(p);
407 }
409 // before querying the stack page size, make sure we are not running as primordial
410 // thread (because primordial thread's stack may have different page size than
411 // pthread thread stacks). Running a VM on the primordial thread won't work for a
412 // number of reasons so we may just as well guarantee it here
413 guarantee(!os::is_primordial_thread(), "Must not be called for primordial thread");
415 // query stack page size
416 {
417 int dummy = 0;
418 _stack_page_size = os::Aix::query_pagesize(&dummy);
419 // everything else would surprise me and should be looked into
420 guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size");
421 // also, just for completeness: pthread stacks are allocated from C heap, so
422 // stack page size should be the same as data page size
423 guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size");
424 }
426 // EXTSHM is bad: among other things, it prevents setting pagesize dynamically
427 // for system V shm.
428 if (Aix::extshm()) {
429 if (Verbose) {
430 fprintf(stderr, "EXTSHM is active - will disable large page support.\n"
431 "Please make sure EXTSHM is OFF for large page support.\n");
432 }
433 g_multipage_error = ERROR_MP_EXTSHM_ACTIVE;
434 _can_use_64K_pages = _can_use_16M_pages = 0;
435 goto query_multipage_support_end;
436 }
438 // now check which page sizes the OS claims it supports, and of those, which actually can be used.
439 {
440 const int MAX_PAGE_SIZES = 4;
441 psize_t sizes[MAX_PAGE_SIZES];
442 const int num_psizes = ::vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES);
443 if (num_psizes == -1) {
444 if (Verbose) {
445 fprintf(stderr, "vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)\n", errno);
446 fprintf(stderr, "disabling multipage support.\n");
447 }
448 g_multipage_error = ERROR_MP_VMGETINFO_FAILED;
449 _can_use_64K_pages = _can_use_16M_pages = 0;
450 goto query_multipage_support_end;
451 }
452 guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed.");
453 assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?");
454 if (Verbose) {
455 fprintf(stderr, "vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes);
456 for (int i = 0; i < num_psizes; i ++) {
457 fprintf(stderr, " %s ", describe_pagesize(sizes[i]));
458 }
459 fprintf(stderr, " .\n");
460 }
462 // Can we use 64K, 16M pages?
463 _can_use_64K_pages = 0;
464 _can_use_16M_pages = 0;
465 for (int i = 0; i < num_psizes; i ++) {
466 if (sizes[i] == SIZE_64K) {
467 _can_use_64K_pages = 1;
468 } else if (sizes[i] == SIZE_16M) {
469 _can_use_16M_pages = 1;
470 }
471 }
473 if (!_can_use_64K_pages) {
474 g_multipage_error = ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K;
475 }
477 // Double-check for 16M pages: Even if AIX claims to be able to use 16M pages,
478 // there must be an actual 16M page pool, and we must run with enough rights.
479 if (_can_use_16M_pages) {
480 const int shmid = ::shmget(IPC_PRIVATE, SIZE_16M, IPC_CREAT | S_IRUSR | S_IWUSR);
481 guarantee(shmid != -1, "shmget failed");
482 struct shmid_ds shm_buf = { 0 };
483 shm_buf.shm_pagesize = SIZE_16M;
484 const bool can_set_pagesize = ::shmctl(shmid, SHM_PAGESIZE, &shm_buf) == 0 ? true : false;
485 const int en = errno;
486 ::shmctl(shmid, IPC_RMID, NULL);
487 if (!can_set_pagesize) {
488 if (Verbose) {
489 fprintf(stderr, "Failed to allocate even one misely 16M page. shmctl failed with %d (%s).\n"
490 "Will deactivate 16M support.\n", en, strerror(en));
491 }
492 _can_use_16M_pages = 0;
493 }
494 }
496 } // end: check which pages can be used for shared memory
498 query_multipage_support_end:
500 guarantee(_page_size != -1 &&
501 _stack_page_size != -1 &&
502 _can_use_64K_pages != -1 &&
503 _can_use_16M_pages != -1, "Page sizes not properly initialized");
505 if (_can_use_64K_pages) {
506 g_multipage_error = 0;
507 }
509 if (Verbose) {
510 fprintf(stderr, "Data page size (C-Heap, bss, etc): %s\n", describe_pagesize(data_page_size));
511 fprintf(stderr, "Thread stack page size (pthread): %s\n", describe_pagesize(_stack_page_size));
512 fprintf(stderr, "Default shared memory page size: %s\n", describe_pagesize(_shm_default_page_size));
513 fprintf(stderr, "Can use 64K pages dynamically with shared meory: %s\n", (_can_use_64K_pages ? "yes" :"no"));
514 fprintf(stderr, "Can use 16M pages dynamically with shared memory: %s\n", (_can_use_16M_pages ? "yes" :"no"));
515 fprintf(stderr, "Multipage error details: %d\n", g_multipage_error);
516 }
518 } // end os::Aix::query_multipage_support()
520 void os::init_system_properties_values() {
522 #define DEFAULT_LIBPATH "/usr/lib:/lib"
523 #define EXTENSIONS_DIR "/lib/ext"
524 #define ENDORSED_DIR "/lib/endorsed"
526 // Buffer that fits several sprintfs.
527 // Note that the space for the trailing null is provided
528 // by the nulls included by the sizeof operator.
529 const size_t bufsize =
530 MAX3((size_t)MAXPATHLEN, // For dll_dir & friends.
531 (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR), // extensions dir
532 (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
533 char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
535 // sysclasspath, java_home, dll_dir
536 {
537 char *pslash;
538 os::jvm_path(buf, bufsize);
540 // Found the full path to libjvm.so.
541 // Now cut the path to <java_home>/jre if we can.
542 *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so.
543 pslash = strrchr(buf, '/');
544 if (pslash != NULL) {
545 *pslash = '\0'; // Get rid of /{client|server|hotspot}.
546 }
547 Arguments::set_dll_dir(buf);
549 if (pslash != NULL) {
550 pslash = strrchr(buf, '/');
551 if (pslash != NULL) {
552 *pslash = '\0'; // Get rid of /<arch>.
553 pslash = strrchr(buf, '/');
554 if (pslash != NULL) {
555 *pslash = '\0'; // Get rid of /lib.
556 }
557 }
558 }
559 Arguments::set_java_home(buf);
560 set_boot_path('/', ':');
561 }
563 // Where to look for native libraries.
565 // On Aix we get the user setting of LIBPATH.
566 // Eventually, all the library path setting will be done here.
567 // Get the user setting of LIBPATH.
568 const char *v = ::getenv("LIBPATH");
569 const char *v_colon = ":";
570 if (v == NULL) { v = ""; v_colon = ""; }
572 // Concatenate user and invariant part of ld_library_path.
573 // That's +1 for the colon and +1 for the trailing '\0'.
574 char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
575 sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
576 Arguments::set_library_path(ld_library_path);
577 FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
579 // Extensions directories.
580 sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
581 Arguments::set_ext_dirs(buf);
583 // Endorsed standards default directory.
584 sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
585 Arguments::set_endorsed_dirs(buf);
587 FREE_C_HEAP_ARRAY(char, buf, mtInternal);
589 #undef DEFAULT_LIBPATH
590 #undef EXTENSIONS_DIR
591 #undef ENDORSED_DIR
592 }
594 ////////////////////////////////////////////////////////////////////////////////
595 // breakpoint support
597 void os::breakpoint() {
598 BREAKPOINT;
599 }
601 extern "C" void breakpoint() {
602 // use debugger to set breakpoint here
603 }
605 ////////////////////////////////////////////////////////////////////////////////
606 // signal support
608 debug_only(static bool signal_sets_initialized = false);
609 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
611 bool os::Aix::is_sig_ignored(int sig) {
612 struct sigaction oact;
613 sigaction(sig, (struct sigaction*)NULL, &oact);
614 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
615 : CAST_FROM_FN_PTR(void*, oact.sa_handler);
616 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
617 return true;
618 } else {
619 return false;
620 }
621 }
623 void os::Aix::signal_sets_init() {
624 // Should also have an assertion stating we are still single-threaded.
625 assert(!signal_sets_initialized, "Already initialized");
626 // Fill in signals that are necessarily unblocked for all threads in
627 // the VM. Currently, we unblock the following signals:
628 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
629 // by -Xrs (=ReduceSignalUsage));
630 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
631 // other threads. The "ReduceSignalUsage" boolean tells us not to alter
632 // the dispositions or masks wrt these signals.
633 // Programs embedding the VM that want to use the above signals for their
634 // own purposes must, at this time, use the "-Xrs" option to prevent
635 // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
636 // (See bug 4345157, and other related bugs).
637 // In reality, though, unblocking these signals is really a nop, since
638 // these signals are not blocked by default.
639 sigemptyset(&unblocked_sigs);
640 sigemptyset(&allowdebug_blocked_sigs);
641 sigaddset(&unblocked_sigs, SIGILL);
642 sigaddset(&unblocked_sigs, SIGSEGV);
643 sigaddset(&unblocked_sigs, SIGBUS);
644 sigaddset(&unblocked_sigs, SIGFPE);
645 sigaddset(&unblocked_sigs, SIGTRAP);
646 sigaddset(&unblocked_sigs, SIGDANGER);
647 sigaddset(&unblocked_sigs, SR_signum);
649 if (!ReduceSignalUsage) {
650 if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
651 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
652 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
653 }
654 if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
655 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
656 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
657 }
658 if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
659 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
660 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
661 }
662 }
663 // Fill in signals that are blocked by all but the VM thread.
664 sigemptyset(&vm_sigs);
665 if (!ReduceSignalUsage)
666 sigaddset(&vm_sigs, BREAK_SIGNAL);
667 debug_only(signal_sets_initialized = true);
668 }
670 // These are signals that are unblocked while a thread is running Java.
671 // (For some reason, they get blocked by default.)
672 sigset_t* os::Aix::unblocked_signals() {
673 assert(signal_sets_initialized, "Not initialized");
674 return &unblocked_sigs;
675 }
677 // These are the signals that are blocked while a (non-VM) thread is
678 // running Java. Only the VM thread handles these signals.
679 sigset_t* os::Aix::vm_signals() {
680 assert(signal_sets_initialized, "Not initialized");
681 return &vm_sigs;
682 }
684 // These are signals that are blocked during cond_wait to allow debugger in
685 sigset_t* os::Aix::allowdebug_blocked_signals() {
686 assert(signal_sets_initialized, "Not initialized");
687 return &allowdebug_blocked_sigs;
688 }
690 void os::Aix::hotspot_sigmask(Thread* thread) {
692 //Save caller's signal mask before setting VM signal mask
693 sigset_t caller_sigmask;
694 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
696 OSThread* osthread = thread->osthread();
697 osthread->set_caller_sigmask(caller_sigmask);
699 pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL);
701 if (!ReduceSignalUsage) {
702 if (thread->is_VM_thread()) {
703 // Only the VM thread handles BREAK_SIGNAL ...
704 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
705 } else {
706 // ... all other threads block BREAK_SIGNAL
707 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
708 }
709 }
710 }
712 // retrieve memory information.
713 // Returns false if something went wrong;
714 // content of pmi undefined in this case.
715 bool os::Aix::get_meminfo(meminfo_t* pmi) {
717 assert(pmi, "get_meminfo: invalid parameter");
719 memset(pmi, 0, sizeof(meminfo_t));
721 if (os::Aix::on_pase()) {
723 Unimplemented();
724 return false;
726 } else {
728 // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics
729 // See:
730 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
731 // ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm
732 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
733 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
735 perfstat_memory_total_t psmt;
736 memset (&psmt, '\0', sizeof(psmt));
737 const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1);
738 if (rc == -1) {
739 fprintf(stderr, "perfstat_memory_total() failed (errno=%d)\n", errno);
740 assert(0, "perfstat_memory_total() failed");
741 return false;
742 }
744 assert(rc == 1, "perfstat_memory_total() - weird return code");
746 // excerpt from
747 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
748 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
749 // The fields of perfstat_memory_total_t:
750 // u_longlong_t virt_total Total virtual memory (in 4 KB pages).
751 // u_longlong_t real_total Total real memory (in 4 KB pages).
752 // u_longlong_t real_free Free real memory (in 4 KB pages).
753 // u_longlong_t pgsp_total Total paging space (in 4 KB pages).
754 // u_longlong_t pgsp_free Free paging space (in 4 KB pages).
756 pmi->virt_total = psmt.virt_total * 4096;
757 pmi->real_total = psmt.real_total * 4096;
758 pmi->real_free = psmt.real_free * 4096;
759 pmi->pgsp_total = psmt.pgsp_total * 4096;
760 pmi->pgsp_free = psmt.pgsp_free * 4096;
762 return true;
764 }
765 } // end os::Aix::get_meminfo
767 // Retrieve global cpu information.
768 // Returns false if something went wrong;
769 // the content of pci is undefined in this case.
770 bool os::Aix::get_cpuinfo(cpuinfo_t* pci) {
771 assert(pci, "get_cpuinfo: invalid parameter");
772 memset(pci, 0, sizeof(cpuinfo_t));
774 perfstat_cpu_total_t psct;
775 memset (&psct, '\0', sizeof(psct));
777 if (-1 == libperfstat::perfstat_cpu_total(NULL, &psct, sizeof(perfstat_cpu_total_t), 1)) {
778 fprintf(stderr, "perfstat_cpu_total() failed (errno=%d)\n", errno);
779 assert(0, "perfstat_cpu_total() failed");
780 return false;
781 }
783 // global cpu information
784 strcpy (pci->description, psct.description);
785 pci->processorHZ = psct.processorHZ;
786 pci->ncpus = psct.ncpus;
787 os::Aix::_logical_cpus = psct.ncpus;
788 for (int i = 0; i < 3; i++) {
789 pci->loadavg[i] = (double) psct.loadavg[i] / (1 << SBITS);
790 }
792 // get the processor version from _system_configuration
793 switch (_system_configuration.version) {
794 case PV_8:
795 strcpy(pci->version, "Power PC 8");
796 break;
797 case PV_7:
798 strcpy(pci->version, "Power PC 7");
799 break;
800 case PV_6_1:
801 strcpy(pci->version, "Power PC 6 DD1.x");
802 break;
803 case PV_6:
804 strcpy(pci->version, "Power PC 6");
805 break;
806 case PV_5:
807 strcpy(pci->version, "Power PC 5");
808 break;
809 case PV_5_2:
810 strcpy(pci->version, "Power PC 5_2");
811 break;
812 case PV_5_3:
813 strcpy(pci->version, "Power PC 5_3");
814 break;
815 case PV_5_Compat:
816 strcpy(pci->version, "PV_5_Compat");
817 break;
818 case PV_6_Compat:
819 strcpy(pci->version, "PV_6_Compat");
820 break;
821 case PV_7_Compat:
822 strcpy(pci->version, "PV_7_Compat");
823 break;
824 case PV_8_Compat:
825 strcpy(pci->version, "PV_8_Compat");
826 break;
827 default:
828 strcpy(pci->version, "unknown");
829 }
831 return true;
833 } //end os::Aix::get_cpuinfo
835 //////////////////////////////////////////////////////////////////////////////
836 // detecting pthread library
838 void os::Aix::libpthread_init() {
839 return;
840 }
842 //////////////////////////////////////////////////////////////////////////////
843 // create new thread
845 // Thread start routine for all newly created threads
846 static void *java_start(Thread *thread) {
848 // find out my own stack dimensions
849 {
850 // actually, this should do exactly the same as thread->record_stack_base_and_size...
851 address base = 0;
852 size_t size = 0;
853 query_stack_dimensions(&base, &size);
854 thread->set_stack_base(base);
855 thread->set_stack_size(size);
856 }
858 // Do some sanity checks.
859 CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
861 // Try to randomize the cache line index of hot stack frames.
862 // This helps when threads of the same stack traces evict each other's
863 // cache lines. The threads can be either from the same JVM instance, or
864 // from different JVM instances. The benefit is especially true for
865 // processors with hyperthreading technology.
867 static int counter = 0;
868 int pid = os::current_process_id();
869 alloca(((pid ^ counter++) & 7) * 128);
871 ThreadLocalStorage::set_thread(thread);
873 OSThread* osthread = thread->osthread();
875 // thread_id is kernel thread id (similar to Solaris LWP id)
876 osthread->set_thread_id(os::Aix::gettid());
878 // initialize signal mask for this thread
879 os::Aix::hotspot_sigmask(thread);
881 // initialize floating point control register
882 os::Aix::init_thread_fpu_state();
884 assert(osthread->get_state() == RUNNABLE, "invalid os thread state");
886 // call one more level start routine
887 thread->run();
889 return 0;
890 }
892 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
894 // We want the whole function to be synchronized.
895 ThreadCritical cs;
897 assert(thread->osthread() == NULL, "caller responsible");
899 // Allocate the OSThread object
900 OSThread* osthread = new OSThread(NULL, NULL);
901 if (osthread == NULL) {
902 return false;
903 }
905 // set the correct thread state
906 osthread->set_thread_type(thr_type);
908 // Initial state is ALLOCATED but not INITIALIZED
909 osthread->set_state(ALLOCATED);
911 thread->set_osthread(osthread);
913 // init thread attributes
914 pthread_attr_t attr;
915 pthread_attr_init(&attr);
916 guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
918 // Make sure we run in 1:1 kernel-user-thread mode.
919 if (os::Aix::on_aix()) {
920 guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
921 guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
922 } // end: aix
924 // Start in suspended state, and in os::thread_start, wake the thread up.
925 guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
927 // calculate stack size if it's not specified by caller
928 if (os::Aix::supports_variable_stack_size()) {
929 if (stack_size == 0) {
930 stack_size = os::Aix::default_stack_size(thr_type);
932 switch (thr_type) {
933 case os::java_thread:
934 // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss.
935 assert(JavaThread::stack_size_at_create() > 0, "this should be set");
936 stack_size = JavaThread::stack_size_at_create();
937 break;
938 case os::compiler_thread:
939 if (CompilerThreadStackSize > 0) {
940 stack_size = (size_t)(CompilerThreadStackSize * K);
941 break;
942 } // else fall through:
943 // use VMThreadStackSize if CompilerThreadStackSize is not defined
944 case os::vm_thread:
945 case os::pgc_thread:
946 case os::cgc_thread:
947 case os::watcher_thread:
948 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
949 break;
950 }
951 }
953 stack_size = MAX2(stack_size, os::Aix::min_stack_allowed);
954 pthread_attr_setstacksize(&attr, stack_size);
955 } //else let thread_create() pick the default value (96 K on AIX)
957 pthread_t tid;
958 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
960 pthread_attr_destroy(&attr);
962 if (ret == 0) {
963 // PPC port traceOsMisc(("Created New Thread : pthread-id %u", tid));
964 } else {
965 if (PrintMiscellaneous && (Verbose || WizardMode)) {
966 perror("pthread_create()");
967 }
968 // Need to clean up stuff we've allocated so far
969 thread->set_osthread(NULL);
970 delete osthread;
971 return false;
972 }
974 // Store pthread info into the OSThread
975 osthread->set_pthread_id(tid);
977 return true;
978 }
980 /////////////////////////////////////////////////////////////////////////////
981 // attach existing thread
983 // bootstrap the main thread
984 bool os::create_main_thread(JavaThread* thread) {
985 assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread");
986 return create_attached_thread(thread);
987 }
989 bool os::create_attached_thread(JavaThread* thread) {
990 #ifdef ASSERT
991 thread->verify_not_published();
992 #endif
994 // Allocate the OSThread object
995 OSThread* osthread = new OSThread(NULL, NULL);
997 if (osthread == NULL) {
998 return false;
999 }
1001 // Store pthread info into the OSThread
1002 osthread->set_thread_id(os::Aix::gettid());
1003 osthread->set_pthread_id(::pthread_self());
1005 // initialize floating point control register
1006 os::Aix::init_thread_fpu_state();
1008 // some sanity checks
1009 CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
1011 // Initial thread state is RUNNABLE
1012 osthread->set_state(RUNNABLE);
1014 thread->set_osthread(osthread);
1016 if (UseNUMA) {
1017 int lgrp_id = os::numa_get_group_id();
1018 if (lgrp_id != -1) {
1019 thread->set_lgrp_id(lgrp_id);
1020 }
1021 }
1023 // initialize signal mask for this thread
1024 // and save the caller's signal mask
1025 os::Aix::hotspot_sigmask(thread);
1027 return true;
1028 }
1030 void os::pd_start_thread(Thread* thread) {
1031 int status = pthread_continue_np(thread->osthread()->pthread_id());
1032 assert(status == 0, "thr_continue failed");
1033 }
1035 // Free OS resources related to the OSThread
1036 void os::free_thread(OSThread* osthread) {
1037 assert(osthread != NULL, "osthread not set");
1039 if (Thread::current()->osthread() == osthread) {
1040 // Restore caller's signal mask
1041 sigset_t sigmask = osthread->caller_sigmask();
1042 pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
1043 }
1045 delete osthread;
1046 }
1048 //////////////////////////////////////////////////////////////////////////////
1049 // thread local storage
1051 int os::allocate_thread_local_storage() {
1052 pthread_key_t key;
1053 int rslt = pthread_key_create(&key, NULL);
1054 assert(rslt == 0, "cannot allocate thread local storage");
1055 return (int)key;
1056 }
1058 // Note: This is currently not used by VM, as we don't destroy TLS key
1059 // on VM exit.
1060 void os::free_thread_local_storage(int index) {
1061 int rslt = pthread_key_delete((pthread_key_t)index);
1062 assert(rslt == 0, "invalid index");
1063 }
1065 void os::thread_local_storage_at_put(int index, void* value) {
1066 int rslt = pthread_setspecific((pthread_key_t)index, value);
1067 assert(rslt == 0, "pthread_setspecific failed");
1068 }
1070 extern "C" Thread* get_thread() {
1071 return ThreadLocalStorage::thread();
1072 }
1074 ////////////////////////////////////////////////////////////////////////////////
1075 // time support
1077 // Time since start-up in seconds to a fine granularity.
1078 // Used by VMSelfDestructTimer and the MemProfiler.
1079 double os::elapsedTime() {
1080 return (double)(os::elapsed_counter()) * 0.000001;
1081 }
1083 jlong os::elapsed_counter() {
1084 timeval time;
1085 int status = gettimeofday(&time, NULL);
1086 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
1087 }
1089 jlong os::elapsed_frequency() {
1090 return (1000 * 1000);
1091 }
1093 // For now, we say that linux does not support vtime. I have no idea
1094 // whether it can actually be made to (DLD, 9/13/05).
1096 bool os::supports_vtime() { return false; }
1097 bool os::enable_vtime() { return false; }
1098 bool os::vtime_enabled() { return false; }
1099 double os::elapsedVTime() {
1100 // better than nothing, but not much
1101 return elapsedTime();
1102 }
1104 jlong os::javaTimeMillis() {
1105 timeval time;
1106 int status = gettimeofday(&time, NULL);
1107 assert(status != -1, "aix error at gettimeofday()");
1108 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
1109 }
1111 // We need to manually declare mread_real_time,
1112 // because IBM didn't provide a prototype in time.h.
1113 // (they probably only ever tested in C, not C++)
1114 extern "C"
1115 int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t);
1117 jlong os::javaTimeNanos() {
1118 if (os::Aix::on_pase()) {
1119 Unimplemented();
1120 return 0;
1121 } else {
1122 // On AIX use the precision of processors real time clock
1123 // or time base registers.
1124 timebasestruct_t time;
1125 int rc;
1127 // If the CPU has a time register, it will be used and
1128 // we have to convert to real time first. After convertion we have following data:
1129 // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970]
1130 // time.tb_low [nanoseconds after the last full second above]
1131 // We better use mread_real_time here instead of read_real_time
1132 // to ensure that we will get a monotonic increasing time.
1133 if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) {
1134 rc = time_base_to_time(&time, TIMEBASE_SZ);
1135 assert(rc != -1, "aix error at time_base_to_time()");
1136 }
1137 return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low);
1138 }
1139 }
1141 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
1142 {
1143 // gettimeofday - based on time in seconds since the Epoch thus does not wrap
1144 info_ptr->max_value = ALL_64_BITS;
1146 // gettimeofday is a real time clock so it skips
1147 info_ptr->may_skip_backward = true;
1148 info_ptr->may_skip_forward = true;
1149 }
1151 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
1152 }
1154 // Return the real, user, and system times in seconds from an
1155 // arbitrary fixed point in the past.
1156 bool os::getTimesSecs(double* process_real_time,
1157 double* process_user_time,
1158 double* process_system_time) {
1159 struct tms ticks;
1160 clock_t real_ticks = times(&ticks);
1162 if (real_ticks == (clock_t) (-1)) {
1163 return false;
1164 } else {
1165 double ticks_per_second = (double) clock_tics_per_sec;
1166 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
1167 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
1168 *process_real_time = ((double) real_ticks) / ticks_per_second;
1170 return true;
1171 }
1172 }
1174 char * os::local_time_string(char *buf, size_t buflen) {
1175 struct tm t;
1176 time_t long_time;
1177 time(&long_time);
1178 localtime_r(&long_time, &t);
1179 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1180 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1181 t.tm_hour, t.tm_min, t.tm_sec);
1182 return buf;
1183 }
1185 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
1186 return localtime_r(clock, res);
1187 }
1189 ////////////////////////////////////////////////////////////////////////////////
1190 // runtime exit support
1192 // Note: os::shutdown() might be called very early during initialization, or
1193 // called from signal handler. Before adding something to os::shutdown(), make
1194 // sure it is async-safe and can handle partially initialized VM.
1195 void os::shutdown() {
1197 // allow PerfMemory to attempt cleanup of any persistent resources
1198 perfMemory_exit();
1200 // needs to remove object in file system
1201 AttachListener::abort();
1203 // flush buffered output, finish log files
1204 ostream_abort();
1206 // Check for abort hook
1207 abort_hook_t abort_hook = Arguments::abort_hook();
1208 if (abort_hook != NULL) {
1209 abort_hook();
1210 }
1211 }
1213 // Note: os::abort() might be called very early during initialization, or
1214 // called from signal handler. Before adding something to os::abort(), make
1215 // sure it is async-safe and can handle partially initialized VM.
1216 void os::abort(bool dump_core) {
1217 os::shutdown();
1218 if (dump_core) {
1219 #ifndef PRODUCT
1220 fdStream out(defaultStream::output_fd());
1221 out.print_raw("Current thread is ");
1222 char buf[16];
1223 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
1224 out.print_raw_cr(buf);
1225 out.print_raw_cr("Dumping core ...");
1226 #endif
1227 ::abort(); // dump core
1228 }
1230 ::exit(1);
1231 }
1233 // Die immediately, no exit hook, no abort hook, no cleanup.
1234 void os::die() {
1235 ::abort();
1236 }
1238 // This method is a copy of JDK's sysGetLastErrorString
1239 // from src/solaris/hpi/src/system_md.c
1241 size_t os::lasterror(char *buf, size_t len) {
1242 if (errno == 0) return 0;
1244 const char *s = ::strerror(errno);
1245 size_t n = ::strlen(s);
1246 if (n >= len) {
1247 n = len - 1;
1248 }
1249 ::strncpy(buf, s, n);
1250 buf[n] = '\0';
1251 return n;
1252 }
1254 intx os::current_thread_id() { return (intx)pthread_self(); }
1256 int os::current_process_id() {
1258 // This implementation returns a unique pid, the pid of the
1259 // launcher thread that starts the vm 'process'.
1261 // Under POSIX, getpid() returns the same pid as the
1262 // launcher thread rather than a unique pid per thread.
1263 // Use gettid() if you want the old pre NPTL behaviour.
1265 // if you are looking for the result of a call to getpid() that
1266 // returns a unique pid for the calling thread, then look at the
1267 // OSThread::thread_id() method in osThread_linux.hpp file
1269 return (int)(_initial_pid ? _initial_pid : getpid());
1270 }
1272 // DLL functions
1274 const char* os::dll_file_extension() { return ".so"; }
1276 // This must be hard coded because it's the system's temporary
1277 // directory not the java application's temp directory, ala java.io.tmpdir.
1278 const char* os::get_temp_directory() { return "/tmp"; }
1280 static bool file_exists(const char* filename) {
1281 struct stat statbuf;
1282 if (filename == NULL || strlen(filename) == 0) {
1283 return false;
1284 }
1285 return os::stat(filename, &statbuf) == 0;
1286 }
1288 bool os::dll_build_name(char* buffer, size_t buflen,
1289 const char* pname, const char* fname) {
1290 bool retval = false;
1291 // Copied from libhpi
1292 const size_t pnamelen = pname ? strlen(pname) : 0;
1294 // Return error on buffer overflow.
1295 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1296 *buffer = '\0';
1297 return retval;
1298 }
1300 if (pnamelen == 0) {
1301 snprintf(buffer, buflen, "lib%s.so", fname);
1302 retval = true;
1303 } else if (strchr(pname, *os::path_separator()) != NULL) {
1304 int n;
1305 char** pelements = split_path(pname, &n);
1306 for (int i = 0; i < n; i++) {
1307 // Really shouldn't be NULL, but check can't hurt
1308 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1309 continue; // skip the empty path values
1310 }
1311 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1312 if (file_exists(buffer)) {
1313 retval = true;
1314 break;
1315 }
1316 }
1317 // release the storage
1318 for (int i = 0; i < n; i++) {
1319 if (pelements[i] != NULL) {
1320 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
1321 }
1322 }
1323 if (pelements != NULL) {
1324 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1325 }
1326 } else {
1327 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1328 retval = true;
1329 }
1330 return retval;
1331 }
1333 // Check if addr is inside libjvm.so.
1334 bool os::address_is_in_vm(address addr) {
1336 // Input could be a real pc or a function pointer literal. The latter
1337 // would be a function descriptor residing in the data segment of a module.
1339 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
1340 if (lib) {
1341 if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
1342 return true;
1343 } else {
1344 return false;
1345 }
1346 } else {
1347 lib = LoadedLibraries::find_for_data_address(addr);
1348 if (lib) {
1349 if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
1350 return true;
1351 } else {
1352 return false;
1353 }
1354 } else {
1355 return false;
1356 }
1357 }
1358 }
1360 // Resolve an AIX function descriptor literal to a code pointer.
1361 // If the input is a valid code pointer to a text segment of a loaded module,
1362 // it is returned unchanged.
1363 // If the input is a valid AIX function descriptor, it is resolved to the
1364 // code entry point.
1365 // If the input is neither a valid function descriptor nor a valid code pointer,
1366 // NULL is returned.
1367 static address resolve_function_descriptor_to_code_pointer(address p) {
1369 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(p);
1370 if (lib) {
1371 // its a real code pointer
1372 return p;
1373 } else {
1374 lib = LoadedLibraries::find_for_data_address(p);
1375 if (lib) {
1376 // pointer to data segment, potential function descriptor
1377 address code_entry = (address)(((FunctionDescriptor*)p)->entry());
1378 if (LoadedLibraries::find_for_text_address(code_entry)) {
1379 // Its a function descriptor
1380 return code_entry;
1381 }
1382 }
1383 }
1384 return NULL;
1385 }
1387 bool os::dll_address_to_function_name(address addr, char *buf,
1388 int buflen, int *offset) {
1389 if (offset) {
1390 *offset = -1;
1391 }
1392 // Buf is not optional, but offset is optional.
1393 assert(buf != NULL, "sanity check");
1394 buf[0] = '\0';
1396 // Resolve function ptr literals first.
1397 addr = resolve_function_descriptor_to_code_pointer(addr);
1398 if (!addr) {
1399 return false;
1400 }
1402 // Go through Decoder::decode to call getFuncName which reads the name from the traceback table.
1403 return Decoder::decode(addr, buf, buflen, offset);
1404 }
1406 static int getModuleName(codeptr_t pc, // [in] program counter
1407 char* p_name, size_t namelen, // [out] optional: function name
1408 char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages
1409 ) {
1411 // initialize output parameters
1412 if (p_name && namelen > 0) {
1413 *p_name = '\0';
1414 }
1415 if (p_errmsg && errmsglen > 0) {
1416 *p_errmsg = '\0';
1417 }
1419 const LoadedLibraryModule* const lib = LoadedLibraries::find_for_text_address((address)pc);
1420 if (lib) {
1421 if (p_name && namelen > 0) {
1422 sprintf(p_name, "%.*s", namelen, lib->get_shortname());
1423 }
1424 return 0;
1425 }
1427 trcVerbose("pc outside any module");
1429 return -1;
1430 }
1432 bool os::dll_address_to_library_name(address addr, char* buf,
1433 int buflen, int* offset) {
1434 if (offset) {
1435 *offset = -1;
1436 }
1437 // Buf is not optional, but offset is optional.
1438 assert(buf != NULL, "sanity check");
1439 buf[0] = '\0';
1441 // Resolve function ptr literals first.
1442 addr = resolve_function_descriptor_to_code_pointer(addr);
1443 if (!addr) {
1444 return false;
1445 }
1447 if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) {
1448 return true;
1449 }
1450 return false;
1451 }
1453 // Loads .dll/.so and in case of error it checks if .dll/.so was built
1454 // for the same architecture as Hotspot is running on.
1455 void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
1457 if (ebuf && ebuflen > 0) {
1458 ebuf[0] = '\0';
1459 ebuf[ebuflen - 1] = '\0';
1460 }
1462 if (!filename || strlen(filename) == 0) {
1463 ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
1464 return NULL;
1465 }
1467 // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
1468 void * result= ::dlopen(filename, RTLD_LAZY);
1469 if (result != NULL) {
1470 // Reload dll cache. Don't do this in signal handling.
1471 LoadedLibraries::reload();
1472 return result;
1473 } else {
1474 // error analysis when dlopen fails
1475 const char* const error_report = ::dlerror();
1476 if (error_report && ebuf && ebuflen > 0) {
1477 snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s",
1478 filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report);
1479 }
1480 }
1481 return NULL;
1482 }
1484 // Glibc-2.0 libdl is not MT safe. If you are building with any glibc,
1485 // chances are you might want to run the generated bits against glibc-2.0
1486 // libdl.so, so always use locking for any version of glibc.
1487 void* os::dll_lookup(void* handle, const char* name) {
1488 pthread_mutex_lock(&dl_mutex);
1489 void* res = dlsym(handle, name);
1490 pthread_mutex_unlock(&dl_mutex);
1491 return res;
1492 }
1494 void* os::get_default_process_handle() {
1495 return (void*)::dlopen(NULL, RTLD_LAZY);
1496 }
1498 void os::print_dll_info(outputStream *st) {
1499 st->print_cr("Dynamic libraries:");
1500 LoadedLibraries::print(st);
1501 }
1503 void os::print_os_info(outputStream* st) {
1504 st->print("OS:");
1506 st->print("uname:");
1507 struct utsname name;
1508 uname(&name);
1509 st->print(name.sysname); st->print(" ");
1510 st->print(name.nodename); st->print(" ");
1511 st->print(name.release); st->print(" ");
1512 st->print(name.version); st->print(" ");
1513 st->print(name.machine);
1514 st->cr();
1516 // rlimit
1517 st->print("rlimit:");
1518 struct rlimit rlim;
1520 st->print(" STACK ");
1521 getrlimit(RLIMIT_STACK, &rlim);
1522 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1523 else st->print("%uk", rlim.rlim_cur >> 10);
1525 st->print(", CORE ");
1526 getrlimit(RLIMIT_CORE, &rlim);
1527 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1528 else st->print("%uk", rlim.rlim_cur >> 10);
1530 st->print(", NPROC ");
1531 st->print("%d", sysconf(_SC_CHILD_MAX));
1533 st->print(", NOFILE ");
1534 getrlimit(RLIMIT_NOFILE, &rlim);
1535 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1536 else st->print("%d", rlim.rlim_cur);
1538 st->print(", AS ");
1539 getrlimit(RLIMIT_AS, &rlim);
1540 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1541 else st->print("%uk", rlim.rlim_cur >> 10);
1543 // Print limits on DATA, because it limits the C-heap.
1544 st->print(", DATA ");
1545 getrlimit(RLIMIT_DATA, &rlim);
1546 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1547 else st->print("%uk", rlim.rlim_cur >> 10);
1548 st->cr();
1550 // load average
1551 st->print("load average:");
1552 double loadavg[3] = {-1.L, -1.L, -1.L};
1553 os::loadavg(loadavg, 3);
1554 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
1555 st->cr();
1556 }
1558 void os::print_memory_info(outputStream* st) {
1560 st->print_cr("Memory:");
1562 st->print_cr(" default page size: %s", describe_pagesize(os::vm_page_size()));
1563 st->print_cr(" default stack page size: %s", describe_pagesize(os::vm_page_size()));
1564 st->print_cr(" default shm page size: %s", describe_pagesize(os::Aix::shm_default_page_size()));
1565 st->print_cr(" can use 64K pages dynamically: %s", (os::Aix::can_use_64K_pages() ? "yes" :"no"));
1566 st->print_cr(" can use 16M pages dynamically: %s", (os::Aix::can_use_16M_pages() ? "yes" :"no"));
1567 if (g_multipage_error != 0) {
1568 st->print_cr(" multipage error: %d", g_multipage_error);
1569 }
1571 // print out LDR_CNTRL because it affects the default page sizes
1572 const char* const ldr_cntrl = ::getenv("LDR_CNTRL");
1573 st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>");
1575 const char* const extshm = ::getenv("EXTSHM");
1576 st->print_cr(" EXTSHM=%s.", extshm ? extshm : "<unset>");
1578 // Call os::Aix::get_meminfo() to retrieve memory statistics.
1579 os::Aix::meminfo_t mi;
1580 if (os::Aix::get_meminfo(&mi)) {
1581 char buffer[256];
1582 if (os::Aix::on_aix()) {
1583 jio_snprintf(buffer, sizeof(buffer),
1584 " physical total : %llu\n"
1585 " physical free : %llu\n"
1586 " swap total : %llu\n"
1587 " swap free : %llu\n",
1588 mi.real_total,
1589 mi.real_free,
1590 mi.pgsp_total,
1591 mi.pgsp_free);
1592 } else {
1593 Unimplemented();
1594 }
1595 st->print_raw(buffer);
1596 } else {
1597 st->print_cr(" (no more information available)");
1598 }
1599 }
1601 void os::pd_print_cpu_info(outputStream* st) {
1602 // cpu
1603 st->print("CPU:");
1604 st->print("total %d", os::processor_count());
1605 // It's not safe to query number of active processors after crash
1606 // st->print("(active %d)", os::active_processor_count());
1607 st->print(" %s", VM_Version::cpu_features());
1608 st->cr();
1609 }
1611 void os::print_siginfo(outputStream* st, void* siginfo) {
1612 // Use common posix version.
1613 os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo);
1614 st->cr();
1615 }
1617 static void print_signal_handler(outputStream* st, int sig,
1618 char* buf, size_t buflen);
1620 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1621 st->print_cr("Signal Handlers:");
1622 print_signal_handler(st, SIGSEGV, buf, buflen);
1623 print_signal_handler(st, SIGBUS , buf, buflen);
1624 print_signal_handler(st, SIGFPE , buf, buflen);
1625 print_signal_handler(st, SIGPIPE, buf, buflen);
1626 print_signal_handler(st, SIGXFSZ, buf, buflen);
1627 print_signal_handler(st, SIGILL , buf, buflen);
1628 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
1629 print_signal_handler(st, SR_signum, buf, buflen);
1630 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
1631 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
1632 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
1633 print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
1634 print_signal_handler(st, SIGTRAP, buf, buflen);
1635 print_signal_handler(st, SIGDANGER, buf, buflen);
1636 }
1638 static char saved_jvm_path[MAXPATHLEN] = {0};
1640 // Find the full path to the current module, libjvm.so.
1641 void os::jvm_path(char *buf, jint buflen) {
1642 // Error checking.
1643 if (buflen < MAXPATHLEN) {
1644 assert(false, "must use a large-enough buffer");
1645 buf[0] = '\0';
1646 return;
1647 }
1648 // Lazy resolve the path to current module.
1649 if (saved_jvm_path[0] != 0) {
1650 strcpy(buf, saved_jvm_path);
1651 return;
1652 }
1654 Dl_info dlinfo;
1655 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
1656 assert(ret != 0, "cannot locate libjvm");
1657 char* rp = realpath((char *)dlinfo.dli_fname, buf);
1658 assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?");
1660 strcpy(saved_jvm_path, buf);
1661 }
1663 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1664 // no prefix required, not even "_"
1665 }
1667 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1668 // no suffix required
1669 }
1671 ////////////////////////////////////////////////////////////////////////////////
1672 // sun.misc.Signal support
1674 static volatile jint sigint_count = 0;
1676 static void
1677 UserHandler(int sig, void *siginfo, void *context) {
1678 // 4511530 - sem_post is serialized and handled by the manager thread. When
1679 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
1680 // don't want to flood the manager thread with sem_post requests.
1681 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
1682 return;
1684 // Ctrl-C is pressed during error reporting, likely because the error
1685 // handler fails to abort. Let VM die immediately.
1686 if (sig == SIGINT && is_error_reported()) {
1687 os::die();
1688 }
1690 os::signal_notify(sig);
1691 }
1693 void* os::user_handler() {
1694 return CAST_FROM_FN_PTR(void*, UserHandler);
1695 }
1697 extern "C" {
1698 typedef void (*sa_handler_t)(int);
1699 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
1700 }
1702 void* os::signal(int signal_number, void* handler) {
1703 struct sigaction sigAct, oldSigAct;
1705 sigfillset(&(sigAct.sa_mask));
1707 // Do not block out synchronous signals in the signal handler.
1708 // Blocking synchronous signals only makes sense if you can really
1709 // be sure that those signals won't happen during signal handling,
1710 // when the blocking applies. Normal signal handlers are lean and
1711 // do not cause signals. But our signal handlers tend to be "risky"
1712 // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen.
1713 // On AIX, PASE there was a case where a SIGSEGV happened, followed
1714 // by a SIGILL, which was blocked due to the signal mask. The process
1715 // just hung forever. Better to crash from a secondary signal than to hang.
1716 sigdelset(&(sigAct.sa_mask), SIGSEGV);
1717 sigdelset(&(sigAct.sa_mask), SIGBUS);
1718 sigdelset(&(sigAct.sa_mask), SIGILL);
1719 sigdelset(&(sigAct.sa_mask), SIGFPE);
1720 sigdelset(&(sigAct.sa_mask), SIGTRAP);
1722 sigAct.sa_flags = SA_RESTART|SA_SIGINFO;
1724 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
1726 if (sigaction(signal_number, &sigAct, &oldSigAct)) {
1727 // -1 means registration failed
1728 return (void *)-1;
1729 }
1731 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
1732 }
1734 void os::signal_raise(int signal_number) {
1735 ::raise(signal_number);
1736 }
1738 //
1739 // The following code is moved from os.cpp for making this
1740 // code platform specific, which it is by its very nature.
1741 //
1743 // Will be modified when max signal is changed to be dynamic
1744 int os::sigexitnum_pd() {
1745 return NSIG;
1746 }
1748 // a counter for each possible signal value
1749 static volatile jint pending_signals[NSIG+1] = { 0 };
1751 // Linux(POSIX) specific hand shaking semaphore.
1752 static sem_t sig_sem;
1754 void os::signal_init_pd() {
1755 // Initialize signal structures
1756 ::memset((void*)pending_signals, 0, sizeof(pending_signals));
1758 // Initialize signal semaphore
1759 int rc = ::sem_init(&sig_sem, 0, 0);
1760 guarantee(rc != -1, "sem_init failed");
1761 }
1763 void os::signal_notify(int sig) {
1764 Atomic::inc(&pending_signals[sig]);
1765 ::sem_post(&sig_sem);
1766 }
1768 static int check_pending_signals(bool wait) {
1769 Atomic::store(0, &sigint_count);
1770 for (;;) {
1771 for (int i = 0; i < NSIG + 1; i++) {
1772 jint n = pending_signals[i];
1773 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1774 return i;
1775 }
1776 }
1777 if (!wait) {
1778 return -1;
1779 }
1780 JavaThread *thread = JavaThread::current();
1781 ThreadBlockInVM tbivm(thread);
1783 bool threadIsSuspended;
1784 do {
1785 thread->set_suspend_equivalent();
1786 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1788 ::sem_wait(&sig_sem);
1790 // were we externally suspended while we were waiting?
1791 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1792 if (threadIsSuspended) {
1793 //
1794 // The semaphore has been incremented, but while we were waiting
1795 // another thread suspended us. We don't want to continue running
1796 // while suspended because that would surprise the thread that
1797 // suspended us.
1798 //
1799 ::sem_post(&sig_sem);
1801 thread->java_suspend_self();
1802 }
1803 } while (threadIsSuspended);
1804 }
1805 }
1807 int os::signal_lookup() {
1808 return check_pending_signals(false);
1809 }
1811 int os::signal_wait() {
1812 return check_pending_signals(true);
1813 }
1815 ////////////////////////////////////////////////////////////////////////////////
1816 // Virtual Memory
1818 // AddrRange describes an immutable address range
1819 //
1820 // This is a helper class for the 'shared memory bookkeeping' below.
1821 class AddrRange {
1822 friend class ShmBkBlock;
1824 char* _start;
1825 size_t _size;
1827 public:
1829 AddrRange(char* start, size_t size)
1830 : _start(start), _size(size)
1831 {}
1833 AddrRange(const AddrRange& r)
1834 : _start(r.start()), _size(r.size())
1835 {}
1837 char* start() const { return _start; }
1838 size_t size() const { return _size; }
1839 char* end() const { return _start + _size; }
1840 bool is_empty() const { return _size == 0 ? true : false; }
1842 static AddrRange empty_range() { return AddrRange(NULL, 0); }
1844 bool contains(const char* p) const {
1845 return start() <= p && end() > p;
1846 }
1848 bool contains(const AddrRange& range) const {
1849 return start() <= range.start() && end() >= range.end();
1850 }
1852 bool intersects(const AddrRange& range) const {
1853 return (range.start() <= start() && range.end() > start()) ||
1854 (range.start() < end() && range.end() >= end()) ||
1855 contains(range);
1856 }
1858 bool is_same_range(const AddrRange& range) const {
1859 return start() == range.start() && size() == range.size();
1860 }
1862 // return the closest inside range consisting of whole pages
1863 AddrRange find_closest_aligned_range(size_t pagesize) const {
1864 if (pagesize == 0 || is_empty()) {
1865 return empty_range();
1866 }
1867 char* const from = (char*)align_size_up((intptr_t)_start, pagesize);
1868 char* const to = (char*)align_size_down((intptr_t)end(), pagesize);
1869 if (from > to) {
1870 return empty_range();
1871 }
1872 return AddrRange(from, to - from);
1873 }
1874 };
1876 ////////////////////////////////////////////////////////////////////////////
1877 // shared memory bookkeeping
1878 //
1879 // the os::reserve_memory() API and friends hand out different kind of memory, depending
1880 // on need and circumstances. Memory may be allocated with mmap() or with shmget/shmat.
1881 //
1882 // But these memory types have to be treated differently. For example, to uncommit
1883 // mmap-based memory, msync(MS_INVALIDATE) is needed, to uncommit shmat-based memory,
1884 // disclaim64() is needed.
1885 //
1886 // Therefore we need to keep track of the allocated memory segments and their
1887 // properties.
1889 // ShmBkBlock: base class for all blocks in the shared memory bookkeeping
1890 class ShmBkBlock {
1892 ShmBkBlock* _next;
1894 protected:
1896 AddrRange _range;
1897 const size_t _pagesize;
1898 const bool _pinned;
1900 public:
1902 ShmBkBlock(AddrRange range, size_t pagesize, bool pinned)
1903 : _range(range), _pagesize(pagesize), _pinned(pinned) , _next(NULL) {
1905 assert(_pagesize == SIZE_4K || _pagesize == SIZE_64K || _pagesize == SIZE_16M, "invalid page size");
1906 assert(!_range.is_empty(), "invalid range");
1907 }
1909 virtual void print(outputStream* st) const {
1910 st->print("0x%p ... 0x%p (%llu) - %d %s pages - %s",
1911 _range.start(), _range.end(), _range.size(),
1912 _range.size() / _pagesize, describe_pagesize(_pagesize),
1913 _pinned ? "pinned" : "");
1914 }
1916 enum Type { MMAP, SHMAT };
1917 virtual Type getType() = 0;
1919 char* base() const { return _range.start(); }
1920 size_t size() const { return _range.size(); }
1922 void setAddrRange(AddrRange range) {
1923 _range = range;
1924 }
1926 bool containsAddress(const char* p) const {
1927 return _range.contains(p);
1928 }
1930 bool containsRange(const char* p, size_t size) const {
1931 return _range.contains(AddrRange((char*)p, size));
1932 }
1934 bool isSameRange(const char* p, size_t size) const {
1935 return _range.is_same_range(AddrRange((char*)p, size));
1936 }
1938 virtual bool disclaim(char* p, size_t size) = 0;
1939 virtual bool release() = 0;
1941 // blocks live in a list.
1942 ShmBkBlock* next() const { return _next; }
1943 void set_next(ShmBkBlock* blk) { _next = blk; }
1945 }; // end: ShmBkBlock
1948 // ShmBkMappedBlock: describes an block allocated with mmap()
1949 class ShmBkMappedBlock : public ShmBkBlock {
1950 public:
1952 ShmBkMappedBlock(AddrRange range)
1953 : ShmBkBlock(range, SIZE_4K, false) {} // mmap: always 4K, never pinned
1955 void print(outputStream* st) const {
1956 ShmBkBlock::print(st);
1957 st->print_cr(" - mmap'ed");
1958 }
1960 Type getType() {
1961 return MMAP;
1962 }
1964 bool disclaim(char* p, size_t size) {
1966 AddrRange r(p, size);
1968 guarantee(_range.contains(r), "invalid disclaim");
1970 // only disclaim whole ranges.
1971 const AddrRange r2 = r.find_closest_aligned_range(_pagesize);
1972 if (r2.is_empty()) {
1973 return true;
1974 }
1976 const int rc = ::msync(r2.start(), r2.size(), MS_INVALIDATE);
1978 if (rc != 0) {
1979 warning("msync(0x%p, %llu, MS_INVALIDATE) failed (%d)\n", r2.start(), r2.size(), errno);
1980 }
1982 return rc == 0 ? true : false;
1983 }
1985 bool release() {
1986 // mmap'ed blocks are released using munmap
1987 if (::munmap(_range.start(), _range.size()) != 0) {
1988 warning("munmap(0x%p, %llu) failed (%d)\n", _range.start(), _range.size(), errno);
1989 return false;
1990 }
1991 return true;
1992 }
1993 }; // end: ShmBkMappedBlock
1995 // ShmBkShmatedBlock: describes an block allocated with shmget/shmat()
1996 class ShmBkShmatedBlock : public ShmBkBlock {
1997 public:
1999 ShmBkShmatedBlock(AddrRange range, size_t pagesize, bool pinned)
2000 : ShmBkBlock(range, pagesize, pinned) {}
2002 void print(outputStream* st) const {
2003 ShmBkBlock::print(st);
2004 st->print_cr(" - shmat'ed");
2005 }
2007 Type getType() {
2008 return SHMAT;
2009 }
2011 bool disclaim(char* p, size_t size) {
2013 AddrRange r(p, size);
2015 if (_pinned) {
2016 return true;
2017 }
2019 // shmat'ed blocks are disclaimed using disclaim64
2020 guarantee(_range.contains(r), "invalid disclaim");
2022 // only disclaim whole ranges.
2023 const AddrRange r2 = r.find_closest_aligned_range(_pagesize);
2024 if (r2.is_empty()) {
2025 return true;
2026 }
2028 const bool rc = my_disclaim64(r2.start(), r2.size());
2030 if (Verbose && !rc) {
2031 warning("failed to disclaim shm %p-%p\n", r2.start(), r2.end());
2032 }
2034 return rc;
2035 }
2037 bool release() {
2038 bool rc = false;
2039 if (::shmdt(_range.start()) != 0) {
2040 warning("shmdt(0x%p) failed (%d)\n", _range.start(), errno);
2041 } else {
2042 rc = true;
2043 }
2044 return rc;
2045 }
2047 }; // end: ShmBkShmatedBlock
2049 static ShmBkBlock* g_shmbk_list = NULL;
2050 static volatile jint g_shmbk_table_lock = 0;
2052 // keep some usage statistics
2053 static struct {
2054 int nodes; // number of nodes in list
2055 size_t bytes; // reserved - not committed - bytes.
2056 int reserves; // how often reserve was called
2057 int lookups; // how often a lookup was made
2058 } g_shmbk_stats = { 0, 0, 0, 0 };
2060 // add information about a shared memory segment to the bookkeeping
2061 static void shmbk_register(ShmBkBlock* p_block) {
2062 guarantee(p_block, "logic error");
2063 p_block->set_next(g_shmbk_list);
2064 g_shmbk_list = p_block;
2065 g_shmbk_stats.reserves ++;
2066 g_shmbk_stats.bytes += p_block->size();
2067 g_shmbk_stats.nodes ++;
2068 }
2070 // remove information about a shared memory segment by its starting address
2071 static void shmbk_unregister(ShmBkBlock* p_block) {
2072 ShmBkBlock* p = g_shmbk_list;
2073 ShmBkBlock* prev = NULL;
2074 while (p) {
2075 if (p == p_block) {
2076 if (prev) {
2077 prev->set_next(p->next());
2078 } else {
2079 g_shmbk_list = p->next();
2080 }
2081 g_shmbk_stats.nodes --;
2082 g_shmbk_stats.bytes -= p->size();
2083 return;
2084 }
2085 prev = p;
2086 p = p->next();
2087 }
2088 assert(false, "should not happen");
2089 }
2091 // given a pointer, return shared memory bookkeeping record for the segment it points into
2092 // using the returned block info must happen under lock protection
2093 static ShmBkBlock* shmbk_find_by_containing_address(const char* addr) {
2094 g_shmbk_stats.lookups ++;
2095 ShmBkBlock* p = g_shmbk_list;
2096 while (p) {
2097 if (p->containsAddress(addr)) {
2098 return p;
2099 }
2100 p = p->next();
2101 }
2102 return NULL;
2103 }
2105 // dump all information about all memory segments allocated with os::reserve_memory()
2106 void shmbk_dump_info() {
2107 tty->print_cr("-- shared mem bookkeeping (alive: %d segments, %llu bytes, "
2108 "total reserves: %d total lookups: %d)",
2109 g_shmbk_stats.nodes, g_shmbk_stats.bytes, g_shmbk_stats.reserves, g_shmbk_stats.lookups);
2110 const ShmBkBlock* p = g_shmbk_list;
2111 int i = 0;
2112 while (p) {
2113 p->print(tty);
2114 p = p->next();
2115 i ++;
2116 }
2117 }
2119 #define LOCK_SHMBK { ThreadCritical _LOCK_SHMBK;
2120 #define UNLOCK_SHMBK }
2122 // End: shared memory bookkeeping
2123 ////////////////////////////////////////////////////////////////////////////////////////////////////
2125 int os::vm_page_size() {
2126 // Seems redundant as all get out
2127 assert(os::Aix::page_size() != -1, "must call os::init");
2128 return os::Aix::page_size();
2129 }
2131 // Aix allocates memory by pages.
2132 int os::vm_allocation_granularity() {
2133 assert(os::Aix::page_size() != -1, "must call os::init");
2134 return os::Aix::page_size();
2135 }
2137 int os::Aix::commit_memory_impl(char* addr, size_t size, bool exec) {
2139 // Commit is a noop. There is no explicit commit
2140 // needed on AIX. Memory is committed when touched.
2141 //
2142 // Debug : check address range for validity
2143 #ifdef ASSERT
2144 LOCK_SHMBK
2145 ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
2146 if (!block) {
2147 fprintf(stderr, "invalid pointer: " INTPTR_FORMAT "\n", addr);
2148 shmbk_dump_info();
2149 assert(false, "invalid pointer");
2150 return false;
2151 } else if (!block->containsRange(addr, size)) {
2152 fprintf(stderr, "invalid range: " INTPTR_FORMAT " .. " INTPTR_FORMAT "\n", addr, addr + size);
2153 shmbk_dump_info();
2154 assert(false, "invalid range");
2155 return false;
2156 }
2157 UNLOCK_SHMBK
2158 #endif // ASSERT
2160 return 0;
2161 }
2163 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2164 return os::Aix::commit_memory_impl(addr, size, exec) == 0;
2165 }
2167 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2168 const char* mesg) {
2169 assert(mesg != NULL, "mesg must be specified");
2170 os::Aix::commit_memory_impl(addr, size, exec);
2171 }
2173 int os::Aix::commit_memory_impl(char* addr, size_t size,
2174 size_t alignment_hint, bool exec) {
2175 return os::Aix::commit_memory_impl(addr, size, exec);
2176 }
2178 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
2179 bool exec) {
2180 return os::Aix::commit_memory_impl(addr, size, alignment_hint, exec) == 0;
2181 }
2183 void os::pd_commit_memory_or_exit(char* addr, size_t size,
2184 size_t alignment_hint, bool exec,
2185 const char* mesg) {
2186 os::Aix::commit_memory_impl(addr, size, alignment_hint, exec);
2187 }
2189 bool os::pd_uncommit_memory(char* addr, size_t size) {
2191 // Delegate to ShmBkBlock class which knows how to uncommit its memory.
2193 bool rc = false;
2194 LOCK_SHMBK
2195 ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
2196 if (!block) {
2197 fprintf(stderr, "invalid pointer: 0x%p.\n", addr);
2198 shmbk_dump_info();
2199 assert(false, "invalid pointer");
2200 return false;
2201 } else if (!block->containsRange(addr, size)) {
2202 fprintf(stderr, "invalid range: 0x%p .. 0x%p.\n", addr, addr + size);
2203 shmbk_dump_info();
2204 assert(false, "invalid range");
2205 return false;
2206 }
2207 rc = block->disclaim(addr, size);
2208 UNLOCK_SHMBK
2210 if (Verbose && !rc) {
2211 warning("failed to disclaim 0x%p .. 0x%p (0x%llX bytes).", addr, addr + size, size);
2212 }
2213 return rc;
2214 }
2216 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
2217 return os::guard_memory(addr, size);
2218 }
2220 bool os::remove_stack_guard_pages(char* addr, size_t size) {
2221 return os::unguard_memory(addr, size);
2222 }
2224 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2225 }
2227 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
2228 }
2230 void os::numa_make_global(char *addr, size_t bytes) {
2231 }
2233 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2234 }
2236 bool os::numa_topology_changed() {
2237 return false;
2238 }
2240 size_t os::numa_get_groups_num() {
2241 return 1;
2242 }
2244 int os::numa_get_group_id() {
2245 return 0;
2246 }
2248 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2249 if (size > 0) {
2250 ids[0] = 0;
2251 return 1;
2252 }
2253 return 0;
2254 }
2256 bool os::get_page_info(char *start, page_info* info) {
2257 return false;
2258 }
2260 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2261 return end;
2262 }
2264 // Flags for reserve_shmatted_memory:
2265 #define RESSHM_WISHADDR_OR_FAIL 1
2266 #define RESSHM_TRY_16M_PAGES 2
2267 #define RESSHM_16M_PAGES_OR_FAIL 4
2269 // Result of reserve_shmatted_memory:
2270 struct shmatted_memory_info_t {
2271 char* addr;
2272 size_t pagesize;
2273 bool pinned;
2274 };
2276 // Reserve a section of shmatted memory.
2277 // params:
2278 // bytes [in]: size of memory, in bytes
2279 // requested_addr [in]: wish address.
2280 // NULL = no wish.
2281 // If RESSHM_WISHADDR_OR_FAIL is set in flags and wish address cannot
2282 // be obtained, function will fail. Otherwise wish address is treated as hint and
2283 // another pointer is returned.
2284 // flags [in]: some flags. Valid flags are:
2285 // RESSHM_WISHADDR_OR_FAIL - fail if wish address is given and cannot be obtained.
2286 // RESSHM_TRY_16M_PAGES - try to allocate from 16M page pool
2287 // (requires UseLargePages and Use16MPages)
2288 // RESSHM_16M_PAGES_OR_FAIL - if you cannot allocate from 16M page pool, fail.
2289 // Otherwise any other page size will do.
2290 // p_info [out] : holds information about the created shared memory segment.
2291 static bool reserve_shmatted_memory(size_t bytes, char* requested_addr, int flags, shmatted_memory_info_t* p_info) {
2293 assert(p_info, "parameter error");
2295 // init output struct.
2296 p_info->addr = NULL;
2298 // neither should we be here for EXTSHM=ON.
2299 if (os::Aix::extshm()) {
2300 ShouldNotReachHere();
2301 }
2303 // extract flags. sanity checks.
2304 const bool wishaddr_or_fail =
2305 flags & RESSHM_WISHADDR_OR_FAIL;
2306 const bool try_16M_pages =
2307 flags & RESSHM_TRY_16M_PAGES;
2308 const bool f16M_pages_or_fail =
2309 flags & RESSHM_16M_PAGES_OR_FAIL;
2311 // first check: if a wish address is given and it is mandatory, but not aligned to segment boundary,
2312 // shmat will fail anyway, so save some cycles by failing right away
2313 if (requested_addr && ((uintptr_t)requested_addr % SIZE_256M == 0)) {
2314 if (wishaddr_or_fail) {
2315 return false;
2316 } else {
2317 requested_addr = NULL;
2318 }
2319 }
2321 char* addr = NULL;
2323 // Align size of shm up to the largest possible page size, to avoid errors later on when we try to change
2324 // pagesize dynamically.
2325 const size_t size = align_size_up(bytes, SIZE_16M);
2327 // reserve the shared segment
2328 int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
2329 if (shmid == -1) {
2330 warning("shmget(.., %lld, ..) failed (errno: %d).", size, errno);
2331 return false;
2332 }
2334 // Important note:
2335 // It is very important that we, upon leaving this function, do not leave a shm segment alive.
2336 // We must right after attaching it remove it from the system. System V shm segments are global and
2337 // survive the process.
2338 // So, from here on: Do not assert. Do not return. Always do a "goto cleanup_shm".
2340 // try forcing the page size
2341 size_t pagesize = -1; // unknown so far
2343 if (UseLargePages) {
2345 struct shmid_ds shmbuf;
2346 memset(&shmbuf, 0, sizeof(shmbuf));
2348 // First, try to take from 16M page pool if...
2349 if (os::Aix::can_use_16M_pages() // we can ...
2350 && Use16MPages // we are not explicitly forbidden to do so (-XX:-Use16MPages)..
2351 && try_16M_pages) { // caller wants us to.
2352 shmbuf.shm_pagesize = SIZE_16M;
2353 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) {
2354 pagesize = SIZE_16M;
2355 } else {
2356 warning("Failed to allocate %d 16M pages. 16M page pool might be exhausted. (shmctl failed with %d)",
2357 size / SIZE_16M, errno);
2358 if (f16M_pages_or_fail) {
2359 goto cleanup_shm;
2360 }
2361 }
2362 }
2364 // Nothing yet? Try setting 64K pages. Note that I never saw this fail, but in theory it might,
2365 // because the 64K page pool may also be exhausted.
2366 if (pagesize == -1) {
2367 shmbuf.shm_pagesize = SIZE_64K;
2368 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) {
2369 pagesize = SIZE_64K;
2370 } else {
2371 warning("Failed to allocate %d 64K pages. (shmctl failed with %d)",
2372 size / SIZE_64K, errno);
2373 // here I give up. leave page_size -1 - later, after attaching, we will query the
2374 // real page size of the attached memory. (in theory, it may be something different
2375 // from 4K if LDR_CNTRL SHM_PSIZE is set)
2376 }
2377 }
2378 }
2380 // sanity point
2381 assert(pagesize == -1 || pagesize == SIZE_16M || pagesize == SIZE_64K, "wrong page size");
2383 // Now attach the shared segment.
2384 addr = (char*) shmat(shmid, requested_addr, 0);
2385 if (addr == (char*)-1) {
2386 // How to handle attach failure:
2387 // If it failed for a specific wish address, tolerate this: in that case, if wish address was
2388 // mandatory, fail, if not, retry anywhere.
2389 // If it failed for any other reason, treat that as fatal error.
2390 addr = NULL;
2391 if (requested_addr) {
2392 if (wishaddr_or_fail) {
2393 goto cleanup_shm;
2394 } else {
2395 addr = (char*) shmat(shmid, NULL, 0);
2396 if (addr == (char*)-1) { // fatal
2397 addr = NULL;
2398 warning("shmat failed (errno: %d)", errno);
2399 goto cleanup_shm;
2400 }
2401 }
2402 } else { // fatal
2403 addr = NULL;
2404 warning("shmat failed (errno: %d)", errno);
2405 goto cleanup_shm;
2406 }
2407 }
2409 // sanity point
2410 assert(addr && addr != (char*) -1, "wrong address");
2412 // after successful Attach remove the segment - right away.
2413 if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
2414 warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
2415 guarantee(false, "failed to remove shared memory segment!");
2416 }
2417 shmid = -1;
2419 // query the real page size. In case setting the page size did not work (see above), the system
2420 // may have given us something other then 4K (LDR_CNTRL)
2421 {
2422 const size_t real_pagesize = os::Aix::query_pagesize(addr);
2423 if (pagesize != -1) {
2424 assert(pagesize == real_pagesize, "unexpected pagesize after shmat");
2425 } else {
2426 pagesize = real_pagesize;
2427 }
2428 }
2430 // Now register the reserved block with internal book keeping.
2431 LOCK_SHMBK
2432 const bool pinned = pagesize >= SIZE_16M ? true : false;
2433 ShmBkShmatedBlock* const p_block = new ShmBkShmatedBlock(AddrRange(addr, size), pagesize, pinned);
2434 assert(p_block, "");
2435 shmbk_register(p_block);
2436 UNLOCK_SHMBK
2438 cleanup_shm:
2440 // if we have not done so yet, remove the shared memory segment. This is very important.
2441 if (shmid != -1) {
2442 if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
2443 warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
2444 guarantee(false, "failed to remove shared memory segment!");
2445 }
2446 shmid = -1;
2447 }
2449 // trace
2450 if (Verbose && !addr) {
2451 if (requested_addr != NULL) {
2452 warning("failed to shm-allocate 0x%llX bytes at wish address 0x%p.", size, requested_addr);
2453 } else {
2454 warning("failed to shm-allocate 0x%llX bytes at any address.", size);
2455 }
2456 }
2458 // hand info to caller
2459 if (addr) {
2460 p_info->addr = addr;
2461 p_info->pagesize = pagesize;
2462 p_info->pinned = pagesize == SIZE_16M ? true : false;
2463 }
2465 // sanity test:
2466 if (requested_addr && addr && wishaddr_or_fail) {
2467 guarantee(addr == requested_addr, "shmat error");
2468 }
2470 // just one more test to really make sure we have no dangling shm segments.
2471 guarantee(shmid == -1, "dangling shm segments");
2473 return addr ? true : false;
2475 } // end: reserve_shmatted_memory
2477 // Reserve memory using mmap. Behaves the same as reserve_shmatted_memory():
2478 // will return NULL in case of an error.
2479 static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
2481 // if a wish address is given, but not aligned to 4K page boundary, mmap will fail.
2482 if (requested_addr && ((uintptr_t)requested_addr % os::vm_page_size() != 0)) {
2483 warning("Wish address 0x%p not aligned to page boundary.", requested_addr);
2484 return NULL;
2485 }
2487 const size_t size = align_size_up(bytes, SIZE_4K);
2489 // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to
2490 // msync(MS_INVALIDATE) (see os::uncommit_memory)
2491 int flags = MAP_ANONYMOUS | MAP_SHARED;
2493 // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
2494 // it means if wishaddress is given but MAP_FIXED is not set.
2495 //
2496 // Note however that this changes semantics in SPEC1170 mode insofar as MAP_FIXED
2497 // clobbers the address range, which is probably not what the caller wants. That's
2498 // why I assert here (again) that the SPEC1170 compat mode is off.
2499 // If we want to be able to run under SPEC1170, we have to do some porting and
2500 // testing.
2501 if (requested_addr != NULL) {
2502 assert(!os::Aix::xpg_sus_mode(), "SPEC1170 mode not allowed.");
2503 flags |= MAP_FIXED;
2504 }
2506 char* addr = (char*)::mmap(requested_addr, size, PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
2508 if (addr == MAP_FAILED) {
2509 // attach failed: tolerate for specific wish addresses. Not being able to attach
2510 // anywhere is a fatal error.
2511 if (requested_addr == NULL) {
2512 // It's ok to fail here if the machine has not enough memory.
2513 warning("mmap(NULL, 0x%llX, ..) failed (%d)", size, errno);
2514 }
2515 addr = NULL;
2516 goto cleanup_mmap;
2517 }
2519 // If we did request a specific address and that address was not available, fail.
2520 if (addr && requested_addr) {
2521 guarantee(addr == requested_addr, "unexpected");
2522 }
2524 // register this mmap'ed segment with book keeping
2525 LOCK_SHMBK
2526 ShmBkMappedBlock* const p_block = new ShmBkMappedBlock(AddrRange(addr, size));
2527 assert(p_block, "");
2528 shmbk_register(p_block);
2529 UNLOCK_SHMBK
2531 cleanup_mmap:
2533 // trace
2534 if (Verbose) {
2535 if (addr) {
2536 fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes);
2537 }
2538 else {
2539 if (requested_addr != NULL) {
2540 warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr);
2541 } else {
2542 warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes);
2543 }
2544 }
2545 }
2547 return addr;
2549 } // end: reserve_mmaped_memory
2551 // Reserves and attaches a shared memory segment.
2552 // Will assert if a wish address is given and could not be obtained.
2553 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2554 return os::attempt_reserve_memory_at(bytes, requested_addr);
2555 }
2557 bool os::pd_release_memory(char* addr, size_t size) {
2559 // delegate to ShmBkBlock class which knows how to uncommit its memory.
2561 bool rc = false;
2562 LOCK_SHMBK
2563 ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
2564 if (!block) {
2565 fprintf(stderr, "invalid pointer: 0x%p.\n", addr);
2566 shmbk_dump_info();
2567 assert(false, "invalid pointer");
2568 return false;
2569 }
2570 else if (!block->isSameRange(addr, size)) {
2571 if (block->getType() == ShmBkBlock::MMAP) {
2572 // Release only the same range or a the beginning or the end of a range.
2573 if (block->base() == addr && size < block->size()) {
2574 ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base() + size, block->size() - size));
2575 assert(b, "");
2576 shmbk_register(b);
2577 block->setAddrRange(AddrRange(addr, size));
2578 }
2579 else if (addr > block->base() && addr + size == block->base() + block->size()) {
2580 ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base(), block->size() - size));
2581 assert(b, "");
2582 shmbk_register(b);
2583 block->setAddrRange(AddrRange(addr, size));
2584 }
2585 else {
2586 fprintf(stderr, "invalid mmap range: 0x%p .. 0x%p.\n", addr, addr + size);
2587 shmbk_dump_info();
2588 assert(false, "invalid mmap range");
2589 return false;
2590 }
2591 }
2592 else {
2593 // Release only the same range. No partial release allowed.
2594 // Soften the requirement a bit, because the user may think he owns a smaller size
2595 // than the block is due to alignment etc.
2596 if (block->base() != addr || block->size() < size) {
2597 fprintf(stderr, "invalid shmget range: 0x%p .. 0x%p.\n", addr, addr + size);
2598 shmbk_dump_info();
2599 assert(false, "invalid shmget range");
2600 return false;
2601 }
2602 }
2603 }
2604 rc = block->release();
2605 assert(rc, "release failed");
2606 // remove block from bookkeeping
2607 shmbk_unregister(block);
2608 delete block;
2609 UNLOCK_SHMBK
2611 if (!rc) {
2612 warning("failed to released %lu bytes at 0x%p", size, addr);
2613 }
2615 return rc;
2616 }
2618 static bool checked_mprotect(char* addr, size_t size, int prot) {
2620 // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will
2621 // not tell me if protection failed when trying to protect an un-protectable range.
2622 //
2623 // This means if the memory was allocated using shmget/shmat, protection wont work
2624 // but mprotect will still return 0:
2625 //
2626 // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm
2628 bool rc = ::mprotect(addr, size, prot) == 0 ? true : false;
2630 if (!rc) {
2631 const char* const s_errno = strerror(errno);
2632 warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno);
2633 return false;
2634 }
2636 // mprotect success check
2637 //
2638 // Mprotect said it changed the protection but can I believe it?
2639 //
2640 // To be sure I need to check the protection afterwards. Try to
2641 // read from protected memory and check whether that causes a segfault.
2642 //
2643 if (!os::Aix::xpg_sus_mode()) {
2645 if (StubRoutines::SafeFetch32_stub()) {
2647 const bool read_protected =
2648 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
2649 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
2651 if (prot & PROT_READ) {
2652 rc = !read_protected;
2653 } else {
2654 rc = read_protected;
2655 }
2656 }
2657 }
2658 if (!rc) {
2659 assert(false, "mprotect failed.");
2660 }
2661 return rc;
2662 }
2664 // Set protections specified
2665 bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) {
2666 unsigned int p = 0;
2667 switch (prot) {
2668 case MEM_PROT_NONE: p = PROT_NONE; break;
2669 case MEM_PROT_READ: p = PROT_READ; break;
2670 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
2671 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
2672 default:
2673 ShouldNotReachHere();
2674 }
2675 // is_committed is unused.
2676 return checked_mprotect(addr, size, p);
2677 }
2679 bool os::guard_memory(char* addr, size_t size) {
2680 return checked_mprotect(addr, size, PROT_NONE);
2681 }
2683 bool os::unguard_memory(char* addr, size_t size) {
2684 return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
2685 }
2687 // Large page support
2689 static size_t _large_page_size = 0;
2691 // Enable large page support if OS allows that.
2692 void os::large_page_init() {
2694 // Note: os::Aix::query_multipage_support must run first.
2696 if (!UseLargePages) {
2697 return;
2698 }
2700 if (!Aix::can_use_64K_pages()) {
2701 assert(!Aix::can_use_16M_pages(), "64K is a precondition for 16M.");
2702 UseLargePages = false;
2703 return;
2704 }
2706 if (!Aix::can_use_16M_pages() && Use16MPages) {
2707 fprintf(stderr, "Cannot use 16M pages. Please ensure that there is a 16M page pool "
2708 " and that the VM runs with CAP_BYPASS_RAC_VMM and CAP_PROPAGATE capabilities.\n");
2709 }
2711 // Do not report 16M page alignment as part of os::_page_sizes if we are
2712 // explicitly forbidden from using 16M pages. Doing so would increase the
2713 // alignment the garbage collector calculates with, slightly increasing
2714 // heap usage. We should only pay for 16M alignment if we really want to
2715 // use 16M pages.
2716 if (Use16MPages && Aix::can_use_16M_pages()) {
2717 _large_page_size = SIZE_16M;
2718 _page_sizes[0] = SIZE_16M;
2719 _page_sizes[1] = SIZE_64K;
2720 _page_sizes[2] = SIZE_4K;
2721 _page_sizes[3] = 0;
2722 } else if (Aix::can_use_64K_pages()) {
2723 _large_page_size = SIZE_64K;
2724 _page_sizes[0] = SIZE_64K;
2725 _page_sizes[1] = SIZE_4K;
2726 _page_sizes[2] = 0;
2727 }
2729 if (Verbose) {
2730 ("Default large page size is 0x%llX.", _large_page_size);
2731 }
2732 } // end: os::large_page_init()
2734 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
2735 // "exec" is passed in but not used. Creating the shared image for
2736 // the code cache doesn't have an SHM_X executable permission to check.
2737 Unimplemented();
2738 return 0;
2739 }
2741 bool os::release_memory_special(char* base, size_t bytes) {
2742 // detaching the SHM segment will also delete it, see reserve_memory_special()
2743 Unimplemented();
2744 return false;
2745 }
2747 size_t os::large_page_size() {
2748 return _large_page_size;
2749 }
2751 bool os::can_commit_large_page_memory() {
2752 // Well, sadly we cannot commit anything at all (see comment in
2753 // os::commit_memory) but we claim to so we can make use of large pages
2754 return true;
2755 }
2757 bool os::can_execute_large_page_memory() {
2758 // We can do that
2759 return true;
2760 }
2762 // Reserve memory at an arbitrary address, only if that area is
2763 // available (and not reserved for something else).
2764 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2766 bool use_mmap = false;
2768 // mmap: smaller graining, no large page support
2769 // shm: large graining (256M), large page support, limited number of shm segments
2770 //
2771 // Prefer mmap wherever we either do not need large page support or have OS limits
2773 if (!UseLargePages || bytes < SIZE_16M) {
2774 use_mmap = true;
2775 }
2777 char* addr = NULL;
2778 if (use_mmap) {
2779 addr = reserve_mmaped_memory(bytes, requested_addr);
2780 } else {
2781 // shmat: wish address is mandatory, and do not try 16M pages here.
2782 shmatted_memory_info_t info;
2783 const int flags = RESSHM_WISHADDR_OR_FAIL;
2784 if (reserve_shmatted_memory(bytes, requested_addr, flags, &info)) {
2785 addr = info.addr;
2786 }
2787 }
2789 return addr;
2790 }
2792 size_t os::read(int fd, void *buf, unsigned int nBytes) {
2793 return ::read(fd, buf, nBytes);
2794 }
2796 #define NANOSECS_PER_MILLISEC 1000000
2798 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
2799 assert(thread == Thread::current(), "thread consistency check");
2801 // Prevent nasty overflow in deadline calculation
2802 // by handling long sleeps similar to solaris or windows.
2803 const jlong limit = INT_MAX;
2804 int result;
2805 while (millis > limit) {
2806 if ((result = os::sleep(thread, limit, interruptible)) != OS_OK) {
2807 return result;
2808 }
2809 millis -= limit;
2810 }
2812 ParkEvent * const slp = thread->_SleepEvent;
2813 slp->reset();
2814 OrderAccess::fence();
2816 if (interruptible) {
2817 jlong prevtime = javaTimeNanos();
2819 // Prevent precision loss and too long sleeps
2820 jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC;
2822 for (;;) {
2823 if (os::is_interrupted(thread, true)) {
2824 return OS_INTRPT;
2825 }
2827 jlong newtime = javaTimeNanos();
2829 assert(newtime >= prevtime, "time moving backwards");
2830 // Doing prevtime and newtime in microseconds doesn't help precision,
2831 // and trying to round up to avoid lost milliseconds can result in a
2832 // too-short delay.
2833 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
2835 if (millis <= 0) {
2836 return OS_OK;
2837 }
2839 // Stop sleeping if we passed the deadline
2840 if (newtime >= deadline) {
2841 return OS_OK;
2842 }
2844 prevtime = newtime;
2846 {
2847 assert(thread->is_Java_thread(), "sanity check");
2848 JavaThread *jt = (JavaThread *) thread;
2849 ThreadBlockInVM tbivm(jt);
2850 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
2852 jt->set_suspend_equivalent();
2854 slp->park(millis);
2856 // were we externally suspended while we were waiting?
2857 jt->check_and_wait_while_suspended();
2858 }
2859 }
2860 } else {
2861 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
2862 jlong prevtime = javaTimeNanos();
2864 // Prevent precision loss and too long sleeps
2865 jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC;
2867 for (;;) {
2868 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
2869 // the 1st iteration ...
2870 jlong newtime = javaTimeNanos();
2872 if (newtime - prevtime < 0) {
2873 // time moving backwards, should only happen if no monotonic clock
2874 // not a guarantee() because JVM should not abort on kernel/glibc bugs
2875 // - HS14 Commented out as not implemented.
2876 // - TODO Maybe we should implement it?
2877 //assert(!Aix::supports_monotonic_clock(), "time moving backwards");
2878 } else {
2879 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
2880 }
2882 if (millis <= 0) break;
2884 if (newtime >= deadline) {
2885 break;
2886 }
2888 prevtime = newtime;
2889 slp->park(millis);
2890 }
2891 return OS_OK;
2892 }
2893 }
2895 void os::naked_short_sleep(jlong ms) {
2896 struct timespec req;
2898 assert(ms < 1000, "Un-interruptable sleep, short time use only");
2899 req.tv_sec = 0;
2900 if (ms > 0) {
2901 req.tv_nsec = (ms % 1000) * 1000000;
2902 }
2903 else {
2904 req.tv_nsec = 1;
2905 }
2907 nanosleep(&req, NULL);
2909 return;
2910 }
2912 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
2913 void os::infinite_sleep() {
2914 while (true) { // sleep forever ...
2915 ::sleep(100); // ... 100 seconds at a time
2916 }
2917 }
2919 // Used to convert frequent JVM_Yield() to nops
2920 bool os::dont_yield() {
2921 return DontYieldALot;
2922 }
2924 void os::yield() {
2925 sched_yield();
2926 }
2928 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; }
2930 void os::yield_all(int attempts) {
2931 // Yields to all threads, including threads with lower priorities
2932 // Threads on Linux are all with same priority. The Solaris style
2933 // os::yield_all() with nanosleep(1ms) is not necessary.
2934 sched_yield();
2935 }
2937 // Called from the tight loops to possibly influence time-sharing heuristics
2938 void os::loop_breaker(int attempts) {
2939 os::yield_all(attempts);
2940 }
2942 ////////////////////////////////////////////////////////////////////////////////
2943 // thread priority support
2945 // From AIX manpage to pthread_setschedparam
2946 // (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?
2947 // topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm):
2948 //
2949 // "If schedpolicy is SCHED_OTHER, then sched_priority must be in the
2950 // range from 40 to 80, where 40 is the least favored priority and 80
2951 // is the most favored."
2952 //
2953 // (Actually, I doubt this even has an impact on AIX, as we do kernel
2954 // scheduling there; however, this still leaves iSeries.)
2955 //
2956 // We use the same values for AIX and PASE.
2957 int os::java_to_os_priority[CriticalPriority + 1] = {
2958 54, // 0 Entry should never be used
2960 55, // 1 MinPriority
2961 55, // 2
2962 56, // 3
2964 56, // 4
2965 57, // 5 NormPriority
2966 57, // 6
2968 58, // 7
2969 58, // 8
2970 59, // 9 NearMaxPriority
2972 60, // 10 MaxPriority
2974 60 // 11 CriticalPriority
2975 };
2977 OSReturn os::set_native_priority(Thread* thread, int newpri) {
2978 if (!UseThreadPriorities) return OS_OK;
2979 pthread_t thr = thread->osthread()->pthread_id();
2980 int policy = SCHED_OTHER;
2981 struct sched_param param;
2982 param.sched_priority = newpri;
2983 int ret = pthread_setschedparam(thr, policy, ¶m);
2985 if (ret != 0) {
2986 trcVerbose("Could not change priority for thread %d to %d (error %d, %s)",
2987 (int)thr, newpri, ret, strerror(ret));
2988 }
2989 return (ret == 0) ? OS_OK : OS_ERR;
2990 }
2992 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
2993 if (!UseThreadPriorities) {
2994 *priority_ptr = java_to_os_priority[NormPriority];
2995 return OS_OK;
2996 }
2997 pthread_t thr = thread->osthread()->pthread_id();
2998 int policy = SCHED_OTHER;
2999 struct sched_param param;
3000 int ret = pthread_getschedparam(thr, &policy, ¶m);
3001 *priority_ptr = param.sched_priority;
3003 return (ret == 0) ? OS_OK : OS_ERR;
3004 }
3006 // Hint to the underlying OS that a task switch would not be good.
3007 // Void return because it's a hint and can fail.
3008 void os::hint_no_preempt() {}
3010 ////////////////////////////////////////////////////////////////////////////////
3011 // suspend/resume support
3013 // the low-level signal-based suspend/resume support is a remnant from the
3014 // old VM-suspension that used to be for java-suspension, safepoints etc,
3015 // within hotspot. Now there is a single use-case for this:
3016 // - calling get_thread_pc() on the VMThread by the flat-profiler task
3017 // that runs in the watcher thread.
3018 // The remaining code is greatly simplified from the more general suspension
3019 // code that used to be used.
3020 //
3021 // The protocol is quite simple:
3022 // - suspend:
3023 // - sends a signal to the target thread
3024 // - polls the suspend state of the osthread using a yield loop
3025 // - target thread signal handler (SR_handler) sets suspend state
3026 // and blocks in sigsuspend until continued
3027 // - resume:
3028 // - sets target osthread state to continue
3029 // - sends signal to end the sigsuspend loop in the SR_handler
3030 //
3031 // Note that the SR_lock plays no role in this suspend/resume protocol.
3032 //
3034 static void resume_clear_context(OSThread *osthread) {
3035 osthread->set_ucontext(NULL);
3036 osthread->set_siginfo(NULL);
3037 }
3039 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
3040 osthread->set_ucontext(context);
3041 osthread->set_siginfo(siginfo);
3042 }
3044 //
3045 // Handler function invoked when a thread's execution is suspended or
3046 // resumed. We have to be careful that only async-safe functions are
3047 // called here (Note: most pthread functions are not async safe and
3048 // should be avoided.)
3049 //
3050 // Note: sigwait() is a more natural fit than sigsuspend() from an
3051 // interface point of view, but sigwait() prevents the signal hander
3052 // from being run. libpthread would get very confused by not having
3053 // its signal handlers run and prevents sigwait()'s use with the
3054 // mutex granting granting signal.
3055 //
3056 // Currently only ever called on the VMThread and JavaThreads (PC sampling).
3057 //
3058 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
3059 // Save and restore errno to avoid confusing native code with EINTR
3060 // after sigsuspend.
3061 int old_errno = errno;
3063 Thread* thread = Thread::current();
3064 OSThread* osthread = thread->osthread();
3065 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
3067 os::SuspendResume::State current = osthread->sr.state();
3068 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
3069 suspend_save_context(osthread, siginfo, context);
3071 // attempt to switch the state, we assume we had a SUSPEND_REQUEST
3072 os::SuspendResume::State state = osthread->sr.suspended();
3073 if (state == os::SuspendResume::SR_SUSPENDED) {
3074 sigset_t suspend_set; // signals for sigsuspend()
3076 // get current set of blocked signals and unblock resume signal
3077 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
3078 sigdelset(&suspend_set, SR_signum);
3080 // wait here until we are resumed
3081 while (1) {
3082 sigsuspend(&suspend_set);
3084 os::SuspendResume::State result = osthread->sr.running();
3085 if (result == os::SuspendResume::SR_RUNNING) {
3086 break;
3087 }
3088 }
3090 } else if (state == os::SuspendResume::SR_RUNNING) {
3091 // request was cancelled, continue
3092 } else {
3093 ShouldNotReachHere();
3094 }
3096 resume_clear_context(osthread);
3097 } else if (current == os::SuspendResume::SR_RUNNING) {
3098 // request was cancelled, continue
3099 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
3100 // ignore
3101 } else {
3102 ShouldNotReachHere();
3103 }
3105 errno = old_errno;
3106 }
3108 static int SR_initialize() {
3109 struct sigaction act;
3110 char *s;
3111 // Get signal number to use for suspend/resume
3112 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
3113 int sig = ::strtol(s, 0, 10);
3114 if (sig > 0 || sig < NSIG) {
3115 SR_signum = sig;
3116 }
3117 }
3119 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
3120 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
3122 sigemptyset(&SR_sigset);
3123 sigaddset(&SR_sigset, SR_signum);
3125 // Set up signal handler for suspend/resume.
3126 act.sa_flags = SA_RESTART|SA_SIGINFO;
3127 act.sa_handler = (void (*)(int)) SR_handler;
3129 // SR_signum is blocked by default.
3130 // 4528190 - We also need to block pthread restart signal (32 on all
3131 // supported Linux platforms). Note that LinuxThreads need to block
3132 // this signal for all threads to work properly. So we don't have
3133 // to use hard-coded signal number when setting up the mask.
3134 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
3136 if (sigaction(SR_signum, &act, 0) == -1) {
3137 return -1;
3138 }
3140 // Save signal flag
3141 os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
3142 return 0;
3143 }
3145 static int SR_finalize() {
3146 return 0;
3147 }
3149 static int sr_notify(OSThread* osthread) {
3150 int status = pthread_kill(osthread->pthread_id(), SR_signum);
3151 assert_status(status == 0, status, "pthread_kill");
3152 return status;
3153 }
3155 // "Randomly" selected value for how long we want to spin
3156 // before bailing out on suspending a thread, also how often
3157 // we send a signal to a thread we want to resume
3158 static const int RANDOMLY_LARGE_INTEGER = 1000000;
3159 static const int RANDOMLY_LARGE_INTEGER2 = 100;
3161 // returns true on success and false on error - really an error is fatal
3162 // but this seems the normal response to library errors
3163 static bool do_suspend(OSThread* osthread) {
3164 assert(osthread->sr.is_running(), "thread should be running");
3165 // mark as suspended and send signal
3167 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
3168 // failed to switch, state wasn't running?
3169 ShouldNotReachHere();
3170 return false;
3171 }
3173 if (sr_notify(osthread) != 0) {
3174 // try to cancel, switch to running
3176 os::SuspendResume::State result = osthread->sr.cancel_suspend();
3177 if (result == os::SuspendResume::SR_RUNNING) {
3178 // cancelled
3179 return false;
3180 } else if (result == os::SuspendResume::SR_SUSPENDED) {
3181 // somehow managed to suspend
3182 return true;
3183 } else {
3184 ShouldNotReachHere();
3185 return false;
3186 }
3187 }
3189 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
3191 for (int n = 0; !osthread->sr.is_suspended(); n++) {
3192 for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
3193 os::yield_all(i);
3194 }
3196 // timeout, try to cancel the request
3197 if (n >= RANDOMLY_LARGE_INTEGER) {
3198 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
3199 if (cancelled == os::SuspendResume::SR_RUNNING) {
3200 return false;
3201 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
3202 return true;
3203 } else {
3204 ShouldNotReachHere();
3205 return false;
3206 }
3207 }
3208 }
3210 guarantee(osthread->sr.is_suspended(), "Must be suspended");
3211 return true;
3212 }
3214 static void do_resume(OSThread* osthread) {
3215 //assert(osthread->sr.is_suspended(), "thread should be suspended");
3217 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
3218 // failed to switch to WAKEUP_REQUEST
3219 ShouldNotReachHere();
3220 return;
3221 }
3223 while (!osthread->sr.is_running()) {
3224 if (sr_notify(osthread) == 0) {
3225 for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
3226 for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
3227 os::yield_all(i);
3228 }
3229 }
3230 } else {
3231 ShouldNotReachHere();
3232 }
3233 }
3235 guarantee(osthread->sr.is_running(), "Must be running!");
3236 }
3238 ////////////////////////////////////////////////////////////////////////////////
3239 // interrupt support
3241 void os::interrupt(Thread* thread) {
3242 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
3243 "possibility of dangling Thread pointer");
3245 OSThread* osthread = thread->osthread();
3247 if (!osthread->interrupted()) {
3248 osthread->set_interrupted(true);
3249 // More than one thread can get here with the same value of osthread,
3250 // resulting in multiple notifications. We do, however, want the store
3251 // to interrupted() to be visible to other threads before we execute unpark().
3252 OrderAccess::fence();
3253 ParkEvent * const slp = thread->_SleepEvent;
3254 if (slp != NULL) slp->unpark();
3255 }
3257 // For JSR166. Unpark even if interrupt status already was set
3258 if (thread->is_Java_thread())
3259 ((JavaThread*)thread)->parker()->unpark();
3261 ParkEvent * ev = thread->_ParkEvent;
3262 if (ev != NULL) ev->unpark();
3264 }
3266 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3267 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
3268 "possibility of dangling Thread pointer");
3270 OSThread* osthread = thread->osthread();
3272 bool interrupted = osthread->interrupted();
3274 if (interrupted && clear_interrupted) {
3275 osthread->set_interrupted(false);
3276 // consider thread->_SleepEvent->reset() ... optional optimization
3277 }
3279 return interrupted;
3280 }
3282 ///////////////////////////////////////////////////////////////////////////////////
3283 // signal handling (except suspend/resume)
3285 // This routine may be used by user applications as a "hook" to catch signals.
3286 // The user-defined signal handler must pass unrecognized signals to this
3287 // routine, and if it returns true (non-zero), then the signal handler must
3288 // return immediately. If the flag "abort_if_unrecognized" is true, then this
3289 // routine will never retun false (zero), but instead will execute a VM panic
3290 // routine kill the process.
3291 //
3292 // If this routine returns false, it is OK to call it again. This allows
3293 // the user-defined signal handler to perform checks either before or after
3294 // the VM performs its own checks. Naturally, the user code would be making
3295 // a serious error if it tried to handle an exception (such as a null check
3296 // or breakpoint) that the VM was generating for its own correct operation.
3297 //
3298 // This routine may recognize any of the following kinds of signals:
3299 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
3300 // It should be consulted by handlers for any of those signals.
3301 //
3302 // The caller of this routine must pass in the three arguments supplied
3303 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
3304 // field of the structure passed to sigaction(). This routine assumes that
3305 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
3306 //
3307 // Note that the VM will print warnings if it detects conflicting signal
3308 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
3309 //
3310 extern "C" JNIEXPORT int
3311 JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
3313 // Set thread signal mask (for some reason on AIX sigthreadmask() seems
3314 // to be the thing to call; documentation is not terribly clear about whether
3315 // pthread_sigmask also works, and if it does, whether it does the same.
3316 bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) {
3317 const int rc = ::pthread_sigmask(how, set, oset);
3318 // return value semantics differ slightly for error case:
3319 // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno
3320 // (so, pthread_sigmask is more theadsafe for error handling)
3321 // But success is always 0.
3322 return rc == 0 ? true : false;
3323 }
3325 // Function to unblock all signals which are, according
3326 // to POSIX, typical program error signals. If they happen while being blocked,
3327 // they typically will bring down the process immediately.
3328 bool unblock_program_error_signals() {
3329 sigset_t set;
3330 ::sigemptyset(&set);
3331 ::sigaddset(&set, SIGILL);
3332 ::sigaddset(&set, SIGBUS);
3333 ::sigaddset(&set, SIGFPE);
3334 ::sigaddset(&set, SIGSEGV);
3335 return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL);
3336 }
3338 // Renamed from 'signalHandler' to avoid collision with other shared libs.
3339 void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
3340 assert(info != NULL && uc != NULL, "it must be old kernel");
3342 // Never leave program error signals blocked;
3343 // on all our platforms they would bring down the process immediately when
3344 // getting raised while being blocked.
3345 unblock_program_error_signals();
3347 JVM_handle_aix_signal(sig, info, uc, true);
3348 }
3350 // This boolean allows users to forward their own non-matching signals
3351 // to JVM_handle_aix_signal, harmlessly.
3352 bool os::Aix::signal_handlers_are_installed = false;
3354 // For signal-chaining
3355 struct sigaction os::Aix::sigact[MAXSIGNUM];
3356 unsigned int os::Aix::sigs = 0;
3357 bool os::Aix::libjsig_is_loaded = false;
3358 typedef struct sigaction *(*get_signal_t)(int);
3359 get_signal_t os::Aix::get_signal_action = NULL;
3361 struct sigaction* os::Aix::get_chained_signal_action(int sig) {
3362 struct sigaction *actp = NULL;
3364 if (libjsig_is_loaded) {
3365 // Retrieve the old signal handler from libjsig
3366 actp = (*get_signal_action)(sig);
3367 }
3368 if (actp == NULL) {
3369 // Retrieve the preinstalled signal handler from jvm
3370 actp = get_preinstalled_handler(sig);
3371 }
3373 return actp;
3374 }
3376 static bool call_chained_handler(struct sigaction *actp, int sig,
3377 siginfo_t *siginfo, void *context) {
3378 // Call the old signal handler
3379 if (actp->sa_handler == SIG_DFL) {
3380 // It's more reasonable to let jvm treat it as an unexpected exception
3381 // instead of taking the default action.
3382 return false;
3383 } else if (actp->sa_handler != SIG_IGN) {
3384 if ((actp->sa_flags & SA_NODEFER) == 0) {
3385 // automaticlly block the signal
3386 sigaddset(&(actp->sa_mask), sig);
3387 }
3389 sa_handler_t hand = NULL;
3390 sa_sigaction_t sa = NULL;
3391 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
3392 // retrieve the chained handler
3393 if (siginfo_flag_set) {
3394 sa = actp->sa_sigaction;
3395 } else {
3396 hand = actp->sa_handler;
3397 }
3399 if ((actp->sa_flags & SA_RESETHAND) != 0) {
3400 actp->sa_handler = SIG_DFL;
3401 }
3403 // try to honor the signal mask
3404 sigset_t oset;
3405 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
3407 // call into the chained handler
3408 if (siginfo_flag_set) {
3409 (*sa)(sig, siginfo, context);
3410 } else {
3411 (*hand)(sig);
3412 }
3414 // restore the signal mask
3415 pthread_sigmask(SIG_SETMASK, &oset, 0);
3416 }
3417 // Tell jvm's signal handler the signal is taken care of.
3418 return true;
3419 }
3421 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) {
3422 bool chained = false;
3423 // signal-chaining
3424 if (UseSignalChaining) {
3425 struct sigaction *actp = get_chained_signal_action(sig);
3426 if (actp != NULL) {
3427 chained = call_chained_handler(actp, sig, siginfo, context);
3428 }
3429 }
3430 return chained;
3431 }
3433 struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
3434 if ((((unsigned int)1 << sig) & sigs) != 0) {
3435 return &sigact[sig];
3436 }
3437 return NULL;
3438 }
3440 void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
3441 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3442 sigact[sig] = oldAct;
3443 sigs |= (unsigned int)1 << sig;
3444 }
3446 // for diagnostic
3447 int os::Aix::sigflags[MAXSIGNUM];
3449 int os::Aix::get_our_sigflags(int sig) {
3450 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3451 return sigflags[sig];
3452 }
3454 void os::Aix::set_our_sigflags(int sig, int flags) {
3455 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3456 sigflags[sig] = flags;
3457 }
3459 void os::Aix::set_signal_handler(int sig, bool set_installed) {
3460 // Check for overwrite.
3461 struct sigaction oldAct;
3462 sigaction(sig, (struct sigaction*)NULL, &oldAct);
3464 void* oldhand = oldAct.sa_sigaction
3465 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3466 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3467 // Renamed 'signalHandler' to avoid collision with other shared libs.
3468 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3469 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3470 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
3471 if (AllowUserSignalHandlers || !set_installed) {
3472 // Do not overwrite; user takes responsibility to forward to us.
3473 return;
3474 } else if (UseSignalChaining) {
3475 // save the old handler in jvm
3476 save_preinstalled_handler(sig, oldAct);
3477 // libjsig also interposes the sigaction() call below and saves the
3478 // old sigaction on it own.
3479 } else {
3480 fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
3481 "%#lx for signal %d.", (long)oldhand, sig));
3482 }
3483 }
3485 struct sigaction sigAct;
3486 sigfillset(&(sigAct.sa_mask));
3487 if (!set_installed) {
3488 sigAct.sa_handler = SIG_DFL;
3489 sigAct.sa_flags = SA_RESTART;
3490 } else {
3491 // Renamed 'signalHandler' to avoid collision with other shared libs.
3492 sigAct.sa_sigaction = javaSignalHandler;
3493 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
3494 }
3495 // Save flags, which are set by ours
3496 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3497 sigflags[sig] = sigAct.sa_flags;
3499 int ret = sigaction(sig, &sigAct, &oldAct);
3500 assert(ret == 0, "check");
3502 void* oldhand2 = oldAct.sa_sigaction
3503 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3504 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3505 assert(oldhand2 == oldhand, "no concurrent signal handler installation");
3506 }
3508 // install signal handlers for signals that HotSpot needs to
3509 // handle in order to support Java-level exception handling.
3510 void os::Aix::install_signal_handlers() {
3511 if (!signal_handlers_are_installed) {
3512 signal_handlers_are_installed = true;
3514 // signal-chaining
3515 typedef void (*signal_setting_t)();
3516 signal_setting_t begin_signal_setting = NULL;
3517 signal_setting_t end_signal_setting = NULL;
3518 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3519 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
3520 if (begin_signal_setting != NULL) {
3521 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3522 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
3523 get_signal_action = CAST_TO_FN_PTR(get_signal_t,
3524 dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
3525 libjsig_is_loaded = true;
3526 assert(UseSignalChaining, "should enable signal-chaining");
3527 }
3528 if (libjsig_is_loaded) {
3529 // Tell libjsig jvm is setting signal handlers
3530 (*begin_signal_setting)();
3531 }
3533 set_signal_handler(SIGSEGV, true);
3534 set_signal_handler(SIGPIPE, true);
3535 set_signal_handler(SIGBUS, true);
3536 set_signal_handler(SIGILL, true);
3537 set_signal_handler(SIGFPE, true);
3538 set_signal_handler(SIGTRAP, true);
3539 set_signal_handler(SIGXFSZ, true);
3540 set_signal_handler(SIGDANGER, true);
3542 if (libjsig_is_loaded) {
3543 // Tell libjsig jvm finishes setting signal handlers.
3544 (*end_signal_setting)();
3545 }
3547 // We don't activate signal checker if libjsig is in place, we trust ourselves
3548 // and if UserSignalHandler is installed all bets are off.
3549 // Log that signal checking is off only if -verbose:jni is specified.
3550 if (CheckJNICalls) {
3551 if (libjsig_is_loaded) {
3552 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
3553 check_signals = false;
3554 }
3555 if (AllowUserSignalHandlers) {
3556 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
3557 check_signals = false;
3558 }
3559 // Need to initialize check_signal_done.
3560 ::sigemptyset(&check_signal_done);
3561 }
3562 }
3563 }
3565 static const char* get_signal_handler_name(address handler,
3566 char* buf, int buflen) {
3567 int offset;
3568 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
3569 if (found) {
3570 // skip directory names
3571 const char *p1, *p2;
3572 p1 = buf;
3573 size_t len = strlen(os::file_separator());
3574 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
3575 // The way os::dll_address_to_library_name is implemented on Aix
3576 // right now, it always returns -1 for the offset which is not
3577 // terribly informative.
3578 // Will fix that. For now, omit the offset.
3579 jio_snprintf(buf, buflen, "%s", p1);
3580 } else {
3581 jio_snprintf(buf, buflen, PTR_FORMAT, handler);
3582 }
3583 return buf;
3584 }
3586 static void print_signal_handler(outputStream* st, int sig,
3587 char* buf, size_t buflen) {
3588 struct sigaction sa;
3589 sigaction(sig, NULL, &sa);
3591 st->print("%s: ", os::exception_name(sig, buf, buflen));
3593 address handler = (sa.sa_flags & SA_SIGINFO)
3594 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
3595 : CAST_FROM_FN_PTR(address, sa.sa_handler);
3597 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
3598 st->print("SIG_DFL");
3599 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
3600 st->print("SIG_IGN");
3601 } else {
3602 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
3603 }
3605 // Print readable mask.
3606 st->print(", sa_mask[0]=");
3607 os::Posix::print_signal_set_short(st, &sa.sa_mask);
3609 address rh = VMError::get_resetted_sighandler(sig);
3610 // May be, handler was resetted by VMError?
3611 if (rh != NULL) {
3612 handler = rh;
3613 sa.sa_flags = VMError::get_resetted_sigflags(sig);
3614 }
3616 // Print textual representation of sa_flags.
3617 st->print(", sa_flags=");
3618 os::Posix::print_sa_flags(st, sa.sa_flags);
3620 // Check: is it our handler?
3621 if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) ||
3622 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
3623 // It is our signal handler.
3624 // Check for flags, reset system-used one!
3625 if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) {
3626 st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library",
3627 os::Aix::get_our_sigflags(sig));
3628 }
3629 }
3630 st->cr();
3631 }
3633 #define DO_SIGNAL_CHECK(sig) \
3634 if (!sigismember(&check_signal_done, sig)) \
3635 os::Aix::check_signal_handler(sig)
3637 // This method is a periodic task to check for misbehaving JNI applications
3638 // under CheckJNI, we can add any periodic checks here
3640 void os::run_periodic_checks() {
3642 if (check_signals == false) return;
3644 // SEGV and BUS if overridden could potentially prevent
3645 // generation of hs*.log in the event of a crash, debugging
3646 // such a case can be very challenging, so we absolutely
3647 // check the following for a good measure:
3648 DO_SIGNAL_CHECK(SIGSEGV);
3649 DO_SIGNAL_CHECK(SIGILL);
3650 DO_SIGNAL_CHECK(SIGFPE);
3651 DO_SIGNAL_CHECK(SIGBUS);
3652 DO_SIGNAL_CHECK(SIGPIPE);
3653 DO_SIGNAL_CHECK(SIGXFSZ);
3654 if (UseSIGTRAP) {
3655 DO_SIGNAL_CHECK(SIGTRAP);
3656 }
3657 DO_SIGNAL_CHECK(SIGDANGER);
3659 // ReduceSignalUsage allows the user to override these handlers
3660 // see comments at the very top and jvm_solaris.h
3661 if (!ReduceSignalUsage) {
3662 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
3663 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
3664 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
3665 DO_SIGNAL_CHECK(BREAK_SIGNAL);
3666 }
3668 DO_SIGNAL_CHECK(SR_signum);
3669 DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
3670 }
3672 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
3674 static os_sigaction_t os_sigaction = NULL;
3676 void os::Aix::check_signal_handler(int sig) {
3677 char buf[O_BUFLEN];
3678 address jvmHandler = NULL;
3680 struct sigaction act;
3681 if (os_sigaction == NULL) {
3682 // only trust the default sigaction, in case it has been interposed
3683 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
3684 if (os_sigaction == NULL) return;
3685 }
3687 os_sigaction(sig, (struct sigaction*)NULL, &act);
3689 address thisHandler = (act.sa_flags & SA_SIGINFO)
3690 ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
3691 : CAST_FROM_FN_PTR(address, act.sa_handler);
3693 switch(sig) {
3694 case SIGSEGV:
3695 case SIGBUS:
3696 case SIGFPE:
3697 case SIGPIPE:
3698 case SIGILL:
3699 case SIGXFSZ:
3700 // Renamed 'signalHandler' to avoid collision with other shared libs.
3701 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler);
3702 break;
3704 case SHUTDOWN1_SIGNAL:
3705 case SHUTDOWN2_SIGNAL:
3706 case SHUTDOWN3_SIGNAL:
3707 case BREAK_SIGNAL:
3708 jvmHandler = (address)user_handler();
3709 break;
3711 case INTERRUPT_SIGNAL:
3712 jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
3713 break;
3715 default:
3716 if (sig == SR_signum) {
3717 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
3718 } else {
3719 return;
3720 }
3721 break;
3722 }
3724 if (thisHandler != jvmHandler) {
3725 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
3726 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
3727 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
3728 // No need to check this sig any longer
3729 sigaddset(&check_signal_done, sig);
3730 // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
3731 if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
3732 tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
3733 exception_name(sig, buf, O_BUFLEN));
3734 }
3735 } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) {
3736 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
3737 tty->print("expected:" PTR32_FORMAT, os::Aix::get_our_sigflags(sig));
3738 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags);
3739 // No need to check this sig any longer
3740 sigaddset(&check_signal_done, sig);
3741 }
3743 // Dump all the signal
3744 if (sigismember(&check_signal_done, sig)) {
3745 print_signal_handlers(tty, buf, O_BUFLEN);
3746 }
3747 }
3749 extern bool signal_name(int signo, char* buf, size_t len);
3751 const char* os::exception_name(int exception_code, char* buf, size_t size) {
3752 if (0 < exception_code && exception_code <= SIGRTMAX) {
3753 // signal
3754 if (!signal_name(exception_code, buf, size)) {
3755 jio_snprintf(buf, size, "SIG%d", exception_code);
3756 }
3757 return buf;
3758 } else {
3759 return NULL;
3760 }
3761 }
3763 // To install functions for atexit system call
3764 extern "C" {
3765 static void perfMemory_exit_helper() {
3766 perfMemory_exit();
3767 }
3768 }
3770 // This is called _before_ the most of global arguments have been parsed.
3771 void os::init(void) {
3772 // This is basic, we want to know if that ever changes.
3773 // (shared memory boundary is supposed to be a 256M aligned)
3774 assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected");
3776 // First off, we need to know whether we run on AIX or PASE, and
3777 // the OS level we run on.
3778 os::Aix::initialize_os_info();
3780 // Scan environment (SPEC1170 behaviour, etc)
3781 os::Aix::scan_environment();
3783 // Check which pages are supported by AIX.
3784 os::Aix::query_multipage_support();
3786 // Next, we need to initialize libo4 and libperfstat libraries.
3787 if (os::Aix::on_pase()) {
3788 os::Aix::initialize_libo4();
3789 } else {
3790 os::Aix::initialize_libperfstat();
3791 }
3793 // Reset the perfstat information provided by ODM.
3794 if (os::Aix::on_aix()) {
3795 libperfstat::perfstat_reset();
3796 }
3798 // Now initialze basic system properties. Note that for some of the values we
3799 // need libperfstat etc.
3800 os::Aix::initialize_system_info();
3802 // Initialize large page support.
3803 if (UseLargePages) {
3804 os::large_page_init();
3805 if (!UseLargePages) {
3806 // initialize os::_page_sizes
3807 _page_sizes[0] = Aix::page_size();
3808 _page_sizes[1] = 0;
3809 if (Verbose) {
3810 fprintf(stderr, "Large Page initialization failed: setting UseLargePages=0.\n");
3811 }
3812 }
3813 } else {
3814 // initialize os::_page_sizes
3815 _page_sizes[0] = Aix::page_size();
3816 _page_sizes[1] = 0;
3817 }
3819 // debug trace
3820 if (Verbose) {
3821 fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size());
3822 fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size());
3823 fprintf(stderr, "os::_page_sizes = ( ");
3824 for (int i = 0; _page_sizes[i]; i ++) {
3825 fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i]));
3826 }
3827 fprintf(stderr, ")\n");
3828 }
3830 _initial_pid = getpid();
3832 clock_tics_per_sec = sysconf(_SC_CLK_TCK);
3834 init_random(1234567);
3836 ThreadCritical::initialize();
3838 // _main_thread points to the thread that created/loaded the JVM.
3839 Aix::_main_thread = pthread_self();
3841 initial_time_count = os::elapsed_counter();
3842 pthread_mutex_init(&dl_mutex, NULL);
3843 }
3845 // This is called _after_ the global arguments have been parsed.
3846 jint os::init_2(void) {
3848 trcVerbose("processor count: %d", os::_processor_count);
3849 trcVerbose("physical memory: %lu", Aix::_physical_memory);
3851 // Initially build up the loaded dll map.
3852 LoadedLibraries::reload();
3854 const int page_size = Aix::page_size();
3855 const int map_size = page_size;
3857 address map_address = (address) MAP_FAILED;
3858 const int prot = PROT_READ;
3859 const int flags = MAP_PRIVATE|MAP_ANONYMOUS;
3861 // use optimized addresses for the polling page,
3862 // e.g. map it to a special 32-bit address.
3863 if (OptimizePollingPageLocation) {
3864 // architecture-specific list of address wishes:
3865 address address_wishes[] = {
3866 // AIX: addresses lower than 0x30000000 don't seem to work on AIX.
3867 // PPC64: all address wishes are non-negative 32 bit values where
3868 // the lower 16 bits are all zero. we can load these addresses
3869 // with a single ppc_lis instruction.
3870 (address) 0x30000000, (address) 0x31000000,
3871 (address) 0x32000000, (address) 0x33000000,
3872 (address) 0x40000000, (address) 0x41000000,
3873 (address) 0x42000000, (address) 0x43000000,
3874 (address) 0x50000000, (address) 0x51000000,
3875 (address) 0x52000000, (address) 0x53000000,
3876 (address) 0x60000000, (address) 0x61000000,
3877 (address) 0x62000000, (address) 0x63000000
3878 };
3879 int address_wishes_length = sizeof(address_wishes)/sizeof(address);
3881 // iterate over the list of address wishes:
3882 for (int i=0; i<address_wishes_length; i++) {
3883 // try to map with current address wish.
3884 // AIX: AIX needs MAP_FIXED if we provide an address and mmap will
3885 // fail if the address is already mapped.
3886 map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size,
3887 map_size, prot,
3888 flags | MAP_FIXED,
3889 -1, 0);
3890 if (Verbose) {
3891 fprintf(stderr, "SafePoint Polling Page address: %p (wish) => %p\n",
3892 address_wishes[i], map_address + (ssize_t)page_size);
3893 }
3895 if (map_address + (ssize_t)page_size == address_wishes[i]) {
3896 // map succeeded and map_address is at wished address, exit loop.
3897 break;
3898 }
3900 if (map_address != (address) MAP_FAILED) {
3901 // Map succeeded, but polling_page is not at wished address, unmap and continue.
3902 ::munmap(map_address, map_size);
3903 map_address = (address) MAP_FAILED;
3904 }
3905 // map failed, continue loop.
3906 }
3907 } // end OptimizePollingPageLocation
3909 if (map_address == (address) MAP_FAILED) {
3910 map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0);
3911 }
3912 guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page");
3913 os::set_polling_page(map_address);
3915 if (!UseMembar) {
3916 address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
3917 guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
3918 os::set_memory_serialize_page(mem_serialize_page);
3920 #ifndef PRODUCT
3921 if (Verbose && PrintMiscellaneous)
3922 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3923 #endif
3924 }
3926 // initialize suspend/resume support - must do this before signal_sets_init()
3927 if (SR_initialize() != 0) {
3928 perror("SR_initialize failed");
3929 return JNI_ERR;
3930 }
3932 Aix::signal_sets_init();
3933 Aix::install_signal_handlers();
3935 // Check minimum allowable stack size for thread creation and to initialize
3936 // the java system classes, including StackOverflowError - depends on page
3937 // size. Add a page for compiler2 recursion in main thread.
3938 // Add in 2*BytesPerWord times page size to account for VM stack during
3939 // class initialization depending on 32 or 64 bit VM.
3940 os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed,
3941 (size_t)(StackYellowPages+StackRedPages+StackShadowPages +
3942 2*BytesPerWord COMPILER2_PRESENT(+1)) * Aix::page_size());
3944 size_t threadStackSizeInBytes = ThreadStackSize * K;
3945 if (threadStackSizeInBytes != 0 &&
3946 threadStackSizeInBytes < os::Aix::min_stack_allowed) {
3947 tty->print_cr("\nThe stack size specified is too small, "
3948 "Specify at least %dk",
3949 os::Aix::min_stack_allowed / K);
3950 return JNI_ERR;
3951 }
3953 // Make the stack size a multiple of the page size so that
3954 // the yellow/red zones can be guarded.
3955 // Note that this can be 0, if no default stacksize was set.
3956 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size()));
3958 Aix::libpthread_init();
3960 if (MaxFDLimit) {
3961 // set the number of file descriptors to max. print out error
3962 // if getrlimit/setrlimit fails but continue regardless.
3963 struct rlimit nbr_files;
3964 int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
3965 if (status != 0) {
3966 if (PrintMiscellaneous && (Verbose || WizardMode))
3967 perror("os::init_2 getrlimit failed");
3968 } else {
3969 nbr_files.rlim_cur = nbr_files.rlim_max;
3970 status = setrlimit(RLIMIT_NOFILE, &nbr_files);
3971 if (status != 0) {
3972 if (PrintMiscellaneous && (Verbose || WizardMode))
3973 perror("os::init_2 setrlimit failed");
3974 }
3975 }
3976 }
3978 if (PerfAllowAtExitRegistration) {
3979 // only register atexit functions if PerfAllowAtExitRegistration is set.
3980 // atexit functions can be delayed until process exit time, which
3981 // can be problematic for embedded VM situations. Embedded VMs should
3982 // call DestroyJavaVM() to assure that VM resources are released.
3984 // note: perfMemory_exit_helper atexit function may be removed in
3985 // the future if the appropriate cleanup code can be added to the
3986 // VM_Exit VMOperation's doit method.
3987 if (atexit(perfMemory_exit_helper) != 0) {
3988 warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3989 }
3990 }
3992 return JNI_OK;
3993 }
3995 // Mark the polling page as unreadable
3996 void os::make_polling_page_unreadable(void) {
3997 if (!guard_memory((char*)_polling_page, Aix::page_size())) {
3998 fatal("Could not disable polling page");
3999 }
4000 };
4002 // Mark the polling page as readable
4003 void os::make_polling_page_readable(void) {
4004 // Changed according to os_linux.cpp.
4005 if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
4006 fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page));
4007 }
4008 };
4010 int os::active_processor_count() {
4011 int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
4012 assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
4013 return online_cpus;
4014 }
4016 void os::set_native_thread_name(const char *name) {
4017 // Not yet implemented.
4018 return;
4019 }
4021 bool os::distribute_processes(uint length, uint* distribution) {
4022 // Not yet implemented.
4023 return false;
4024 }
4026 bool os::bind_to_processor(uint processor_id) {
4027 // Not yet implemented.
4028 return false;
4029 }
4031 void os::SuspendedThreadTask::internal_do_task() {
4032 if (do_suspend(_thread->osthread())) {
4033 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
4034 do_task(context);
4035 do_resume(_thread->osthread());
4036 }
4037 }
4039 class PcFetcher : public os::SuspendedThreadTask {
4040 public:
4041 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
4042 ExtendedPC result();
4043 protected:
4044 void do_task(const os::SuspendedThreadTaskContext& context);
4045 private:
4046 ExtendedPC _epc;
4047 };
4049 ExtendedPC PcFetcher::result() {
4050 guarantee(is_done(), "task is not done yet.");
4051 return _epc;
4052 }
4054 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
4055 Thread* thread = context.thread();
4056 OSThread* osthread = thread->osthread();
4057 if (osthread->ucontext() != NULL) {
4058 _epc = os::Aix::ucontext_get_pc((ucontext_t *) context.ucontext());
4059 } else {
4060 // NULL context is unexpected, double-check this is the VMThread.
4061 guarantee(thread->is_VM_thread(), "can only be called for VMThread");
4062 }
4063 }
4065 // Suspends the target using the signal mechanism and then grabs the PC before
4066 // resuming the target. Used by the flat-profiler only
4067 ExtendedPC os::get_thread_pc(Thread* thread) {
4068 // Make sure that it is called by the watcher for the VMThread.
4069 assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
4070 assert(thread->is_VM_thread(), "Can only be called for VMThread");
4072 PcFetcher fetcher(thread);
4073 fetcher.run();
4074 return fetcher.result();
4075 }
4077 // Not neede on Aix.
4078 // int os::Aix::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) {
4079 // }
4081 ////////////////////////////////////////////////////////////////////////////////
4082 // debug support
4084 static address same_page(address x, address y) {
4085 intptr_t page_bits = -os::vm_page_size();
4086 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
4087 return x;
4088 else if (x > y)
4089 return (address)(intptr_t(y) | ~page_bits) + 1;
4090 else
4091 return (address)(intptr_t(y) & page_bits);
4092 }
4094 bool os::find(address addr, outputStream* st) {
4096 st->print(PTR_FORMAT ": ", addr);
4098 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
4099 if (lib) {
4100 lib->print(st);
4101 return true;
4102 } else {
4103 lib = LoadedLibraries::find_for_data_address(addr);
4104 if (lib) {
4105 lib->print(st);
4106 return true;
4107 } else {
4108 st->print_cr("(outside any module)");
4109 }
4110 }
4112 return false;
4113 }
4115 ////////////////////////////////////////////////////////////////////////////////
4116 // misc
4118 // This does not do anything on Aix. This is basically a hook for being
4119 // able to use structured exception handling (thread-local exception filters)
4120 // on, e.g., Win32.
4121 void
4122 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
4123 JavaCallArguments* args, Thread* thread) {
4124 f(value, method, args, thread);
4125 }
4127 void os::print_statistics() {
4128 }
4130 int os::message_box(const char* title, const char* message) {
4131 int i;
4132 fdStream err(defaultStream::error_fd());
4133 for (i = 0; i < 78; i++) err.print_raw("=");
4134 err.cr();
4135 err.print_raw_cr(title);
4136 for (i = 0; i < 78; i++) err.print_raw("-");
4137 err.cr();
4138 err.print_raw_cr(message);
4139 for (i = 0; i < 78; i++) err.print_raw("=");
4140 err.cr();
4142 char buf[16];
4143 // Prevent process from exiting upon "read error" without consuming all CPU
4144 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
4146 return buf[0] == 'y' || buf[0] == 'Y';
4147 }
4149 int os::stat(const char *path, struct stat *sbuf) {
4150 char pathbuf[MAX_PATH];
4151 if (strlen(path) > MAX_PATH - 1) {
4152 errno = ENAMETOOLONG;
4153 return -1;
4154 }
4155 os::native_path(strcpy(pathbuf, path));
4156 return ::stat(pathbuf, sbuf);
4157 }
4159 bool os::check_heap(bool force) {
4160 return true;
4161 }
4163 // int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
4164 // return ::vsnprintf(buf, count, format, args);
4165 // }
4167 // Is a (classpath) directory empty?
4168 bool os::dir_is_empty(const char* path) {
4169 DIR *dir = NULL;
4170 struct dirent *ptr;
4172 dir = opendir(path);
4173 if (dir == NULL) return true;
4175 /* Scan the directory */
4176 bool result = true;
4177 char buf[sizeof(struct dirent) + MAX_PATH];
4178 while (result && (ptr = ::readdir(dir)) != NULL) {
4179 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
4180 result = false;
4181 }
4182 }
4183 closedir(dir);
4184 return result;
4185 }
4187 // This code originates from JDK's sysOpen and open64_w
4188 // from src/solaris/hpi/src/system_md.c
4190 #ifndef O_DELETE
4191 #define O_DELETE 0x10000
4192 #endif
4194 // Open a file. Unlink the file immediately after open returns
4195 // if the specified oflag has the O_DELETE flag set.
4196 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
4198 int os::open(const char *path, int oflag, int mode) {
4200 if (strlen(path) > MAX_PATH - 1) {
4201 errno = ENAMETOOLONG;
4202 return -1;
4203 }
4204 int fd;
4205 int o_delete = (oflag & O_DELETE);
4206 oflag = oflag & ~O_DELETE;
4208 fd = ::open64(path, oflag, mode);
4209 if (fd == -1) return -1;
4211 // If the open succeeded, the file might still be a directory.
4212 {
4213 struct stat64 buf64;
4214 int ret = ::fstat64(fd, &buf64);
4215 int st_mode = buf64.st_mode;
4217 if (ret != -1) {
4218 if ((st_mode & S_IFMT) == S_IFDIR) {
4219 errno = EISDIR;
4220 ::close(fd);
4221 return -1;
4222 }
4223 } else {
4224 ::close(fd);
4225 return -1;
4226 }
4227 }
4229 // All file descriptors that are opened in the JVM and not
4230 // specifically destined for a subprocess should have the
4231 // close-on-exec flag set. If we don't set it, then careless 3rd
4232 // party native code might fork and exec without closing all
4233 // appropriate file descriptors (e.g. as we do in closeDescriptors in
4234 // UNIXProcess.c), and this in turn might:
4235 //
4236 // - cause end-of-file to fail to be detected on some file
4237 // descriptors, resulting in mysterious hangs, or
4238 //
4239 // - might cause an fopen in the subprocess to fail on a system
4240 // suffering from bug 1085341.
4241 //
4242 // (Yes, the default setting of the close-on-exec flag is a Unix
4243 // design flaw.)
4244 //
4245 // See:
4246 // 1085341: 32-bit stdio routines should support file descriptors >255
4247 // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
4248 // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
4249 #ifdef FD_CLOEXEC
4250 {
4251 int flags = ::fcntl(fd, F_GETFD);
4252 if (flags != -1)
4253 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
4254 }
4255 #endif
4257 if (o_delete != 0) {
4258 ::unlink(path);
4259 }
4260 return fd;
4261 }
4263 // create binary file, rewriting existing file if required
4264 int os::create_binary_file(const char* path, bool rewrite_existing) {
4265 int oflags = O_WRONLY | O_CREAT;
4266 if (!rewrite_existing) {
4267 oflags |= O_EXCL;
4268 }
4269 return ::open64(path, oflags, S_IREAD | S_IWRITE);
4270 }
4272 // return current position of file pointer
4273 jlong os::current_file_offset(int fd) {
4274 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
4275 }
4277 // move file pointer to the specified offset
4278 jlong os::seek_to_file_offset(int fd, jlong offset) {
4279 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
4280 }
4282 // This code originates from JDK's sysAvailable
4283 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
4285 int os::available(int fd, jlong *bytes) {
4286 jlong cur, end;
4287 int mode;
4288 struct stat64 buf64;
4290 if (::fstat64(fd, &buf64) >= 0) {
4291 mode = buf64.st_mode;
4292 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
4293 // XXX: is the following call interruptible? If so, this might
4294 // need to go through the INTERRUPT_IO() wrapper as for other
4295 // blocking, interruptible calls in this file.
4296 int n;
4297 if (::ioctl(fd, FIONREAD, &n) >= 0) {
4298 *bytes = n;
4299 return 1;
4300 }
4301 }
4302 }
4303 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
4304 return 0;
4305 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
4306 return 0;
4307 } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
4308 return 0;
4309 }
4310 *bytes = end - cur;
4311 return 1;
4312 }
4314 int os::socket_available(int fd, jint *pbytes) {
4315 // Linux doc says EINTR not returned, unlike Solaris
4316 int ret = ::ioctl(fd, FIONREAD, pbytes);
4318 //%% note ioctl can return 0 when successful, JVM_SocketAvailable
4319 // is expected to return 0 on failure and 1 on success to the jdk.
4320 return (ret < 0) ? 0 : 1;
4321 }
4323 // Map a block of memory.
4324 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4325 char *addr, size_t bytes, bool read_only,
4326 bool allow_exec) {
4327 Unimplemented();
4328 return NULL;
4329 }
4331 // Remap a block of memory.
4332 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4333 char *addr, size_t bytes, bool read_only,
4334 bool allow_exec) {
4335 // same as map_memory() on this OS
4336 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
4337 allow_exec);
4338 }
4340 // Unmap a block of memory.
4341 bool os::pd_unmap_memory(char* addr, size_t bytes) {
4342 return munmap(addr, bytes) == 0;
4343 }
4345 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
4346 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
4347 // of a thread.
4348 //
4349 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
4350 // the fast estimate available on the platform.
4352 jlong os::current_thread_cpu_time() {
4353 // return user + sys since the cost is the same
4354 const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */);
4355 assert(n >= 0, "negative CPU time");
4356 return n;
4357 }
4359 jlong os::thread_cpu_time(Thread* thread) {
4360 // consistent with what current_thread_cpu_time() returns
4361 const jlong n = os::thread_cpu_time(thread, true /* user + sys */);
4362 assert(n >= 0, "negative CPU time");
4363 return n;
4364 }
4366 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
4367 const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
4368 assert(n >= 0, "negative CPU time");
4369 return n;
4370 }
4372 static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) {
4373 bool error = false;
4375 jlong sys_time = 0;
4376 jlong user_time = 0;
4378 // Reimplemented using getthrds64().
4379 //
4380 // Works like this:
4381 // For the thread in question, get the kernel thread id. Then get the
4382 // kernel thread statistics using that id.
4383 //
4384 // This only works of course when no pthread scheduling is used,
4385 // i.e. there is a 1:1 relationship to kernel threads.
4386 // On AIX, see AIXTHREAD_SCOPE variable.
4388 pthread_t pthtid = thread->osthread()->pthread_id();
4390 // retrieve kernel thread id for the pthread:
4391 tid64_t tid = 0;
4392 struct __pthrdsinfo pinfo;
4393 // I just love those otherworldly IBM APIs which force me to hand down
4394 // dummy buffers for stuff I dont care for...
4395 char dummy[1];
4396 int dummy_size = sizeof(dummy);
4397 if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo),
4398 dummy, &dummy_size) == 0) {
4399 tid = pinfo.__pi_tid;
4400 } else {
4401 tty->print_cr("pthread_getthrds_np failed.");
4402 error = true;
4403 }
4405 // retrieve kernel timing info for that kernel thread
4406 if (!error) {
4407 struct thrdentry64 thrdentry;
4408 if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) {
4409 sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL;
4410 user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL;
4411 } else {
4412 tty->print_cr("pthread_getthrds_np failed.");
4413 error = true;
4414 }
4415 }
4417 if (p_sys_time) {
4418 *p_sys_time = sys_time;
4419 }
4421 if (p_user_time) {
4422 *p_user_time = user_time;
4423 }
4425 if (error) {
4426 return false;
4427 }
4429 return true;
4430 }
4432 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
4433 jlong sys_time;
4434 jlong user_time;
4436 if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) {
4437 return -1;
4438 }
4440 return user_sys_cpu_time ? sys_time + user_time : user_time;
4441 }
4443 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4444 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
4445 info_ptr->may_skip_backward = false; // elapsed time not wall time
4446 info_ptr->may_skip_forward = false; // elapsed time not wall time
4447 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
4448 }
4450 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4451 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
4452 info_ptr->may_skip_backward = false; // elapsed time not wall time
4453 info_ptr->may_skip_forward = false; // elapsed time not wall time
4454 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
4455 }
4457 bool os::is_thread_cpu_time_supported() {
4458 return true;
4459 }
4461 // System loadavg support. Returns -1 if load average cannot be obtained.
4462 // For now just return the system wide load average (no processor sets).
4463 int os::loadavg(double values[], int nelem) {
4465 // Implemented using libperfstat on AIX.
4467 guarantee(nelem >= 0 && nelem <= 3, "argument error");
4468 guarantee(values, "argument error");
4470 if (os::Aix::on_pase()) {
4471 Unimplemented();
4472 return -1;
4473 } else {
4474 // AIX: use libperfstat
4475 //
4476 // See also:
4477 // http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_cputot.htm
4478 // /usr/include/libperfstat.h:
4480 // Use the already AIX version independent get_cpuinfo.
4481 os::Aix::cpuinfo_t ci;
4482 if (os::Aix::get_cpuinfo(&ci)) {
4483 for (int i = 0; i < nelem; i++) {
4484 values[i] = ci.loadavg[i];
4485 }
4486 } else {
4487 return -1;
4488 }
4489 return nelem;
4490 }
4491 }
4493 void os::pause() {
4494 char filename[MAX_PATH];
4495 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4496 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4497 } else {
4498 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4499 }
4501 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4502 if (fd != -1) {
4503 struct stat buf;
4504 ::close(fd);
4505 while (::stat(filename, &buf) == 0) {
4506 (void)::poll(NULL, 0, 100);
4507 }
4508 } else {
4509 jio_fprintf(stderr,
4510 "Could not open pause file '%s', continuing immediately.\n", filename);
4511 }
4512 }
4514 bool os::is_primordial_thread(void) {
4515 if (pthread_self() == (pthread_t)1) {
4516 return true;
4517 } else {
4518 return false;
4519 }
4520 }
4522 // OS recognitions (PASE/AIX, OS level) call this before calling any
4523 // one of Aix::on_pase(), Aix::os_version() static
4524 void os::Aix::initialize_os_info() {
4526 assert(_on_pase == -1 && _os_version == -1, "already called.");
4528 struct utsname uts;
4529 memset(&uts, 0, sizeof(uts));
4530 strcpy(uts.sysname, "?");
4531 if (::uname(&uts) == -1) {
4532 trc("uname failed (%d)", errno);
4533 guarantee(0, "Could not determine whether we run on AIX or PASE");
4534 } else {
4535 trcVerbose("uname says: sysname \"%s\" version \"%s\" release \"%s\" "
4536 "node \"%s\" machine \"%s\"\n",
4537 uts.sysname, uts.version, uts.release, uts.nodename, uts.machine);
4538 const int major = atoi(uts.version);
4539 assert(major > 0, "invalid OS version");
4540 const int minor = atoi(uts.release);
4541 assert(minor > 0, "invalid OS release");
4542 _os_version = (major << 8) | minor;
4543 if (strcmp(uts.sysname, "OS400") == 0) {
4544 Unimplemented();
4545 } else if (strcmp(uts.sysname, "AIX") == 0) {
4546 // We run on AIX. We do not support versions older than AIX 5.3.
4547 _on_pase = 0;
4548 if (_os_version < 0x0503) {
4549 trc("AIX release older than AIX 5.3 not supported.");
4550 assert(false, "AIX release too old.");
4551 } else {
4552 trcVerbose("We run on AIX %d.%d\n", major, minor);
4553 }
4554 } else {
4555 assert(false, "unknown OS");
4556 }
4557 }
4559 guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release");
4560 } // end: os::Aix::initialize_os_info()
4562 // Scan environment for important settings which might effect the VM.
4563 // Trace out settings. Warn about invalid settings and/or correct them.
4564 //
4565 // Must run after os::Aix::initialue_os_info().
4566 void os::Aix::scan_environment() {
4568 char* p;
4569 int rc;
4571 // Warn explicity if EXTSHM=ON is used. That switch changes how
4572 // System V shared memory behaves. One effect is that page size of
4573 // shared memory cannot be change dynamically, effectivly preventing
4574 // large pages from working.
4575 // This switch was needed on AIX 32bit, but on AIX 64bit the general
4576 // recommendation is (in OSS notes) to switch it off.
4577 p = ::getenv("EXTSHM");
4578 if (Verbose) {
4579 fprintf(stderr, "EXTSHM=%s.\n", p ? p : "<unset>");
4580 }
4581 if (p && strcmp(p, "ON") == 0) {
4582 fprintf(stderr, "Unsupported setting: EXTSHM=ON. Large Page support will be disabled.\n");
4583 _extshm = 1;
4584 } else {
4585 _extshm = 0;
4586 }
4588 // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs.
4589 // Not tested, not supported.
4590 //
4591 // Note that it might be worth the trouble to test and to require it, if only to
4592 // get useful return codes for mprotect.
4593 //
4594 // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before
4595 // exec() ? before loading the libjvm ? ....)
4596 p = ::getenv("XPG_SUS_ENV");
4597 trcVerbose("XPG_SUS_ENV=%s.", p ? p : "<unset>");
4598 if (p && strcmp(p, "ON") == 0) {
4599 _xpg_sus_mode = 1;
4600 trc("Unsupported setting: XPG_SUS_ENV=ON");
4601 // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to
4602 // clobber address ranges. If we ever want to support that, we have to do some
4603 // testing first.
4604 guarantee(false, "XPG_SUS_ENV=ON not supported");
4605 } else {
4606 _xpg_sus_mode = 0;
4607 }
4609 // Switch off AIX internal (pthread) guard pages. This has
4610 // immediate effect for any pthread_create calls which follow.
4611 p = ::getenv("AIXTHREAD_GUARDPAGES");
4612 trcVerbose("AIXTHREAD_GUARDPAGES=%s.", p ? p : "<unset>");
4613 rc = ::putenv("AIXTHREAD_GUARDPAGES=0");
4614 guarantee(rc == 0, "");
4616 } // end: os::Aix::scan_environment()
4618 // PASE: initialize the libo4 library (AS400 PASE porting library).
4619 void os::Aix::initialize_libo4() {
4620 Unimplemented();
4621 }
4623 // AIX: initialize the libperfstat library (we load this dynamically
4624 // because it is only available on AIX.
4625 void os::Aix::initialize_libperfstat() {
4627 assert(os::Aix::on_aix(), "AIX only");
4629 if (!libperfstat::init()) {
4630 trc("libperfstat initialization failed.");
4631 assert(false, "libperfstat initialization failed");
4632 } else {
4633 if (Verbose) {
4634 fprintf(stderr, "libperfstat initialized.\n");
4635 }
4636 }
4637 } // end: os::Aix::initialize_libperfstat
4639 /////////////////////////////////////////////////////////////////////////////
4640 // thread stack
4642 // function to query the current stack size using pthread_getthrds_np
4643 //
4644 // ! do not change anything here unless you know what you are doing !
4645 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
4647 // This only works when invoked on a pthread. As we agreed not to use
4648 // primordial threads anyway, I assert here
4649 guarantee(!os::is_primordial_thread(), "not allowed on the primordial thread");
4651 // information about this api can be found (a) in the pthread.h header and
4652 // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
4653 //
4654 // The use of this API to find out the current stack is kind of undefined.
4655 // But after a lot of tries and asking IBM about it, I concluded that it is safe
4656 // enough for cases where I let the pthread library create its stacks. For cases
4657 // where I create an own stack and pass this to pthread_create, it seems not to
4658 // work (the returned stack size in that case is 0).
4660 pthread_t tid = pthread_self();
4661 struct __pthrdsinfo pinfo;
4662 char dummy[1]; // we only need this to satisfy the api and to not get E
4663 int dummy_size = sizeof(dummy);
4665 memset(&pinfo, 0, sizeof(pinfo));
4667 const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
4668 sizeof(pinfo), dummy, &dummy_size);
4670 if (rc != 0) {
4671 fprintf(stderr, "pthread_getthrds_np failed (%d)\n", rc);
4672 guarantee(0, "pthread_getthrds_np failed");
4673 }
4675 guarantee(pinfo.__pi_stackend, "returned stack base invalid");
4677 // the following can happen when invoking pthread_getthrds_np on a pthread running on a user provided stack
4678 // (when handing down a stack to pthread create, see pthread_attr_setstackaddr).
4679 // Not sure what to do here - I feel inclined to forbid this use case completely.
4680 guarantee(pinfo.__pi_stacksize, "returned stack size invalid");
4682 // On AIX, stacks are not necessarily page aligned so round the base and size accordingly
4683 if (p_stack_base) {
4684 (*p_stack_base) = (address) align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size());
4685 }
4687 if (p_stack_size) {
4688 (*p_stack_size) = pinfo.__pi_stacksize - os::Aix::stack_page_size();
4689 }
4691 #ifndef PRODUCT
4692 if (Verbose) {
4693 fprintf(stderr,
4694 "query_stack_dimensions() -> real stack_base=" INTPTR_FORMAT ", real stack_addr=" INTPTR_FORMAT
4695 ", real stack_size=" INTPTR_FORMAT
4696 ", stack_base=" INTPTR_FORMAT ", stack_size=" INTPTR_FORMAT "\n",
4697 (intptr_t)pinfo.__pi_stackend, (intptr_t)pinfo.__pi_stackaddr, pinfo.__pi_stacksize,
4698 (intptr_t)align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()),
4699 pinfo.__pi_stacksize - os::Aix::stack_page_size());
4700 }
4701 #endif
4703 } // end query_stack_dimensions
4705 // get the current stack base from the OS (actually, the pthread library)
4706 address os::current_stack_base() {
4707 address p;
4708 query_stack_dimensions(&p, 0);
4709 return p;
4710 }
4712 // get the current stack size from the OS (actually, the pthread library)
4713 size_t os::current_stack_size() {
4714 size_t s;
4715 query_stack_dimensions(0, &s);
4716 return s;
4717 }
4719 // Refer to the comments in os_solaris.cpp park-unpark.
4720 //
4721 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
4722 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
4723 // For specifics regarding the bug see GLIBC BUGID 261237 :
4724 // http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
4725 // Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
4726 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
4727 // is used. (The simple C test-case provided in the GLIBC bug report manifests the
4728 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
4729 // and monitorenter when we're using 1-0 locking. All those operations may result in
4730 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
4731 // of libpthread avoids the problem, but isn't practical.
4732 //
4733 // Possible remedies:
4734 //
4735 // 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work.
4736 // This is palliative and probabilistic, however. If the thread is preempted
4737 // between the call to compute_abstime() and pthread_cond_timedwait(), more
4738 // than the minimum period may have passed, and the abstime may be stale (in the
4739 // past) resultin in a hang. Using this technique reduces the odds of a hang
4740 // but the JVM is still vulnerable, particularly on heavily loaded systems.
4741 //
4742 // 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
4743 // of the usual flag-condvar-mutex idiom. The write side of the pipe is set
4744 // NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
4745 // reduces to poll()+read(). This works well, but consumes 2 FDs per extant
4746 // thread.
4747 //
4748 // 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread
4749 // that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
4750 // a timeout request to the chron thread and then blocking via pthread_cond_wait().
4751 // This also works well. In fact it avoids kernel-level scalability impediments
4752 // on certain platforms that don't handle lots of active pthread_cond_timedwait()
4753 // timers in a graceful fashion.
4754 //
4755 // 4. When the abstime value is in the past it appears that control returns
4756 // correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
4757 // Subsequent timedwait/wait calls may hang indefinitely. Given that, we
4758 // can avoid the problem by reinitializing the condvar -- by cond_destroy()
4759 // followed by cond_init() -- after all calls to pthread_cond_timedwait().
4760 // It may be possible to avoid reinitialization by checking the return
4761 // value from pthread_cond_timedwait(). In addition to reinitializing the
4762 // condvar we must establish the invariant that cond_signal() is only called
4763 // within critical sections protected by the adjunct mutex. This prevents
4764 // cond_signal() from "seeing" a condvar that's in the midst of being
4765 // reinitialized or that is corrupt. Sadly, this invariant obviates the
4766 // desirable signal-after-unlock optimization that avoids futile context switching.
4767 //
4768 // I'm also concerned that some versions of NTPL might allocate an auxilliary
4769 // structure when a condvar is used or initialized. cond_destroy() would
4770 // release the helper structure. Our reinitialize-after-timedwait fix
4771 // put excessive stress on malloc/free and locks protecting the c-heap.
4772 //
4773 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
4774 // It may be possible to refine (4) by checking the kernel and NTPL verisons
4775 // and only enabling the work-around for vulnerable environments.
4777 // utility to compute the abstime argument to timedwait:
4778 // millis is the relative timeout time
4779 // abstime will be the absolute timeout time
4780 // TODO: replace compute_abstime() with unpackTime()
4782 static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
4783 if (millis < 0) millis = 0;
4784 struct timeval now;
4785 int status = gettimeofday(&now, NULL);
4786 assert(status == 0, "gettimeofday");
4787 jlong seconds = millis / 1000;
4788 millis %= 1000;
4789 if (seconds > 50000000) { // see man cond_timedwait(3T)
4790 seconds = 50000000;
4791 }
4792 abstime->tv_sec = now.tv_sec + seconds;
4793 long usec = now.tv_usec + millis * 1000;
4794 if (usec >= 1000000) {
4795 abstime->tv_sec += 1;
4796 usec -= 1000000;
4797 }
4798 abstime->tv_nsec = usec * 1000;
4799 return abstime;
4800 }
4802 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
4803 // Conceptually TryPark() should be equivalent to park(0).
4805 int os::PlatformEvent::TryPark() {
4806 for (;;) {
4807 const int v = _Event;
4808 guarantee ((v == 0) || (v == 1), "invariant");
4809 if (Atomic::cmpxchg (0, &_Event, v) == v) return v;
4810 }
4811 }
4813 void os::PlatformEvent::park() { // AKA "down()"
4814 // Invariant: Only the thread associated with the Event/PlatformEvent
4815 // may call park().
4816 // TODO: assert that _Assoc != NULL or _Assoc == Self
4817 int v;
4818 for (;;) {
4819 v = _Event;
4820 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
4821 }
4822 guarantee (v >= 0, "invariant");
4823 if (v == 0) {
4824 // Do this the hard way by blocking ...
4825 int status = pthread_mutex_lock(_mutex);
4826 assert_status(status == 0, status, "mutex_lock");
4827 guarantee (_nParked == 0, "invariant");
4828 ++ _nParked;
4829 while (_Event < 0) {
4830 status = pthread_cond_wait(_cond, _mutex);
4831 assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait");
4832 }
4833 -- _nParked;
4835 // In theory we could move the ST of 0 into _Event past the unlock(),
4836 // but then we'd need a MEMBAR after the ST.
4837 _Event = 0;
4838 status = pthread_mutex_unlock(_mutex);
4839 assert_status(status == 0, status, "mutex_unlock");
4840 }
4841 guarantee (_Event >= 0, "invariant");
4842 }
4844 int os::PlatformEvent::park(jlong millis) {
4845 guarantee (_nParked == 0, "invariant");
4847 int v;
4848 for (;;) {
4849 v = _Event;
4850 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
4851 }
4852 guarantee (v >= 0, "invariant");
4853 if (v != 0) return OS_OK;
4855 // We do this the hard way, by blocking the thread.
4856 // Consider enforcing a minimum timeout value.
4857 struct timespec abst;
4858 compute_abstime(&abst, millis);
4860 int ret = OS_TIMEOUT;
4861 int status = pthread_mutex_lock(_mutex);
4862 assert_status(status == 0, status, "mutex_lock");
4863 guarantee (_nParked == 0, "invariant");
4864 ++_nParked;
4866 // Object.wait(timo) will return because of
4867 // (a) notification
4868 // (b) timeout
4869 // (c) thread.interrupt
4870 //
4871 // Thread.interrupt and object.notify{All} both call Event::set.
4872 // That is, we treat thread.interrupt as a special case of notification.
4873 // The underlying Solaris implementation, cond_timedwait, admits
4874 // spurious/premature wakeups, but the JLS/JVM spec prevents the
4875 // JVM from making those visible to Java code. As such, we must
4876 // filter out spurious wakeups. We assume all ETIME returns are valid.
4877 //
4878 // TODO: properly differentiate simultaneous notify+interrupt.
4879 // In that case, we should propagate the notify to another waiter.
4881 while (_Event < 0) {
4882 status = pthread_cond_timedwait(_cond, _mutex, &abst);
4883 assert_status(status == 0 || status == ETIMEDOUT,
4884 status, "cond_timedwait");
4885 if (!FilterSpuriousWakeups) break; // previous semantics
4886 if (status == ETIMEDOUT) break;
4887 // We consume and ignore EINTR and spurious wakeups.
4888 }
4889 --_nParked;
4890 if (_Event >= 0) {
4891 ret = OS_OK;
4892 }
4893 _Event = 0;
4894 status = pthread_mutex_unlock(_mutex);
4895 assert_status(status == 0, status, "mutex_unlock");
4896 assert (_nParked == 0, "invariant");
4897 return ret;
4898 }
4900 void os::PlatformEvent::unpark() {
4901 int v, AnyWaiters;
4902 for (;;) {
4903 v = _Event;
4904 if (v > 0) {
4905 // The LD of _Event could have reordered or be satisfied
4906 // by a read-aside from this processor's write buffer.
4907 // To avoid problems execute a barrier and then
4908 // ratify the value.
4909 OrderAccess::fence();
4910 if (_Event == v) return;
4911 continue;
4912 }
4913 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break;
4914 }
4915 if (v < 0) {
4916 // Wait for the thread associated with the event to vacate
4917 int status = pthread_mutex_lock(_mutex);
4918 assert_status(status == 0, status, "mutex_lock");
4919 AnyWaiters = _nParked;
4921 if (AnyWaiters != 0) {
4922 // We intentional signal *after* dropping the lock
4923 // to avoid a common class of futile wakeups.
4924 status = pthread_cond_signal(_cond);
4925 assert_status(status == 0, status, "cond_signal");
4926 }
4927 // Mutex should be locked for pthread_cond_signal(_cond).
4928 status = pthread_mutex_unlock(_mutex);
4929 assert_status(status == 0, status, "mutex_unlock");
4930 }
4932 // Note that we signal() _after dropping the lock for "immortal" Events.
4933 // This is safe and avoids a common class of futile wakeups. In rare
4934 // circumstances this can cause a thread to return prematurely from
4935 // cond_{timed}wait() but the spurious wakeup is benign and the victim will
4936 // simply re-test the condition and re-park itself.
4937 }
4940 // JSR166
4941 // -------------------------------------------------------
4943 //
4944 // The solaris and linux implementations of park/unpark are fairly
4945 // conservative for now, but can be improved. They currently use a
4946 // mutex/condvar pair, plus a a count.
4947 // Park decrements count if > 0, else does a condvar wait. Unpark
4948 // sets count to 1 and signals condvar. Only one thread ever waits
4949 // on the condvar. Contention seen when trying to park implies that someone
4950 // is unparking you, so don't wait. And spurious returns are fine, so there
4951 // is no need to track notifications.
4952 //
4954 #define MAX_SECS 100000000
4955 //
4956 // This code is common to linux and solaris and will be moved to a
4957 // common place in dolphin.
4958 //
4959 // The passed in time value is either a relative time in nanoseconds
4960 // or an absolute time in milliseconds. Either way it has to be unpacked
4961 // into suitable seconds and nanoseconds components and stored in the
4962 // given timespec structure.
4963 // Given time is a 64-bit value and the time_t used in the timespec is only
4964 // a signed-32-bit value (except on 64-bit Linux) we have to watch for
4965 // overflow if times way in the future are given. Further on Solaris versions
4966 // prior to 10 there is a restriction (see cond_timedwait) that the specified
4967 // number of seconds, in abstime, is less than current_time + 100,000,000.
4968 // As it will be 28 years before "now + 100000000" will overflow we can
4969 // ignore overflow and just impose a hard-limit on seconds using the value
4970 // of "now + 100,000,000". This places a limit on the timeout of about 3.17
4971 // years from "now".
4972 //
4974 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
4975 assert (time > 0, "convertTime");
4977 struct timeval now;
4978 int status = gettimeofday(&now, NULL);
4979 assert(status == 0, "gettimeofday");
4981 time_t max_secs = now.tv_sec + MAX_SECS;
4983 if (isAbsolute) {
4984 jlong secs = time / 1000;
4985 if (secs > max_secs) {
4986 absTime->tv_sec = max_secs;
4987 }
4988 else {
4989 absTime->tv_sec = secs;
4990 }
4991 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
4992 }
4993 else {
4994 jlong secs = time / NANOSECS_PER_SEC;
4995 if (secs >= MAX_SECS) {
4996 absTime->tv_sec = max_secs;
4997 absTime->tv_nsec = 0;
4998 }
4999 else {
5000 absTime->tv_sec = now.tv_sec + secs;
5001 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
5002 if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
5003 absTime->tv_nsec -= NANOSECS_PER_SEC;
5004 ++absTime->tv_sec; // note: this must be <= max_secs
5005 }
5006 }
5007 }
5008 assert(absTime->tv_sec >= 0, "tv_sec < 0");
5009 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
5010 assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
5011 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
5012 }
5014 void Parker::park(bool isAbsolute, jlong time) {
5015 // Optional fast-path check:
5016 // Return immediately if a permit is available.
5017 if (_counter > 0) {
5018 _counter = 0;
5019 OrderAccess::fence();
5020 return;
5021 }
5023 Thread* thread = Thread::current();
5024 assert(thread->is_Java_thread(), "Must be JavaThread");
5025 JavaThread *jt = (JavaThread *)thread;
5027 // Optional optimization -- avoid state transitions if there's an interrupt pending.
5028 // Check interrupt before trying to wait
5029 if (Thread::is_interrupted(thread, false)) {
5030 return;
5031 }
5033 // Next, demultiplex/decode time arguments
5034 timespec absTime;
5035 if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
5036 return;
5037 }
5038 if (time > 0) {
5039 unpackTime(&absTime, isAbsolute, time);
5040 }
5042 // Enter safepoint region
5043 // Beware of deadlocks such as 6317397.
5044 // The per-thread Parker:: mutex is a classic leaf-lock.
5045 // In particular a thread must never block on the Threads_lock while
5046 // holding the Parker:: mutex. If safepoints are pending both the
5047 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
5048 ThreadBlockInVM tbivm(jt);
5050 // Don't wait if cannot get lock since interference arises from
5051 // unblocking. Also. check interrupt before trying wait
5052 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
5053 return;
5054 }
5056 int status;
5057 if (_counter > 0) { // no wait needed
5058 _counter = 0;
5059 status = pthread_mutex_unlock(_mutex);
5060 assert (status == 0, "invariant");
5061 OrderAccess::fence();
5062 return;
5063 }
5065 #ifdef ASSERT
5066 // Don't catch signals while blocked; let the running threads have the signals.
5067 // (This allows a debugger to break into the running thread.)
5068 sigset_t oldsigs;
5069 sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals();
5070 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
5071 #endif
5073 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
5074 jt->set_suspend_equivalent();
5075 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
5077 if (time == 0) {
5078 status = pthread_cond_wait (_cond, _mutex);
5079 } else {
5080 status = pthread_cond_timedwait (_cond, _mutex, &absTime);
5081 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
5082 pthread_cond_destroy (_cond);
5083 pthread_cond_init (_cond, NULL);
5084 }
5085 }
5086 assert_status(status == 0 || status == EINTR ||
5087 status == ETIME || status == ETIMEDOUT,
5088 status, "cond_timedwait");
5090 #ifdef ASSERT
5091 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
5092 #endif
5094 _counter = 0;
5095 status = pthread_mutex_unlock(_mutex);
5096 assert_status(status == 0, status, "invariant");
5097 // If externally suspended while waiting, re-suspend
5098 if (jt->handle_special_suspend_equivalent_condition()) {
5099 jt->java_suspend_self();
5100 }
5102 OrderAccess::fence();
5103 }
5105 void Parker::unpark() {
5106 int s, status;
5107 status = pthread_mutex_lock(_mutex);
5108 assert (status == 0, "invariant");
5109 s = _counter;
5110 _counter = 1;
5111 if (s < 1) {
5112 if (WorkAroundNPTLTimedWaitHang) {
5113 status = pthread_cond_signal (_cond);
5114 assert (status == 0, "invariant");
5115 status = pthread_mutex_unlock(_mutex);
5116 assert (status == 0, "invariant");
5117 } else {
5118 status = pthread_mutex_unlock(_mutex);
5119 assert (status == 0, "invariant");
5120 status = pthread_cond_signal (_cond);
5121 assert (status == 0, "invariant");
5122 }
5123 } else {
5124 pthread_mutex_unlock(_mutex);
5125 assert (status == 0, "invariant");
5126 }
5127 }
5129 extern char** environ;
5131 // Run the specified command in a separate process. Return its exit value,
5132 // or -1 on failure (e.g. can't fork a new process).
5133 // Unlike system(), this function can be called from signal handler. It
5134 // doesn't block SIGINT et al.
5135 int os::fork_and_exec(char* cmd) {
5136 char * argv[4] = {"sh", "-c", cmd, NULL};
5138 pid_t pid = fork();
5140 if (pid < 0) {
5141 // fork failed
5142 return -1;
5144 } else if (pid == 0) {
5145 // child process
5147 // Try to be consistent with system(), which uses "/usr/bin/sh" on AIX.
5148 execve("/usr/bin/sh", argv, environ);
5150 // execve failed
5151 _exit(-1);
5153 } else {
5154 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
5155 // care about the actual exit code, for now.
5157 int status;
5159 // Wait for the child process to exit. This returns immediately if
5160 // the child has already exited. */
5161 while (waitpid(pid, &status, 0) < 0) {
5162 switch (errno) {
5163 case ECHILD: return 0;
5164 case EINTR: break;
5165 default: return -1;
5166 }
5167 }
5169 if (WIFEXITED(status)) {
5170 // The child exited normally; get its exit code.
5171 return WEXITSTATUS(status);
5172 } else if (WIFSIGNALED(status)) {
5173 // The child exited because of a signal.
5174 // The best value to return is 0x80 + signal number,
5175 // because that is what all Unix shells do, and because
5176 // it allows callers to distinguish between process exit and
5177 // process death by signal.
5178 return 0x80 + WTERMSIG(status);
5179 } else {
5180 // Unknown exit code; pass it through.
5181 return status;
5182 }
5183 }
5184 return -1;
5185 }
5187 // is_headless_jre()
5188 //
5189 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
5190 // in order to report if we are running in a headless jre.
5191 //
5192 // Since JDK8 xawt/libmawt.so is moved into the same directory
5193 // as libawt.so, and renamed libawt_xawt.so
5194 bool os::is_headless_jre() {
5195 struct stat statbuf;
5196 char buf[MAXPATHLEN];
5197 char libmawtpath[MAXPATHLEN];
5198 const char *xawtstr = "/xawt/libmawt.so";
5199 const char *new_xawtstr = "/libawt_xawt.so";
5201 char *p;
5203 // Get path to libjvm.so
5204 os::jvm_path(buf, sizeof(buf));
5206 // Get rid of libjvm.so
5207 p = strrchr(buf, '/');
5208 if (p == NULL) return false;
5209 else *p = '\0';
5211 // Get rid of client or server
5212 p = strrchr(buf, '/');
5213 if (p == NULL) return false;
5214 else *p = '\0';
5216 // check xawt/libmawt.so
5217 strcpy(libmawtpath, buf);
5218 strcat(libmawtpath, xawtstr);
5219 if (::stat(libmawtpath, &statbuf) == 0) return false;
5221 // check libawt_xawt.so
5222 strcpy(libmawtpath, buf);
5223 strcat(libmawtpath, new_xawtstr);
5224 if (::stat(libmawtpath, &statbuf) == 0) return false;
5226 return true;
5227 }
5229 // Get the default path to the core file
5230 // Returns the length of the string
5231 int os::get_core_path(char* buffer, size_t bufferSize) {
5232 const char* p = get_current_directory(buffer, bufferSize);
5234 if (p == NULL) {
5235 assert(p != NULL, "failed to get current directory");
5236 return 0;
5237 }
5239 return strlen(buffer);
5240 }
5242 #ifndef PRODUCT
5243 void TestReserveMemorySpecial_test() {
5244 // No tests available for this platform
5245 }
5246 #endif