src/os/aix/vm/os_aix.cpp

Wed, 31 Jan 2018 19:24:57 -0500

author
dbuck
date
Wed, 31 Jan 2018 19:24:57 -0500
changeset 9289
427b2fb1944f
parent 7824
bbceafdc7a5f
child 9348
cb9634ab2906
permissions
-rw-r--r--

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);
  1023   // initialize signal mask for this thread
  1024   // and save the caller's signal mask
  1025   os::Aix::hotspot_sigmask(thread);
  1027   return true;
  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");
  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);
  1045   delete osthread;
  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;
  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");
  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");
  1070 extern "C" Thread* get_thread() {
  1071   return ThreadLocalStorage::thread();
  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;
  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;
  1089 jlong os::elapsed_frequency() {
  1090   return (1000 * 1000);
  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();
  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);
  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()");
  1137     return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low);
  1141 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
  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;
  1151   info_ptr->kind = JVMTI_TIMER_ELAPSED;    // elapsed not CPU time
  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;
  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;
  1185 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
  1186   return localtime_r(clock, res);
  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();
  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
  1230   ::exit(1);
  1233 // Die immediately, no exit hook, no abort hook, no cleanup.
  1234 void os::die() {
  1235   ::abort();
  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;
  1249   ::strncpy(buf, s, n);
  1250   buf[n] = '\0';
  1251   return n;
  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());
  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;
  1285   return os::stat(filename, &statbuf) == 0;
  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;
  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
  1311       snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
  1312       if (file_exists(buffer)) {
  1313         retval = true;
  1314         break;
  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);
  1323     if (pelements != NULL) {
  1324       FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
  1326   } else {
  1327     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
  1328     retval = true;
  1330   return retval;
  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;
  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;
  1354     } else {
  1355       return false;
  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;
  1384   return NULL;
  1387 bool os::dll_address_to_function_name(address addr, char *buf,
  1388                                       int buflen, int *offset) {
  1389   if (offset) {
  1390     *offset = -1;
  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;
  1402   // Go through Decoder::decode to call getFuncName which reads the name from the traceback table.
  1403   return Decoder::decode(addr, buf, buflen, offset);
  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';
  1415   if (p_errmsg && errmsglen > 0) {
  1416     *p_errmsg = '\0';
  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());
  1424     return 0;
  1427   trcVerbose("pc outside any module");
  1429   return -1;
  1432 bool os::dll_address_to_library_name(address addr, char* buf,
  1433                                      int buflen, int* offset) {
  1434   if (offset) {
  1435     *offset = -1;
  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;
  1447   if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) {
  1448     return true;
  1450   return false;
  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';
  1462   if (!filename || strlen(filename) == 0) {
  1463     ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
  1464     return NULL;
  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);
  1481   return NULL;
  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;
  1494 void* os::get_default_process_handle() {
  1495   return (void*)::dlopen(NULL, RTLD_LAZY);
  1498 void os::print_dll_info(outputStream *st) {
  1499   st->print_cr("Dynamic libraries:");
  1500   LoadedLibraries::print(st);
  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();
  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);
  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();
  1595     st->print_raw(buffer);
  1596   } else {
  1597     st->print_cr("  (no more information available)");
  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();
  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();
  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);
  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;
  1648   // Lazy resolve the path to current module.
  1649   if (saved_jvm_path[0] != 0) {
  1650     strcpy(buf, saved_jvm_path);
  1651     return;
  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);
  1663 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
  1664   // no prefix required, not even "_"
  1667 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
  1668   // no suffix required
  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();
  1690   os::signal_notify(sig);
  1693 void* os::user_handler() {
  1694   return CAST_FROM_FN_PTR(void*, UserHandler);
  1697 extern "C" {
  1698   typedef void (*sa_handler_t)(int);
  1699   typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
  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;
  1731   return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
  1734 void os::signal_raise(int signal_number) {
  1735   ::raise(signal_number);
  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;
  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");
  1763 void os::signal_notify(int sig) {
  1764   Atomic::inc(&pending_signals[sig]);
  1765   ::sem_post(&sig_sem);
  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;
  1777     if (!wait) {
  1778       return -1;
  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();
  1803     } while (threadIsSuspended);
  1807 int os::signal_lookup() {
  1808   return check_pending_signals(false);
  1811 int os::signal_wait() {
  1812   return check_pending_signals(true);
  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;
  1848   bool contains(const AddrRange& range) const {
  1849     return start() <= range.start() && end() >= range.end();
  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);
  1858   bool is_same_range(const AddrRange& range) const {
  1859     return start() == range.start() && size() == range.size();
  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();
  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();
  1872     return AddrRange(from, to - from);
  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");
  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" : "");
  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;
  1926   bool containsAddress(const char* p) const {
  1927     return _range.contains(p);
  1930   bool containsRange(const char* p, size_t size) const {
  1931     return _range.contains(AddrRange((char*)p, size));
  1934   bool isSameRange(const char* p, size_t size) const {
  1935     return _range.is_same_range(AddrRange((char*)p, size));
  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");
  1960   Type getType() {
  1961     return MMAP;
  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;
  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);
  1982     return rc == 0 ? true : false;
  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;
  1991     return true;
  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");
  2007   Type getType() {
  2008     return SHMAT;
  2011   bool disclaim(char* p, size_t size) {
  2013     AddrRange r(p, size);
  2015     if (_pinned) {
  2016       return true;
  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;
  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());
  2034     return rc;
  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;
  2044     return rc;
  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 ++;
  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();
  2081       g_shmbk_stats.nodes --;
  2082       g_shmbk_stats.bytes -= p->size();
  2083       return;
  2085     prev = p;
  2086     p = p->next();
  2088   assert(false, "should not happen");
  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;
  2100     p = p->next();
  2102   return NULL;
  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 ++;
  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();
  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();
  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;
  2157   UNLOCK_SHMBK
  2158 #endif // ASSERT
  2160   return 0;
  2163 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
  2164   return os::Aix::commit_memory_impl(addr, size, exec) == 0;
  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);
  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);
  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;
  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);
  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;
  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);
  2213   return rc;
  2216 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
  2217   return os::guard_memory(addr, size);
  2220 bool os::remove_stack_guard_pages(char* addr, size_t size) {
  2221   return os::unguard_memory(addr, size);
  2224 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
  2227 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
  2230 void os::numa_make_global(char *addr, size_t bytes) {
  2233 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
  2236 bool os::numa_topology_changed() {
  2237   return false;
  2240 size_t os::numa_get_groups_num() {
  2241   return 1;
  2244 int os::numa_get_group_id() {
  2245   return 0;
  2248 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
  2249   if (size > 0) {
  2250     ids[0] = 0;
  2251     return 1;
  2253   return 0;
  2256 bool os::get_page_info(char *start, page_info* info) {
  2257   return false;
  2260 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
  2261   return end;
  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();
  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;
  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;
  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;
  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)
  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;
  2402     } else { // fatal
  2403       addr = NULL;
  2404       warning("shmat failed (errno: %d)", errno);
  2405       goto cleanup_shm;
  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!");
  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)
  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;
  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!");
  2446     shmid = -1;
  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);
  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;
  2465   // sanity test:
  2466   if (requested_addr && addr && wishaddr_or_fail) {
  2467     guarantee(addr == requested_addr, "shmat error");
  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;
  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;
  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);
  2515     addr = NULL;
  2516     goto cleanup_mmap;
  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");
  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);
  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);
  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);
  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;
  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));
  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));
  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;
  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;
  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);
  2615   return rc;
  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;
  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;
  2658   if (!rc) {
  2659     assert(false, "mprotect failed.");
  2661   return rc;
  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();
  2675   // is_committed is unused.
  2676   return checked_mprotect(addr, size, p);
  2679 bool os::guard_memory(char* addr, size_t size) {
  2680   return checked_mprotect(addr, size, PROT_NONE);
  2683 bool os::unguard_memory(char* addr, size_t size) {
  2684   return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
  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;
  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;
  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");
  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;
  2729   if (Verbose) {
  2730     ("Default large page size is 0x%llX.", _large_page_size);
  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;
  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;
  2747 size_t os::large_page_size() {
  2748   return _large_page_size;
  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;
  2757 bool os::can_execute_large_page_memory() {
  2758   // We can do that
  2759   return true;
  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;
  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;
  2789   return addr;
  2792 size_t os::read(int fd, void *buf, unsigned int nBytes) {
  2793   return ::read(fd, buf, nBytes);
  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;
  2809     millis -= limit;
  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;
  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;
  2839       // Stop sleeping if we passed the deadline
  2840       if (newtime >= deadline) {
  2841         return OS_OK;
  2844       prevtime = newtime;
  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();
  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;
  2882       if (millis <= 0) break;
  2884       if (newtime >= deadline) {
  2885         break;
  2888       prevtime = newtime;
  2889       slp->park(millis);
  2891     return OS_OK;
  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;
  2903   else {
  2904     req.tv_nsec = 1;
  2907   nanosleep(&req, NULL);
  2909   return;
  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
  2919 // Used to convert frequent JVM_Yield() to nops
  2920 bool os::dont_yield() {
  2921   return DontYieldALot;
  2924 void os::yield() {
  2925   sched_yield();
  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();
  2937 // Called from the tight loops to possibly influence time-sharing heuristics
  2938 void os::loop_breaker(int attempts) {
  2939   os::yield_all(attempts);
  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, &param);
  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));
  2989   return (ret == 0) ? OS_OK : OS_ERR;
  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;
  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, &param);
  3001   *priority_ptr = param.sched_priority;
  3003   return (ret == 0) ? OS_OK : OS_ERR;
  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);
  3039 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
  3040   osthread->set_ucontext(context);
  3041   osthread->set_siginfo(siginfo);
  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;
  3090     } else if (state == os::SuspendResume::SR_RUNNING) {
  3091       // request was cancelled, continue
  3092     } else {
  3093       ShouldNotReachHere();
  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();
  3105   errno = old_errno;
  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;
  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;
  3140   // Save signal flag
  3141   os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
  3142   return 0;
  3145 static int SR_finalize() {
  3146   return 0;
  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;
  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;
  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;
  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);
  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;
  3210   guarantee(osthread->sr.is_suspended(), "Must be suspended");
  3211   return true;
  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;
  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);
  3230     } else {
  3231       ShouldNotReachHere();
  3235   guarantee(osthread->sr.is_running(), "Must be running!");
  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();
  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();
  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
  3279   return interrupted;
  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;
  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);
  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);
  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);
  3368   if (actp == NULL) {
  3369     // Retrieve the preinstalled signal handler from jvm
  3370     actp = get_preinstalled_handler(sig);
  3373   return actp;
  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);
  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;
  3399     if ((actp->sa_flags & SA_RESETHAND) != 0) {
  3400       actp->sa_handler = SIG_DFL;
  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);
  3414     // restore the signal mask
  3415     pthread_sigmask(SIG_SETMASK, &oset, 0);
  3417   // Tell jvm's signal handler the signal is taken care of.
  3418   return true;
  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);
  3430   return chained;
  3433 struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
  3434   if ((((unsigned int)1 << sig) & sigs) != 0) {
  3435     return &sigact[sig];
  3437   return NULL;
  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;
  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];
  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;
  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));
  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;
  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");
  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");
  3528     if (libjsig_is_loaded) {
  3529       // Tell libjsig jvm is setting signal handlers
  3530       (*begin_signal_setting)();
  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)();
  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;
  3555       if (AllowUserSignalHandlers) {
  3556         tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
  3557         check_signals = false;
  3559       // Need to initialize check_signal_done.
  3560       ::sigemptyset(&check_signal_done);
  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);
  3583   return buf;
  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));
  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);
  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));
  3630   st->cr();
  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);
  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);
  3668   DO_SIGNAL_CHECK(SR_signum);
  3669   DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
  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;
  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;
  3721     break;
  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));
  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);
  3743   // Dump all the signal
  3744   if (sigismember(&check_signal_done, sig)) {
  3745     print_signal_handlers(tty, buf, O_BUFLEN);
  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);
  3757     return buf;
  3758   } else {
  3759     return NULL;
  3763 // To install functions for atexit system call
  3764 extern "C" {
  3765   static void perfMemory_exit_helper() {
  3766     perfMemory_exit();
  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();
  3793   // Reset the perfstat information provided by ODM.
  3794   if (os::Aix::on_aix()) {
  3795     libperfstat::perfstat_reset();
  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");
  3813   } else {
  3814     // initialize os::_page_sizes
  3815     _page_sizes[0] = Aix::page_size();
  3816     _page_sizes[1] = 0;
  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]));
  3827     fprintf(stderr, ")\n");
  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);
  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);
  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;
  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;
  3905       // map failed, continue loop.
  3907   } // end OptimizePollingPageLocation
  3909   if (map_address == (address) MAP_FAILED) {
  3910     map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0);
  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
  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;
  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;
  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");
  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");
  3992   return JNI_OK;
  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");
  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));
  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;
  4016 void os::set_native_thread_name(const char *name) {
  4017   // Not yet implemented.
  4018   return;
  4021 bool os::distribute_processes(uint length, uint* distribution) {
  4022   // Not yet implemented.
  4023   return false;
  4026 bool os::bind_to_processor(uint processor_id) {
  4027   // Not yet implemented.
  4028   return false;
  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());
  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;
  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");
  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();
  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);
  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)");
  4112   return false;
  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);
  4127 void os::print_statistics() {
  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';
  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;
  4155   os::native_path(strcpy(pathbuf, path));
  4156   return ::stat(pathbuf, sbuf);
  4159 bool os::check_heap(bool force) {
  4160   return true;
  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;
  4183   closedir(dir);
  4184   return result;
  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;
  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.
  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;
  4223     } else {
  4224       ::close(fd);
  4225       return -1;
  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
  4251     int flags = ::fcntl(fd, F_GETFD);
  4252     if (flags != -1)
  4253       ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
  4255 #endif
  4257   if (o_delete != 0) {
  4258     ::unlink(path);
  4260   return fd;
  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;
  4269   return ::open64(path, oflags, S_IREAD | S_IWRITE);
  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);
  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);
  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;
  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;
  4310   *bytes = end - cur;
  4311   return 1;
  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;
  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;
  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);
  4340 // Unmap a block of memory.
  4341 bool os::pd_unmap_memory(char* addr, size_t bytes) {
  4342   return munmap(addr, bytes) == 0;
  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;
  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;
  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;
  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;
  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;
  4417   if (p_sys_time) {
  4418     *p_sys_time = sys_time;
  4421   if (p_user_time) {
  4422     *p_user_time = user_time;
  4425   if (error) {
  4426     return false;
  4429   return true;
  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;
  4440   return user_sys_cpu_time ? sys_time + user_time : user_time;
  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
  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
  4457 bool os::is_thread_cpu_time_supported() {
  4458   return true;
  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];
  4486     } else {
  4487       return -1;
  4489     return nelem;
  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());
  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);
  4508   } else {
  4509     jio_fprintf(stderr,
  4510       "Could not open pause file '%s', continuing immediately.\n", filename);
  4514 bool os::is_primordial_thread(void) {
  4515   if (pthread_self() == (pthread_t)1) {
  4516     return true;
  4517   } else {
  4518     return false;
  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);
  4554     } else {
  4555       assert(false, "unknown OS");
  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>");
  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;
  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;
  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();
  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");
  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");
  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());
  4687   if (p_stack_size) {
  4688     (*p_stack_size) = pinfo.__pi_stacksize - os::Aix::stack_page_size();
  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());
  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;
  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;
  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;
  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;
  4798   abstime->tv_nsec = usec * 1000;
  4799   return abstime;
  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;
  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;
  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");
  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");
  4841   guarantee (_Event >= 0, "invariant");
  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;
  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.
  4889   --_nParked;
  4890   if (_Event >= 0) {
  4891      ret = OS_OK;
  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;
  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;
  4913     if (Atomic::cmpxchg (v+1, &_Event, v) == v) break;
  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");
  4927     // Mutex should be locked for pthread_cond_signal(_cond).
  4928     status = pthread_mutex_unlock(_mutex);
  4929     assert_status(status == 0, status, "mutex_unlock");
  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.
  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;
  4988     else {
  4989       absTime->tv_sec = secs;
  4991     absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
  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;
  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
  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");
  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;
  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;
  5033   // Next, demultiplex/decode time arguments
  5034   timespec absTime;
  5035   if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
  5036     return;
  5038   if (time > 0) {
  5039     unpackTime(&absTime, isAbsolute, time);
  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;
  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;
  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);
  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();
  5102   OrderAccess::fence();
  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");
  5123   } else {
  5124     pthread_mutex_unlock(_mutex);
  5125     assert (status == 0, "invariant");
  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;
  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;
  5184   return -1;
  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;
  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;
  5239   return strlen(buffer);
  5242 #ifndef PRODUCT
  5243 void TestReserveMemorySpecial_test() {
  5244   // No tests available for this platform
  5246 #endif

mercurial