src/os/aix/vm/os_aix.cpp

Thu, 20 Mar 2014 11:03:06 +0100

author
goetz
date
Thu, 20 Mar 2014 11:03:06 +0100
changeset 6515
71a71b0bc844
parent 6514
9200402b42d5
child 6519
941427282eae
permissions
-rw-r--r--

8037915: PPC64/AIX: Several smaller fixes
Reviewed-by: kvn

     1 /*
     2  * Copyright (c) 1999, 2013, 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/osThread.hpp"
    59 #include "runtime/perfMemory.hpp"
    60 #include "runtime/sharedRuntime.hpp"
    61 #include "runtime/statSampler.hpp"
    62 #include "runtime/stubRoutines.hpp"
    63 #include "runtime/threadCritical.hpp"
    64 #include "runtime/thread.inline.hpp"
    65 #include "runtime/timer.hpp"
    66 #include "services/attachListener.hpp"
    67 #include "services/runtimeService.hpp"
    68 #include "utilities/decoder.hpp"
    69 #include "utilities/defaultStream.hpp"
    70 #include "utilities/events.hpp"
    71 #include "utilities/growableArray.hpp"
    72 #include "utilities/vmError.hpp"
    73 #ifdef TARGET_ARCH_ppc
    74 # include "assembler_ppc.inline.hpp"
    75 # include "nativeInst_ppc.hpp"
    76 #endif
    77 #ifdef COMPILER1
    78 #include "c1/c1_Runtime1.hpp"
    79 #endif
    80 #ifdef COMPILER2
    81 #include "opto/runtime.hpp"
    82 #endif
    84 // put OS-includes here (sorted alphabetically)
    85 #include <errno.h>
    86 #include <fcntl.h>
    87 #include <inttypes.h>
    88 #include <poll.h>
    89 #include <procinfo.h>
    90 #include <pthread.h>
    91 #include <pwd.h>
    92 #include <semaphore.h>
    93 #include <signal.h>
    94 #include <stdint.h>
    95 #include <stdio.h>
    96 #include <string.h>
    97 #include <unistd.h>
    98 #include <sys/ioctl.h>
    99 #include <sys/ipc.h>
   100 #include <sys/mman.h>
   101 #include <sys/resource.h>
   102 #include <sys/select.h>
   103 #include <sys/shm.h>
   104 #include <sys/socket.h>
   105 #include <sys/stat.h>
   106 #include <sys/sysinfo.h>
   107 #include <sys/systemcfg.h>
   108 #include <sys/time.h>
   109 #include <sys/times.h>
   110 #include <sys/types.h>
   111 #include <sys/utsname.h>
   112 #include <sys/vminfo.h>
   113 #include <sys/wait.h>
   115 // Add missing declarations (should be in procinfo.h but isn't until AIX 6.1).
   116 #if !defined(_AIXVERSION_610)
   117 extern "C" {
   118   int getthrds64(pid_t ProcessIdentifier,
   119                  struct thrdentry64* ThreadBuffer,
   120                  int ThreadSize,
   121                  tid64_t* IndexPointer,
   122                  int Count);
   123 }
   124 #endif
   126 // Excerpts from systemcfg.h definitions newer than AIX 5.3
   127 #ifndef PV_7
   128 # define PV_7 0x200000          // Power PC 7
   129 # define PV_7_Compat 0x208000   // Power PC 7
   130 #endif
   132 #define MAX_PATH (2 * K)
   134 // for timer info max values which include all bits
   135 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
   136 // for multipage initialization error analysis (in 'g_multipage_error')
   137 #define ERROR_MP_OS_TOO_OLD                          100
   138 #define ERROR_MP_EXTSHM_ACTIVE                       101
   139 #define ERROR_MP_VMGETINFO_FAILED                    102
   140 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103
   142 // the semantics in this file are thus that codeptr_t is a *real code ptr*
   143 // This means that any function taking codeptr_t as arguments will assume
   144 // a real codeptr and won't handle function descriptors (eg getFuncName),
   145 // whereas functions taking address as args will deal with function
   146 // descriptors (eg os::dll_address_to_library_name)
   147 typedef unsigned int* codeptr_t;
   149 // typedefs for stackslots, stack pointers, pointers to op codes
   150 typedef unsigned long stackslot_t;
   151 typedef stackslot_t* stackptr_t;
   153 // query dimensions of the stack of the calling thread
   154 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size);
   156 // function to check a given stack pointer against given stack limits
   157 inline bool is_valid_stackpointer(stackptr_t sp, stackptr_t stack_base, size_t stack_size) {
   158   if (((uintptr_t)sp) & 0x7) {
   159     return false;
   160   }
   161   if (sp > stack_base) {
   162     return false;
   163   }
   164   if (sp < (stackptr_t) ((address)stack_base - stack_size)) {
   165     return false;
   166   }
   167   return true;
   168 }
   170 // returns true if function is a valid codepointer
   171 inline bool is_valid_codepointer(codeptr_t p) {
   172   if (!p) {
   173     return false;
   174   }
   175   if (((uintptr_t)p) & 0x3) {
   176     return false;
   177   }
   178   if (LoadedLibraries::find_for_text_address((address)p) == NULL) {
   179     return false;
   180   }
   181   return true;
   182 }
   184 // macro to check a given stack pointer against given stack limits and to die if test fails
   185 #define CHECK_STACK_PTR(sp, stack_base, stack_size) { \
   186     guarantee(is_valid_stackpointer((stackptr_t)(sp), (stackptr_t)(stack_base), stack_size), "Stack Pointer Invalid"); \
   187 }
   189 // macro to check the current stack pointer against given stacklimits
   190 #define CHECK_CURRENT_STACK_PTR(stack_base, stack_size) { \
   191   address sp; \
   192   sp = os::current_stack_pointer(); \
   193   CHECK_STACK_PTR(sp, stack_base, stack_size); \
   194 }
   196 ////////////////////////////////////////////////////////////////////////////////
   197 // global variables (for a description see os_aix.hpp)
   199 julong    os::Aix::_physical_memory = 0;
   200 pthread_t os::Aix::_main_thread = ((pthread_t)0);
   201 int       os::Aix::_page_size = -1;
   202 int       os::Aix::_on_pase = -1;
   203 int       os::Aix::_os_version = -1;
   204 int       os::Aix::_stack_page_size = -1;
   205 size_t    os::Aix::_shm_default_page_size = -1;
   206 int       os::Aix::_can_use_64K_pages = -1;
   207 int       os::Aix::_can_use_16M_pages = -1;
   208 int       os::Aix::_xpg_sus_mode = -1;
   209 int       os::Aix::_extshm = -1;
   210 int       os::Aix::_logical_cpus = -1;
   212 ////////////////////////////////////////////////////////////////////////////////
   213 // local variables
   215 static int      g_multipage_error  = -1;   // error analysis for multipage initialization
   216 static jlong    initial_time_count = 0;
   217 static int      clock_tics_per_sec = 100;
   218 static sigset_t check_signal_done;         // For diagnostics to print a message once (see run_periodic_checks)
   219 static bool     check_signals      = true;
   220 static pid_t    _initial_pid       = 0;
   221 static int      SR_signum          = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769)
   222 static sigset_t SR_sigset;
   223 static pthread_mutex_t dl_mutex;           // Used to protect dlsym() calls */
   225 julong os::available_memory() {
   226   return Aix::available_memory();
   227 }
   229 julong os::Aix::available_memory() {
   230   os::Aix::meminfo_t mi;
   231   if (os::Aix::get_meminfo(&mi)) {
   232     return mi.real_free;
   233   } else {
   234     return 0xFFFFFFFFFFFFFFFFLL;
   235   }
   236 }
   238 julong os::physical_memory() {
   239   return Aix::physical_memory();
   240 }
   242 ////////////////////////////////////////////////////////////////////////////////
   243 // environment support
   245 bool os::getenv(const char* name, char* buf, int len) {
   246   const char* val = ::getenv(name);
   247   if (val != NULL && strlen(val) < (size_t)len) {
   248     strcpy(buf, val);
   249     return true;
   250   }
   251   if (len > 0) buf[0] = 0;  // return a null string
   252   return false;
   253 }
   256 // Return true if user is running as root.
   258 bool os::have_special_privileges() {
   259   static bool init = false;
   260   static bool privileges = false;
   261   if (!init) {
   262     privileges = (getuid() != geteuid()) || (getgid() != getegid());
   263     init = true;
   264   }
   265   return privileges;
   266 }
   268 // Helper function, emulates disclaim64 using multiple 32bit disclaims
   269 // because we cannot use disclaim64() on AS/400 and old AIX releases.
   270 static bool my_disclaim64(char* addr, size_t size) {
   272   if (size == 0) {
   273     return true;
   274   }
   276   // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.)
   277   const unsigned int maxDisclaimSize = 0x80000000;
   279   const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize);
   280   const unsigned int lastDisclaimSize = (size % maxDisclaimSize);
   282   char* p = addr;
   284   for (int i = 0; i < numFullDisclaimsNeeded; i ++) {
   285     if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
   286       //if (Verbose)
   287       fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
   288       return false;
   289     }
   290     p += maxDisclaimSize;
   291   }
   293   if (lastDisclaimSize > 0) {
   294     if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
   295       //if (Verbose)
   296         fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
   297       return false;
   298     }
   299   }
   301   return true;
   302 }
   304 // Cpu architecture string
   305 #if defined(PPC32)
   306 static char cpu_arch[] = "ppc";
   307 #elif defined(PPC64)
   308 static char cpu_arch[] = "ppc64";
   309 #else
   310 #error Add appropriate cpu_arch setting
   311 #endif
   314 // Given an address, returns the size of the page backing that address.
   315 size_t os::Aix::query_pagesize(void* addr) {
   317   vm_page_info pi;
   318   pi.addr = (uint64_t)addr;
   319   if (::vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) {
   320     return pi.pagesize;
   321   } else {
   322     fprintf(stderr, "vmgetinfo failed to retrieve page size for address %p (errno %d).\n", addr, errno);
   323     assert(false, "vmgetinfo failed to retrieve page size");
   324     return SIZE_4K;
   325   }
   327 }
   329 // Returns the kernel thread id of the currently running thread.
   330 pid_t os::Aix::gettid() {
   331   return (pid_t) thread_self();
   332 }
   334 void os::Aix::initialize_system_info() {
   336   // get the number of online(logical) cpus instead of configured
   337   os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN);
   338   assert(_processor_count > 0, "_processor_count must be > 0");
   340   // retrieve total physical storage
   341   os::Aix::meminfo_t mi;
   342   if (!os::Aix::get_meminfo(&mi)) {
   343     fprintf(stderr, "os::Aix::get_meminfo failed.\n"); fflush(stderr);
   344     assert(false, "os::Aix::get_meminfo failed.");
   345   }
   346   _physical_memory = (julong) mi.real_total;
   347 }
   349 // Helper function for tracing page sizes.
   350 static const char* describe_pagesize(size_t pagesize) {
   351   switch (pagesize) {
   352     case SIZE_4K : return "4K";
   353     case SIZE_64K: return "64K";
   354     case SIZE_16M: return "16M";
   355     case SIZE_16G: return "16G";
   356     default:
   357       assert(false, "surprise");
   358       return "??";
   359   }
   360 }
   362 // Retrieve information about multipage size support. Will initialize
   363 // Aix::_page_size, Aix::_stack_page_size, Aix::_can_use_64K_pages,
   364 // Aix::_can_use_16M_pages.
   365 // Must be called before calling os::large_page_init().
   366 void os::Aix::query_multipage_support() {
   368   guarantee(_page_size == -1 &&
   369             _stack_page_size == -1 &&
   370             _can_use_64K_pages == -1 &&
   371             _can_use_16M_pages == -1 &&
   372             g_multipage_error == -1,
   373             "do not call twice");
   375   _page_size = ::sysconf(_SC_PAGESIZE);
   377   // This really would surprise me.
   378   assert(_page_size == SIZE_4K, "surprise!");
   381   // query default data page size (default page size for C-Heap, pthread stacks and .bss).
   382   // Default data page size is influenced either by linker options (-bdatapsize)
   383   // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given,
   384   // default should be 4K.
   385   size_t data_page_size = SIZE_4K;
   386   {
   387     void* p = ::malloc(SIZE_16M);
   388     data_page_size = os::Aix::query_pagesize(p);
   389     ::free(p);
   390   }
   392   // query default shm page size (LDR_CNTRL SHMPSIZE)
   393   {
   394     const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
   395     guarantee(shmid != -1, "shmget failed");
   396     void* p = ::shmat(shmid, NULL, 0);
   397     ::shmctl(shmid, IPC_RMID, NULL);
   398     guarantee(p != (void*) -1, "shmat failed");
   399     _shm_default_page_size = os::Aix::query_pagesize(p);
   400     ::shmdt(p);
   401   }
   403   // before querying the stack page size, make sure we are not running as primordial
   404   // thread (because primordial thread's stack may have different page size than
   405   // pthread thread stacks). Running a VM on the primordial thread won't work for a
   406   // number of reasons so we may just as well guarantee it here
   407   guarantee(!os::Aix::is_primordial_thread(), "Must not be called for primordial thread");
   409   // query stack page size
   410   {
   411     int dummy = 0;
   412     _stack_page_size = os::Aix::query_pagesize(&dummy);
   413     // everything else would surprise me and should be looked into
   414     guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size");
   415     // also, just for completeness: pthread stacks are allocated from C heap, so
   416     // stack page size should be the same as data page size
   417     guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size");
   418   }
   420   // EXTSHM is bad: among other things, it prevents setting pagesize dynamically
   421   // for system V shm.
   422   if (Aix::extshm()) {
   423     if (Verbose) {
   424       fprintf(stderr, "EXTSHM is active - will disable large page support.\n"
   425                       "Please make sure EXTSHM is OFF for large page support.\n");
   426     }
   427     g_multipage_error = ERROR_MP_EXTSHM_ACTIVE;
   428     _can_use_64K_pages = _can_use_16M_pages = 0;
   429     goto query_multipage_support_end;
   430   }
   432   // now check which page sizes the OS claims it supports, and of those, which actually can be used.
   433   {
   434     const int MAX_PAGE_SIZES = 4;
   435     psize_t sizes[MAX_PAGE_SIZES];
   436     const int num_psizes = ::vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES);
   437     if (num_psizes == -1) {
   438       if (Verbose) {
   439         fprintf(stderr, "vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)\n", errno);
   440         fprintf(stderr, "disabling multipage support.\n");
   441       }
   442       g_multipage_error = ERROR_MP_VMGETINFO_FAILED;
   443       _can_use_64K_pages = _can_use_16M_pages = 0;
   444       goto query_multipage_support_end;
   445     }
   446     guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed.");
   447     assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?");
   448     if (Verbose) {
   449       fprintf(stderr, "vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes);
   450       for (int i = 0; i < num_psizes; i ++) {
   451         fprintf(stderr, " %s ", describe_pagesize(sizes[i]));
   452       }
   453       fprintf(stderr, " .\n");
   454     }
   456     // Can we use 64K, 16M pages?
   457     _can_use_64K_pages = 0;
   458     _can_use_16M_pages = 0;
   459     for (int i = 0; i < num_psizes; i ++) {
   460       if (sizes[i] == SIZE_64K) {
   461         _can_use_64K_pages = 1;
   462       } else if (sizes[i] == SIZE_16M) {
   463         _can_use_16M_pages = 1;
   464       }
   465     }
   467     if (!_can_use_64K_pages) {
   468       g_multipage_error = ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K;
   469     }
   471     // Double-check for 16M pages: Even if AIX claims to be able to use 16M pages,
   472     // there must be an actual 16M page pool, and we must run with enough rights.
   473     if (_can_use_16M_pages) {
   474       const int shmid = ::shmget(IPC_PRIVATE, SIZE_16M, IPC_CREAT | S_IRUSR | S_IWUSR);
   475       guarantee(shmid != -1, "shmget failed");
   476       struct shmid_ds shm_buf = { 0 };
   477       shm_buf.shm_pagesize = SIZE_16M;
   478       const bool can_set_pagesize = ::shmctl(shmid, SHM_PAGESIZE, &shm_buf) == 0 ? true : false;
   479       const int en = errno;
   480       ::shmctl(shmid, IPC_RMID, NULL);
   481       if (!can_set_pagesize) {
   482         if (Verbose) {
   483           fprintf(stderr, "Failed to allocate even one misely 16M page. shmctl failed with %d (%s).\n"
   484                           "Will deactivate 16M support.\n", en, strerror(en));
   485         }
   486         _can_use_16M_pages = 0;
   487       }
   488     }
   490   } // end: check which pages can be used for shared memory
   492 query_multipage_support_end:
   494   guarantee(_page_size != -1 &&
   495             _stack_page_size != -1 &&
   496             _can_use_64K_pages != -1 &&
   497             _can_use_16M_pages != -1, "Page sizes not properly initialized");
   499   if (_can_use_64K_pages) {
   500     g_multipage_error = 0;
   501   }
   503   if (Verbose) {
   504     fprintf(stderr, "Data page size (C-Heap, bss, etc): %s\n", describe_pagesize(data_page_size));
   505     fprintf(stderr, "Thread stack page size (pthread): %s\n", describe_pagesize(_stack_page_size));
   506     fprintf(stderr, "Default shared memory page size: %s\n", describe_pagesize(_shm_default_page_size));
   507     fprintf(stderr, "Can use 64K pages dynamically with shared meory: %s\n", (_can_use_64K_pages ? "yes" :"no"));
   508     fprintf(stderr, "Can use 16M pages dynamically with shared memory: %s\n", (_can_use_16M_pages ? "yes" :"no"));
   509     fprintf(stderr, "Multipage error details: %d\n", g_multipage_error);
   510   }
   512 } // end os::Aix::query_multipage_support()
   515 // The code for this method was initially derived from the version in os_linux.cpp
   516 void os::init_system_properties_values() {
   517   // The next few definitions allow the code to be verbatim:
   518 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
   519 #define DEFAULT_LIBPATH "/usr/lib:/lib"
   520 #define EXTENSIONS_DIR  "/lib/ext"
   521 #define ENDORSED_DIR    "/lib/endorsed"
   523   // sysclasspath, java_home, dll_dir
   524   char *home_path;
   525   char *dll_path;
   526   char *pslash;
   527   char buf[MAXPATHLEN];
   528   os::jvm_path(buf, sizeof(buf));
   530   // Found the full path to libjvm.so.
   531   // Now cut the path to <java_home>/jre if we can.
   532   *(strrchr(buf, '/')) = '\0'; // get rid of /libjvm.so
   533   pslash = strrchr(buf, '/');
   534   if (pslash != NULL) {
   535     *pslash = '\0';            // get rid of /{client|server|hotspot}
   536   }
   538   dll_path = malloc(strlen(buf) + 1);
   539   strcpy(dll_path, buf);
   540   Arguments::set_dll_dir(dll_path);
   542   if (pslash != NULL) {
   543     pslash = strrchr(buf, '/');
   544     if (pslash != NULL) {
   545       *pslash = '\0';          // get rid of /<arch>
   546       pslash = strrchr(buf, '/');
   547       if (pslash != NULL) {
   548         *pslash = '\0';        // get rid of /lib
   549       }
   550     }
   551   }
   553   home_path = malloc(strlen(buf) + 1);
   554   strcpy(home_path, buf);
   555   Arguments::set_java_home(home_path);
   557   if (!set_boot_path('/', ':')) return;
   559   // Where to look for native libraries
   561   // On Aix we get the user setting of LIBPATH
   562   // Eventually, all the library path setting will be done here.
   563   char *ld_library_path;
   565   // Construct the invariant part of ld_library_path.
   566   ld_library_path = (char *) malloc(sizeof(DEFAULT_LIBPATH));
   567   sprintf(ld_library_path, DEFAULT_LIBPATH);
   569   // Get the user setting of LIBPATH, and prepended it.
   570   char *v = ::getenv("LIBPATH");
   571   if (v == NULL) {
   572     v = "";
   573   }
   575   char *t = ld_library_path;
   576   // That's +1 for the colon and +1 for the trailing '\0'
   577   ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
   578   sprintf(ld_library_path, "%s:%s", v, t);
   580   Arguments::set_library_path(ld_library_path);
   582   // Extensions directories
   583   char* cbuf = malloc(strlen(Arguments::get_java_home()) + sizeof(EXTENSIONS_DIR));
   584   sprintf(cbuf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
   585   Arguments::set_ext_dirs(cbuf);
   587   // Endorsed standards default directory.
   588   cbuf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
   589   sprintf(cbuf, "%s" ENDORSED_DIR, Arguments::get_java_home());
   590   Arguments::set_endorsed_dirs(cbuf);
   592 #undef malloc
   593 #undef DEFAULT_LIBPATH
   594 #undef EXTENSIONS_DIR
   595 #undef ENDORSED_DIR
   596 }
   598 ////////////////////////////////////////////////////////////////////////////////
   599 // breakpoint support
   601 void os::breakpoint() {
   602   BREAKPOINT;
   603 }
   605 extern "C" void breakpoint() {
   606   // use debugger to set breakpoint here
   607 }
   609 ////////////////////////////////////////////////////////////////////////////////
   610 // signal support
   612 debug_only(static bool signal_sets_initialized = false);
   613 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
   615 bool os::Aix::is_sig_ignored(int sig) {
   616   struct sigaction oact;
   617   sigaction(sig, (struct sigaction*)NULL, &oact);
   618   void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
   619     : CAST_FROM_FN_PTR(void*, oact.sa_handler);
   620   if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
   621     return true;
   622   else
   623     return false;
   624 }
   626 void os::Aix::signal_sets_init() {
   627   // Should also have an assertion stating we are still single-threaded.
   628   assert(!signal_sets_initialized, "Already initialized");
   629   // Fill in signals that are necessarily unblocked for all threads in
   630   // the VM. Currently, we unblock the following signals:
   631   // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
   632   //                         by -Xrs (=ReduceSignalUsage));
   633   // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
   634   // other threads. The "ReduceSignalUsage" boolean tells us not to alter
   635   // the dispositions or masks wrt these signals.
   636   // Programs embedding the VM that want to use the above signals for their
   637   // own purposes must, at this time, use the "-Xrs" option to prevent
   638   // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
   639   // (See bug 4345157, and other related bugs).
   640   // In reality, though, unblocking these signals is really a nop, since
   641   // these signals are not blocked by default.
   642   sigemptyset(&unblocked_sigs);
   643   sigemptyset(&allowdebug_blocked_sigs);
   644   sigaddset(&unblocked_sigs, SIGILL);
   645   sigaddset(&unblocked_sigs, SIGSEGV);
   646   sigaddset(&unblocked_sigs, SIGBUS);
   647   sigaddset(&unblocked_sigs, SIGFPE);
   648   sigaddset(&unblocked_sigs, SIGTRAP);
   649   sigaddset(&unblocked_sigs, SIGDANGER);
   650   sigaddset(&unblocked_sigs, SR_signum);
   652   if (!ReduceSignalUsage) {
   653    if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
   654      sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
   655      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
   656    }
   657    if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
   658      sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
   659      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
   660    }
   661    if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
   662      sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
   663      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
   664    }
   665   }
   666   // Fill in signals that are blocked by all but the VM thread.
   667   sigemptyset(&vm_sigs);
   668   if (!ReduceSignalUsage)
   669     sigaddset(&vm_sigs, BREAK_SIGNAL);
   670   debug_only(signal_sets_initialized = true);
   671 }
   673 // These are signals that are unblocked while a thread is running Java.
   674 // (For some reason, they get blocked by default.)
   675 sigset_t* os::Aix::unblocked_signals() {
   676   assert(signal_sets_initialized, "Not initialized");
   677   return &unblocked_sigs;
   678 }
   680 // These are the signals that are blocked while a (non-VM) thread is
   681 // running Java. Only the VM thread handles these signals.
   682 sigset_t* os::Aix::vm_signals() {
   683   assert(signal_sets_initialized, "Not initialized");
   684   return &vm_sigs;
   685 }
   687 // These are signals that are blocked during cond_wait to allow debugger in
   688 sigset_t* os::Aix::allowdebug_blocked_signals() {
   689   assert(signal_sets_initialized, "Not initialized");
   690   return &allowdebug_blocked_sigs;
   691 }
   693 void os::Aix::hotspot_sigmask(Thread* thread) {
   695   //Save caller's signal mask before setting VM signal mask
   696   sigset_t caller_sigmask;
   697   pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
   699   OSThread* osthread = thread->osthread();
   700   osthread->set_caller_sigmask(caller_sigmask);
   702   pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL);
   704   if (!ReduceSignalUsage) {
   705     if (thread->is_VM_thread()) {
   706       // Only the VM thread handles BREAK_SIGNAL ...
   707       pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
   708     } else {
   709       // ... all other threads block BREAK_SIGNAL
   710       pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
   711     }
   712   }
   713 }
   715 // retrieve memory information.
   716 // Returns false if something went wrong;
   717 // content of pmi undefined in this case.
   718 bool os::Aix::get_meminfo(meminfo_t* pmi) {
   720   assert(pmi, "get_meminfo: invalid parameter");
   722   memset(pmi, 0, sizeof(meminfo_t));
   724   if (os::Aix::on_pase()) {
   726     Unimplemented();
   727     return false;
   729   } else {
   731     // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics
   732     // See:
   733     // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
   734     //        ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm
   735     // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
   736     //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
   738     perfstat_memory_total_t psmt;
   739     memset (&psmt, '\0', sizeof(psmt));
   740     const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1);
   741     if (rc == -1) {
   742       fprintf(stderr, "perfstat_memory_total() failed (errno=%d)\n", errno);
   743       assert(0, "perfstat_memory_total() failed");
   744       return false;
   745     }
   747     assert(rc == 1, "perfstat_memory_total() - weird return code");
   749     // excerpt from
   750     // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
   751     //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
   752     // The fields of perfstat_memory_total_t:
   753     // u_longlong_t virt_total         Total virtual memory (in 4 KB pages).
   754     // u_longlong_t real_total         Total real memory (in 4 KB pages).
   755     // u_longlong_t real_free          Free real memory (in 4 KB pages).
   756     // u_longlong_t pgsp_total         Total paging space (in 4 KB pages).
   757     // u_longlong_t pgsp_free          Free paging space (in 4 KB pages).
   759     pmi->virt_total = psmt.virt_total * 4096;
   760     pmi->real_total = psmt.real_total * 4096;
   761     pmi->real_free = psmt.real_free * 4096;
   762     pmi->pgsp_total = psmt.pgsp_total * 4096;
   763     pmi->pgsp_free = psmt.pgsp_free * 4096;
   765     return true;
   767   }
   768 } // end os::Aix::get_meminfo
   770 // Retrieve global cpu information.
   771 // Returns false if something went wrong;
   772 // the content of pci is undefined in this case.
   773 bool os::Aix::get_cpuinfo(cpuinfo_t* pci) {
   774   assert(pci, "get_cpuinfo: invalid parameter");
   775   memset(pci, 0, sizeof(cpuinfo_t));
   777   perfstat_cpu_total_t psct;
   778   memset (&psct, '\0', sizeof(psct));
   780   if (-1 == libperfstat::perfstat_cpu_total(NULL, &psct, sizeof(perfstat_cpu_total_t), 1)) {
   781     fprintf(stderr, "perfstat_cpu_total() failed (errno=%d)\n", errno);
   782     assert(0, "perfstat_cpu_total() failed");
   783     return false;
   784   }
   786   // global cpu information
   787   strcpy (pci->description, psct.description);
   788   pci->processorHZ = psct.processorHZ;
   789   pci->ncpus = psct.ncpus;
   790   os::Aix::_logical_cpus = psct.ncpus;
   791   for (int i = 0; i < 3; i++) {
   792     pci->loadavg[i] = (double) psct.loadavg[i] / (1 << SBITS);
   793   }
   795   // get the processor version from _system_configuration
   796   switch (_system_configuration.version) {
   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   default:
   825     strcpy(pci->version, "unknown");
   826   }
   828   return true;
   830 } //end os::Aix::get_cpuinfo
   832 //////////////////////////////////////////////////////////////////////////////
   833 // detecting pthread library
   835 void os::Aix::libpthread_init() {
   836   return;
   837 }
   839 //////////////////////////////////////////////////////////////////////////////
   840 // create new thread
   842 // Thread start routine for all newly created threads
   843 static void *java_start(Thread *thread) {
   845   // find out my own stack dimensions
   846   {
   847     // actually, this should do exactly the same as thread->record_stack_base_and_size...
   848     address base = 0;
   849     size_t size = 0;
   850     query_stack_dimensions(&base, &size);
   851     thread->set_stack_base(base);
   852     thread->set_stack_size(size);
   853   }
   855   // Do some sanity checks.
   856   CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
   858   // Try to randomize the cache line index of hot stack frames.
   859   // This helps when threads of the same stack traces evict each other's
   860   // cache lines. The threads can be either from the same JVM instance, or
   861   // from different JVM instances. The benefit is especially true for
   862   // processors with hyperthreading technology.
   864   static int counter = 0;
   865   int pid = os::current_process_id();
   866   alloca(((pid ^ counter++) & 7) * 128);
   868   ThreadLocalStorage::set_thread(thread);
   870   OSThread* osthread = thread->osthread();
   872   // thread_id is kernel thread id (similar to Solaris LWP id)
   873   osthread->set_thread_id(os::Aix::gettid());
   875   // initialize signal mask for this thread
   876   os::Aix::hotspot_sigmask(thread);
   878   // initialize floating point control register
   879   os::Aix::init_thread_fpu_state();
   881   assert(osthread->get_state() == RUNNABLE, "invalid os thread state");
   883   // call one more level start routine
   884   thread->run();
   886   return 0;
   887 }
   889 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
   891   // We want the whole function to be synchronized.
   892   ThreadCritical cs;
   894   assert(thread->osthread() == NULL, "caller responsible");
   896   // Allocate the OSThread object
   897   OSThread* osthread = new OSThread(NULL, NULL);
   898   if (osthread == NULL) {
   899     return false;
   900   }
   902   // set the correct thread state
   903   osthread->set_thread_type(thr_type);
   905   // Initial state is ALLOCATED but not INITIALIZED
   906   osthread->set_state(ALLOCATED);
   908   thread->set_osthread(osthread);
   910   // init thread attributes
   911   pthread_attr_t attr;
   912   pthread_attr_init(&attr);
   913   guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
   915   // Make sure we run in 1:1 kernel-user-thread mode.
   916   if (os::Aix::on_aix()) {
   917     guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
   918     guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
   919   } // end: aix
   921   // Start in suspended state, and in os::thread_start, wake the thread up.
   922   guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
   924   // calculate stack size if it's not specified by caller
   925   if (os::Aix::supports_variable_stack_size()) {
   926     if (stack_size == 0) {
   927       stack_size = os::Aix::default_stack_size(thr_type);
   929       switch (thr_type) {
   930       case os::java_thread:
   931         // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss.
   932         assert(JavaThread::stack_size_at_create() > 0, "this should be set");
   933         stack_size = JavaThread::stack_size_at_create();
   934         break;
   935       case os::compiler_thread:
   936         if (CompilerThreadStackSize > 0) {
   937           stack_size = (size_t)(CompilerThreadStackSize * K);
   938           break;
   939         } // else fall through:
   940           // use VMThreadStackSize if CompilerThreadStackSize is not defined
   941       case os::vm_thread:
   942       case os::pgc_thread:
   943       case os::cgc_thread:
   944       case os::watcher_thread:
   945         if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
   946         break;
   947       }
   948     }
   950     stack_size = MAX2(stack_size, os::Aix::min_stack_allowed);
   951     pthread_attr_setstacksize(&attr, stack_size);
   952   } //else let thread_create() pick the default value (96 K on AIX)
   954   pthread_t tid;
   955   int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
   957   pthread_attr_destroy(&attr);
   959   if (ret != 0) {
   960     if (PrintMiscellaneous && (Verbose || WizardMode)) {
   961       perror("pthread_create()");
   962     }
   963     // Need to clean up stuff we've allocated so far
   964     thread->set_osthread(NULL);
   965     delete osthread;
   966     return false;
   967   }
   969   // Store pthread info into the OSThread
   970   osthread->set_pthread_id(tid);
   972   return true;
   973 }
   975 /////////////////////////////////////////////////////////////////////////////
   976 // attach existing thread
   978 // bootstrap the main thread
   979 bool os::create_main_thread(JavaThread* thread) {
   980   assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread");
   981   return create_attached_thread(thread);
   982 }
   984 bool os::create_attached_thread(JavaThread* thread) {
   985 #ifdef ASSERT
   986     thread->verify_not_published();
   987 #endif
   989   // Allocate the OSThread object
   990   OSThread* osthread = new OSThread(NULL, NULL);
   992   if (osthread == NULL) {
   993     return false;
   994   }
   996   // Store pthread info into the OSThread
   997   osthread->set_thread_id(os::Aix::gettid());
   998   osthread->set_pthread_id(::pthread_self());
  1000   // initialize floating point control register
  1001   os::Aix::init_thread_fpu_state();
  1003   // some sanity checks
  1004   CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
  1006   // Initial thread state is RUNNABLE
  1007   osthread->set_state(RUNNABLE);
  1009   thread->set_osthread(osthread);
  1011   if (UseNUMA) {
  1012     int lgrp_id = os::numa_get_group_id();
  1013     if (lgrp_id != -1) {
  1014       thread->set_lgrp_id(lgrp_id);
  1018   // initialize signal mask for this thread
  1019   // and save the caller's signal mask
  1020   os::Aix::hotspot_sigmask(thread);
  1022   return true;
  1025 void os::pd_start_thread(Thread* thread) {
  1026   int status = pthread_continue_np(thread->osthread()->pthread_id());
  1027   assert(status == 0, "thr_continue failed");
  1030 // Free OS resources related to the OSThread
  1031 void os::free_thread(OSThread* osthread) {
  1032   assert(osthread != NULL, "osthread not set");
  1034   if (Thread::current()->osthread() == osthread) {
  1035     // Restore caller's signal mask
  1036     sigset_t sigmask = osthread->caller_sigmask();
  1037     pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
  1040   delete osthread;
  1043 //////////////////////////////////////////////////////////////////////////////
  1044 // thread local storage
  1046 int os::allocate_thread_local_storage() {
  1047   pthread_key_t key;
  1048   int rslt = pthread_key_create(&key, NULL);
  1049   assert(rslt == 0, "cannot allocate thread local storage");
  1050   return (int)key;
  1053 // Note: This is currently not used by VM, as we don't destroy TLS key
  1054 // on VM exit.
  1055 void os::free_thread_local_storage(int index) {
  1056   int rslt = pthread_key_delete((pthread_key_t)index);
  1057   assert(rslt == 0, "invalid index");
  1060 void os::thread_local_storage_at_put(int index, void* value) {
  1061   int rslt = pthread_setspecific((pthread_key_t)index, value);
  1062   assert(rslt == 0, "pthread_setspecific failed");
  1065 extern "C" Thread* get_thread() {
  1066   return ThreadLocalStorage::thread();
  1069 ////////////////////////////////////////////////////////////////////////////////
  1070 // time support
  1072 // Time since start-up in seconds to a fine granularity.
  1073 // Used by VMSelfDestructTimer and the MemProfiler.
  1074 double os::elapsedTime() {
  1075   return (double)(os::elapsed_counter()) * 0.000001;
  1078 jlong os::elapsed_counter() {
  1079   timeval time;
  1080   int status = gettimeofday(&time, NULL);
  1081   return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
  1084 jlong os::elapsed_frequency() {
  1085   return (1000 * 1000);
  1088 // For now, we say that linux does not support vtime. I have no idea
  1089 // whether it can actually be made to (DLD, 9/13/05).
  1091 bool os::supports_vtime() { return false; }
  1092 bool os::enable_vtime()   { return false; }
  1093 bool os::vtime_enabled()  { return false; }
  1094 double os::elapsedVTime() {
  1095   // better than nothing, but not much
  1096   return elapsedTime();
  1099 jlong os::javaTimeMillis() {
  1100   timeval time;
  1101   int status = gettimeofday(&time, NULL);
  1102   assert(status != -1, "aix error at gettimeofday()");
  1103   return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
  1106 // We need to manually declare mread_real_time,
  1107 // because IBM didn't provide a prototype in time.h.
  1108 // (they probably only ever tested in C, not C++)
  1109 extern "C"
  1110 int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t);
  1112 jlong os::javaTimeNanos() {
  1113   if (os::Aix::on_pase()) {
  1114     Unimplemented();
  1115     return 0;
  1117   else {
  1118     // On AIX use the precision of processors real time clock
  1119     // or time base registers.
  1120     timebasestruct_t time;
  1121     int rc;
  1123     // If the CPU has a time register, it will be used and
  1124     // we have to convert to real time first. After convertion we have following data:
  1125     // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970]
  1126     // time.tb_low  [nanoseconds after the last full second above]
  1127     // We better use mread_real_time here instead of read_real_time
  1128     // to ensure that we will get a monotonic increasing time.
  1129     if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) {
  1130       rc = time_base_to_time(&time, TIMEBASE_SZ);
  1131       assert(rc != -1, "aix error at time_base_to_time()");
  1133     return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low);
  1137 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
  1139     // gettimeofday - based on time in seconds since the Epoch thus does not wrap
  1140     info_ptr->max_value = ALL_64_BITS;
  1142     // gettimeofday is a real time clock so it skips
  1143     info_ptr->may_skip_backward = true;
  1144     info_ptr->may_skip_forward = true;
  1147   info_ptr->kind = JVMTI_TIMER_ELAPSED;    // elapsed not CPU time
  1150 // Return the real, user, and system times in seconds from an
  1151 // arbitrary fixed point in the past.
  1152 bool os::getTimesSecs(double* process_real_time,
  1153                       double* process_user_time,
  1154                       double* process_system_time) {
  1155   struct tms ticks;
  1156   clock_t real_ticks = times(&ticks);
  1158   if (real_ticks == (clock_t) (-1)) {
  1159     return false;
  1160   } else {
  1161     double ticks_per_second = (double) clock_tics_per_sec;
  1162     *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
  1163     *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
  1164     *process_real_time = ((double) real_ticks) / ticks_per_second;
  1166     return true;
  1171 char * os::local_time_string(char *buf, size_t buflen) {
  1172   struct tm t;
  1173   time_t long_time;
  1174   time(&long_time);
  1175   localtime_r(&long_time, &t);
  1176   jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
  1177                t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
  1178                t.tm_hour, t.tm_min, t.tm_sec);
  1179   return buf;
  1182 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
  1183   return localtime_r(clock, res);
  1186 ////////////////////////////////////////////////////////////////////////////////
  1187 // runtime exit support
  1189 // Note: os::shutdown() might be called very early during initialization, or
  1190 // called from signal handler. Before adding something to os::shutdown(), make
  1191 // sure it is async-safe and can handle partially initialized VM.
  1192 void os::shutdown() {
  1194   // allow PerfMemory to attempt cleanup of any persistent resources
  1195   perfMemory_exit();
  1197   // needs to remove object in file system
  1198   AttachListener::abort();
  1200   // flush buffered output, finish log files
  1201   ostream_abort();
  1203   // Check for abort hook
  1204   abort_hook_t abort_hook = Arguments::abort_hook();
  1205   if (abort_hook != NULL) {
  1206     abort_hook();
  1211 // Note: os::abort() might be called very early during initialization, or
  1212 // called from signal handler. Before adding something to os::abort(), make
  1213 // sure it is async-safe and can handle partially initialized VM.
  1214 void os::abort(bool dump_core) {
  1215   os::shutdown();
  1216   if (dump_core) {
  1217 #ifndef PRODUCT
  1218     fdStream out(defaultStream::output_fd());
  1219     out.print_raw("Current thread is ");
  1220     char buf[16];
  1221     jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
  1222     out.print_raw_cr(buf);
  1223     out.print_raw_cr("Dumping core ...");
  1224 #endif
  1225     ::abort(); // dump core
  1228   ::exit(1);
  1231 // Die immediately, no exit hook, no abort hook, no cleanup.
  1232 void os::die() {
  1233   ::abort();
  1236 // Unused on Aix for now.
  1237 void os::set_error_file(const char *logfile) {}
  1240 // This method is a copy of JDK's sysGetLastErrorString
  1241 // from src/solaris/hpi/src/system_md.c
  1243 size_t os::lasterror(char *buf, size_t len) {
  1245   if (errno == 0)  return 0;
  1247   const char *s = ::strerror(errno);
  1248   size_t n = ::strlen(s);
  1249   if (n >= len) {
  1250     n = len - 1;
  1252   ::strncpy(buf, s, n);
  1253   buf[n] = '\0';
  1254   return n;
  1257 intx os::current_thread_id() { return (intx)pthread_self(); }
  1258 int os::current_process_id() {
  1260   // This implementation returns a unique pid, the pid of the
  1261   // launcher thread that starts the vm 'process'.
  1263   // Under POSIX, getpid() returns the same pid as the
  1264   // launcher thread rather than a unique pid per thread.
  1265   // Use gettid() if you want the old pre NPTL behaviour.
  1267   // if you are looking for the result of a call to getpid() that
  1268   // returns a unique pid for the calling thread, then look at the
  1269   // OSThread::thread_id() method in osThread_linux.hpp file
  1271   return (int)(_initial_pid ? _initial_pid : getpid());
  1274 // DLL functions
  1276 const char* os::dll_file_extension() { return ".so"; }
  1278 // This must be hard coded because it's the system's temporary
  1279 // directory not the java application's temp directory, ala java.io.tmpdir.
  1280 const char* os::get_temp_directory() { return "/tmp"; }
  1282 static bool file_exists(const char* filename) {
  1283   struct stat statbuf;
  1284   if (filename == NULL || strlen(filename) == 0) {
  1285     return false;
  1287   return os::stat(filename, &statbuf) == 0;
  1290 bool os::dll_build_name(char* buffer, size_t buflen,
  1291                         const char* pname, const char* fname) {
  1292   bool retval = false;
  1293   // Copied from libhpi
  1294   const size_t pnamelen = pname ? strlen(pname) : 0;
  1296   // Return error on buffer overflow.
  1297   if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
  1298     *buffer = '\0';
  1299     return retval;
  1302   if (pnamelen == 0) {
  1303     snprintf(buffer, buflen, "lib%s.so", fname);
  1304     retval = true;
  1305   } else if (strchr(pname, *os::path_separator()) != NULL) {
  1306     int n;
  1307     char** pelements = split_path(pname, &n);
  1308     for (int i = 0; i < n; i++) {
  1309       // Really shouldn't be NULL, but check can't hurt
  1310       if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
  1311         continue; // skip the empty path values
  1313       snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
  1314       if (file_exists(buffer)) {
  1315         retval = true;
  1316         break;
  1319     // release the storage
  1320     for (int i = 0; i < n; i++) {
  1321       if (pelements[i] != NULL) {
  1322         FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
  1325     if (pelements != NULL) {
  1326       FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
  1328   } else {
  1329     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
  1330     retval = true;
  1332   return retval;
  1335 // Check if addr is inside libjvm.so.
  1336 bool os::address_is_in_vm(address addr) {
  1338   // Input could be a real pc or a function pointer literal. The latter
  1339   // would be a function descriptor residing in the data segment of a module.
  1341   const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
  1342   if (lib) {
  1343     if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
  1344       return true;
  1345     } else {
  1346       return false;
  1348   } else {
  1349     lib = LoadedLibraries::find_for_data_address(addr);
  1350     if (lib) {
  1351       if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
  1352         return true;
  1353       } else {
  1354         return false;
  1356     } else {
  1357       return false;
  1362 // Resolve an AIX function descriptor literal to a code pointer.
  1363 // If the input is a valid code pointer to a text segment of a loaded module,
  1364 //   it is returned unchanged.
  1365 // If the input is a valid AIX function descriptor, it is resolved to the
  1366 //   code entry point.
  1367 // If the input is neither a valid function descriptor nor a valid code pointer,
  1368 //   NULL is returned.
  1369 static address resolve_function_descriptor_to_code_pointer(address p) {
  1371   const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(p);
  1372   if (lib) {
  1373     // its a real code pointer
  1374     return p;
  1375   } else {
  1376     lib = LoadedLibraries::find_for_data_address(p);
  1377     if (lib) {
  1378       // pointer to data segment, potential function descriptor
  1379       address code_entry = (address)(((FunctionDescriptor*)p)->entry());
  1380       if (LoadedLibraries::find_for_text_address(code_entry)) {
  1381         // Its a function descriptor
  1382         return code_entry;
  1386   return NULL;
  1389 bool os::dll_address_to_function_name(address addr, char *buf,
  1390                                       int buflen, int *offset) {
  1391   if (offset) {
  1392     *offset = -1;
  1394   if (buf) {
  1395     buf[0] = '\0';
  1398   // Resolve function ptr literals first.
  1399   addr = resolve_function_descriptor_to_code_pointer(addr);
  1400   if (!addr) {
  1401     return false;
  1404   // Go through Decoder::decode to call getFuncName which reads the name from the traceback table.
  1405   return Decoder::decode(addr, buf, buflen, offset);
  1408 static int getModuleName(codeptr_t pc,                    // [in] program counter
  1409                          char* p_name, size_t namelen,    // [out] optional: function name
  1410                          char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages
  1411                          ) {
  1413   // initialize output parameters
  1414   if (p_name && namelen > 0) {
  1415     *p_name = '\0';
  1417   if (p_errmsg && errmsglen > 0) {
  1418     *p_errmsg = '\0';
  1421   const LoadedLibraryModule* const lib = LoadedLibraries::find_for_text_address((address)pc);
  1422   if (lib) {
  1423     if (p_name && namelen > 0) {
  1424       sprintf(p_name, "%.*s", namelen, lib->get_shortname());
  1426     return 0;
  1429   if (Verbose) {
  1430     fprintf(stderr, "pc outside any module");
  1433   return -1;
  1437 bool os::dll_address_to_library_name(address addr, char* buf,
  1438                                      int buflen, int* offset) {
  1439   if (offset) {
  1440     *offset = -1;
  1442   if (buf) {
  1443       buf[0] = '\0';
  1446   // Resolve function ptr literals first.
  1447   addr = resolve_function_descriptor_to_code_pointer(addr);
  1448   if (!addr) {
  1449     return false;
  1452   if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) {
  1453     return true;
  1455   return false;
  1458 // Loads .dll/.so and in case of error it checks if .dll/.so was built
  1459 // for the same architecture as Hotspot is running on
  1460 void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
  1462   if (ebuf && ebuflen > 0) {
  1463     ebuf[0] = '\0';
  1464     ebuf[ebuflen - 1] = '\0';
  1467   if (!filename || strlen(filename) == 0) {
  1468     ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
  1469     return NULL;
  1472   // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
  1473   void * result= ::dlopen(filename, RTLD_LAZY);
  1474   if (result != NULL) {
  1475     // Reload dll cache. Don't do this in signal handling.
  1476     LoadedLibraries::reload();
  1477     return result;
  1478   } else {
  1479     // error analysis when dlopen fails
  1480     const char* const error_report = ::dlerror();
  1481     if (error_report && ebuf && ebuflen > 0) {
  1482       snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s",
  1483                filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report);
  1486   return NULL;
  1489 // Glibc-2.0 libdl is not MT safe. If you are building with any glibc,
  1490 // chances are you might want to run the generated bits against glibc-2.0
  1491 // libdl.so, so always use locking for any version of glibc.
  1492 void* os::dll_lookup(void* handle, const char* name) {
  1493   pthread_mutex_lock(&dl_mutex);
  1494   void* res = dlsym(handle, name);
  1495   pthread_mutex_unlock(&dl_mutex);
  1496   return res;
  1499 void* os::get_default_process_handle() {
  1500   return (void*)::dlopen(NULL, RTLD_LAZY);
  1503 void os::print_dll_info(outputStream *st) {
  1504   st->print_cr("Dynamic libraries:");
  1505   LoadedLibraries::print(st);
  1508 void os::print_os_info(outputStream* st) {
  1509   st->print("OS:");
  1511   st->print("uname:");
  1512   struct utsname name;
  1513   uname(&name);
  1514   st->print(name.sysname); st->print(" ");
  1515   st->print(name.nodename); st->print(" ");
  1516   st->print(name.release); st->print(" ");
  1517   st->print(name.version); st->print(" ");
  1518   st->print(name.machine);
  1519   st->cr();
  1521   // rlimit
  1522   st->print("rlimit:");
  1523   struct rlimit rlim;
  1525   st->print(" STACK ");
  1526   getrlimit(RLIMIT_STACK, &rlim);
  1527   if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
  1528   else st->print("%uk", rlim.rlim_cur >> 10);
  1530   st->print(", CORE ");
  1531   getrlimit(RLIMIT_CORE, &rlim);
  1532   if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
  1533   else st->print("%uk", rlim.rlim_cur >> 10);
  1535   st->print(", NPROC ");
  1536   st->print("%d", sysconf(_SC_CHILD_MAX));
  1538   st->print(", NOFILE ");
  1539   getrlimit(RLIMIT_NOFILE, &rlim);
  1540   if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
  1541   else st->print("%d", rlim.rlim_cur);
  1543   st->print(", AS ");
  1544   getrlimit(RLIMIT_AS, &rlim);
  1545   if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
  1546   else st->print("%uk", rlim.rlim_cur >> 10);
  1548   // Print limits on DATA, because it limits the C-heap.
  1549   st->print(", DATA ");
  1550   getrlimit(RLIMIT_DATA, &rlim);
  1551   if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
  1552   else st->print("%uk", rlim.rlim_cur >> 10);
  1553   st->cr();
  1555   // load average
  1556   st->print("load average:");
  1557   double loadavg[3] = {-1.L, -1.L, -1.L};
  1558   os::loadavg(loadavg, 3);
  1559   st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
  1560   st->cr();
  1563 void os::print_memory_info(outputStream* st) {
  1565   st->print_cr("Memory:");
  1567   st->print_cr("  default page size: %s", describe_pagesize(os::vm_page_size()));
  1568   st->print_cr("  default stack page size: %s", describe_pagesize(os::vm_page_size()));
  1569   st->print_cr("  default shm page size: %s", describe_pagesize(os::Aix::shm_default_page_size()));
  1570   st->print_cr("  can use 64K pages dynamically: %s", (os::Aix::can_use_64K_pages() ? "yes" :"no"));
  1571   st->print_cr("  can use 16M pages dynamically: %s", (os::Aix::can_use_16M_pages() ? "yes" :"no"));
  1572   if (g_multipage_error != 0) {
  1573     st->print_cr("  multipage error: %d", g_multipage_error);
  1576   // print out LDR_CNTRL because it affects the default page sizes
  1577   const char* const ldr_cntrl = ::getenv("LDR_CNTRL");
  1578   st->print_cr("  LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>");
  1580   const char* const extshm = ::getenv("EXTSHM");
  1581   st->print_cr("  EXTSHM=%s.", extshm ? extshm : "<unset>");
  1583   // Call os::Aix::get_meminfo() to retrieve memory statistics.
  1584   os::Aix::meminfo_t mi;
  1585   if (os::Aix::get_meminfo(&mi)) {
  1586     char buffer[256];
  1587     if (os::Aix::on_aix()) {
  1588       jio_snprintf(buffer, sizeof(buffer),
  1589                    "  physical total : %llu\n"
  1590                    "  physical free  : %llu\n"
  1591                    "  swap total     : %llu\n"
  1592                    "  swap free      : %llu\n",
  1593                    mi.real_total,
  1594                    mi.real_free,
  1595                    mi.pgsp_total,
  1596                    mi.pgsp_free);
  1597     } else {
  1598       Unimplemented();
  1600     st->print_raw(buffer);
  1601   } else {
  1602     st->print_cr("  (no more information available)");
  1606 void os::pd_print_cpu_info(outputStream* st) {
  1607   // cpu
  1608   st->print("CPU:");
  1609   st->print("total %d", os::processor_count());
  1610   // It's not safe to query number of active processors after crash
  1611   // st->print("(active %d)", os::active_processor_count());
  1612   st->print(" %s", VM_Version::cpu_features());
  1613   st->cr();
  1616 void os::print_siginfo(outputStream* st, void* siginfo) {
  1617   // Use common posix version.
  1618   os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo);
  1619   st->cr();
  1623 static void print_signal_handler(outputStream* st, int sig,
  1624                                  char* buf, size_t buflen);
  1626 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
  1627   st->print_cr("Signal Handlers:");
  1628   print_signal_handler(st, SIGSEGV, buf, buflen);
  1629   print_signal_handler(st, SIGBUS , buf, buflen);
  1630   print_signal_handler(st, SIGFPE , buf, buflen);
  1631   print_signal_handler(st, SIGPIPE, buf, buflen);
  1632   print_signal_handler(st, SIGXFSZ, buf, buflen);
  1633   print_signal_handler(st, SIGILL , buf, buflen);
  1634   print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
  1635   print_signal_handler(st, SR_signum, buf, buflen);
  1636   print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
  1637   print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
  1638   print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
  1639   print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
  1640   print_signal_handler(st, SIGTRAP, buf, buflen);
  1641   print_signal_handler(st, SIGDANGER, buf, buflen);
  1644 static char saved_jvm_path[MAXPATHLEN] = {0};
  1646 // Find the full path to the current module, libjvm.so or libjvm_g.so
  1647 void os::jvm_path(char *buf, jint buflen) {
  1648   // Error checking.
  1649   if (buflen < MAXPATHLEN) {
  1650     assert(false, "must use a large-enough buffer");
  1651     buf[0] = '\0';
  1652     return;
  1654   // Lazy resolve the path to current module.
  1655   if (saved_jvm_path[0] != 0) {
  1656     strcpy(buf, saved_jvm_path);
  1657     return;
  1660   Dl_info dlinfo;
  1661   int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
  1662   assert(ret != 0, "cannot locate libjvm");
  1663   char* rp = realpath((char *)dlinfo.dli_fname, buf);
  1664   assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?");
  1666   strcpy(saved_jvm_path, buf);
  1669 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
  1670   // no prefix required, not even "_"
  1673 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
  1674   // no suffix required
  1677 ////////////////////////////////////////////////////////////////////////////////
  1678 // sun.misc.Signal support
  1680 static volatile jint sigint_count = 0;
  1682 static void
  1683 UserHandler(int sig, void *siginfo, void *context) {
  1684   // 4511530 - sem_post is serialized and handled by the manager thread. When
  1685   // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
  1686   // don't want to flood the manager thread with sem_post requests.
  1687   if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
  1688     return;
  1690   // Ctrl-C is pressed during error reporting, likely because the error
  1691   // handler fails to abort. Let VM die immediately.
  1692   if (sig == SIGINT && is_error_reported()) {
  1693     os::die();
  1696   os::signal_notify(sig);
  1699 void* os::user_handler() {
  1700   return CAST_FROM_FN_PTR(void*, UserHandler);
  1703 extern "C" {
  1704   typedef void (*sa_handler_t)(int);
  1705   typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
  1708 void* os::signal(int signal_number, void* handler) {
  1709   struct sigaction sigAct, oldSigAct;
  1711   sigfillset(&(sigAct.sa_mask));
  1713   // Do not block out synchronous signals in the signal handler.
  1714   // Blocking synchronous signals only makes sense if you can really
  1715   // be sure that those signals won't happen during signal handling,
  1716   // when the blocking applies.  Normal signal handlers are lean and
  1717   // do not cause signals. But our signal handlers tend to be "risky"
  1718   // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen.
  1719   // On AIX, PASE there was a case where a SIGSEGV happened, followed
  1720   // by a SIGILL, which was blocked due to the signal mask. The process
  1721   // just hung forever. Better to crash from a secondary signal than to hang.
  1722   sigdelset(&(sigAct.sa_mask), SIGSEGV);
  1723   sigdelset(&(sigAct.sa_mask), SIGBUS);
  1724   sigdelset(&(sigAct.sa_mask), SIGILL);
  1725   sigdelset(&(sigAct.sa_mask), SIGFPE);
  1726   sigdelset(&(sigAct.sa_mask), SIGTRAP);
  1728   sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
  1730   sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
  1732   if (sigaction(signal_number, &sigAct, &oldSigAct)) {
  1733     // -1 means registration failed
  1734     return (void *)-1;
  1737   return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
  1740 void os::signal_raise(int signal_number) {
  1741   ::raise(signal_number);
  1744 //
  1745 // The following code is moved from os.cpp for making this
  1746 // code platform specific, which it is by its very nature.
  1747 //
  1749 // Will be modified when max signal is changed to be dynamic
  1750 int os::sigexitnum_pd() {
  1751   return NSIG;
  1754 // a counter for each possible signal value
  1755 static volatile jint pending_signals[NSIG+1] = { 0 };
  1757 // Linux(POSIX) specific hand shaking semaphore.
  1758 static sem_t sig_sem;
  1760 void os::signal_init_pd() {
  1761   // Initialize signal structures
  1762   ::memset((void*)pending_signals, 0, sizeof(pending_signals));
  1764   // Initialize signal semaphore
  1765   int rc = ::sem_init(&sig_sem, 0, 0);
  1766   guarantee(rc != -1, "sem_init failed");
  1769 void os::signal_notify(int sig) {
  1770   Atomic::inc(&pending_signals[sig]);
  1771   ::sem_post(&sig_sem);
  1774 static int check_pending_signals(bool wait) {
  1775   Atomic::store(0, &sigint_count);
  1776   for (;;) {
  1777     for (int i = 0; i < NSIG + 1; i++) {
  1778       jint n = pending_signals[i];
  1779       if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
  1780         return i;
  1783     if (!wait) {
  1784       return -1;
  1786     JavaThread *thread = JavaThread::current();
  1787     ThreadBlockInVM tbivm(thread);
  1789     bool threadIsSuspended;
  1790     do {
  1791       thread->set_suspend_equivalent();
  1792       // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
  1794       ::sem_wait(&sig_sem);
  1796       // were we externally suspended while we were waiting?
  1797       threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
  1798       if (threadIsSuspended) {
  1799         //
  1800         // The semaphore has been incremented, but while we were waiting
  1801         // another thread suspended us. We don't want to continue running
  1802         // while suspended because that would surprise the thread that
  1803         // suspended us.
  1804         //
  1805         ::sem_post(&sig_sem);
  1807         thread->java_suspend_self();
  1809     } while (threadIsSuspended);
  1813 int os::signal_lookup() {
  1814   return check_pending_signals(false);
  1817 int os::signal_wait() {
  1818   return check_pending_signals(true);
  1821 ////////////////////////////////////////////////////////////////////////////////
  1822 // Virtual Memory
  1824 // AddrRange describes an immutable address range
  1825 //
  1826 // This is a helper class for the 'shared memory bookkeeping' below.
  1827 class AddrRange {
  1828   friend class ShmBkBlock;
  1830   char* _start;
  1831   size_t _size;
  1833 public:
  1835   AddrRange(char* start, size_t size)
  1836     : _start(start), _size(size)
  1837   {}
  1839   AddrRange(const AddrRange& r)
  1840     : _start(r.start()), _size(r.size())
  1841   {}
  1843   char* start() const { return _start; }
  1844   size_t size() const { return _size; }
  1845   char* end() const { return _start + _size; }
  1846   bool is_empty() const { return _size == 0 ? true : false; }
  1848   static AddrRange empty_range() { return AddrRange(NULL, 0); }
  1850   bool contains(const char* p) const {
  1851     return start() <= p && end() > p;
  1854   bool contains(const AddrRange& range) const {
  1855     return start() <= range.start() && end() >= range.end();
  1858   bool intersects(const AddrRange& range) const {
  1859     return (range.start() <= start() && range.end() > start()) ||
  1860            (range.start() < end() && range.end() >= end()) ||
  1861            contains(range);
  1864   bool is_same_range(const AddrRange& range) const {
  1865     return start() == range.start() && size() == range.size();
  1868   // return the closest inside range consisting of whole pages
  1869   AddrRange find_closest_aligned_range(size_t pagesize) const {
  1870     if (pagesize == 0 || is_empty()) {
  1871       return empty_range();
  1873     char* const from = (char*)align_size_up((intptr_t)_start, pagesize);
  1874     char* const to = (char*)align_size_down((intptr_t)end(), pagesize);
  1875     if (from > to) {
  1876       return empty_range();
  1878     return AddrRange(from, to - from);
  1880 };
  1882 ////////////////////////////////////////////////////////////////////////////
  1883 // shared memory bookkeeping
  1884 //
  1885 // the os::reserve_memory() API and friends hand out different kind of memory, depending
  1886 // on need and circumstances. Memory may be allocated with mmap() or with shmget/shmat.
  1887 //
  1888 // But these memory types have to be treated differently. For example, to uncommit
  1889 // mmap-based memory, msync(MS_INVALIDATE) is needed, to uncommit shmat-based memory,
  1890 // disclaim64() is needed.
  1891 //
  1892 // Therefore we need to keep track of the allocated memory segments and their
  1893 // properties.
  1895 // ShmBkBlock: base class for all blocks in the shared memory bookkeeping
  1896 class ShmBkBlock {
  1898   ShmBkBlock* _next;
  1900 protected:
  1902   AddrRange _range;
  1903   const size_t _pagesize;
  1904   const bool _pinned;
  1906 public:
  1908   ShmBkBlock(AddrRange range, size_t pagesize, bool pinned)
  1909     : _range(range), _pagesize(pagesize), _pinned(pinned) , _next(NULL) {
  1911     assert(_pagesize == SIZE_4K || _pagesize == SIZE_64K || _pagesize == SIZE_16M, "invalid page size");
  1912     assert(!_range.is_empty(), "invalid range");
  1915   virtual void print(outputStream* st) const {
  1916     st->print("0x%p ... 0x%p (%llu) - %d %s pages - %s",
  1917               _range.start(), _range.end(), _range.size(),
  1918               _range.size() / _pagesize, describe_pagesize(_pagesize),
  1919               _pinned ? "pinned" : "");
  1922   enum Type { MMAP, SHMAT };
  1923   virtual Type getType() = 0;
  1925   char* base() const { return _range.start(); }
  1926   size_t size() const { return _range.size(); }
  1928   void setAddrRange(AddrRange range) {
  1929     _range = range;
  1932   bool containsAddress(const char* p) const {
  1933     return _range.contains(p);
  1936   bool containsRange(const char* p, size_t size) const {
  1937     return _range.contains(AddrRange((char*)p, size));
  1940   bool isSameRange(const char* p, size_t size) const {
  1941     return _range.is_same_range(AddrRange((char*)p, size));
  1944   virtual bool disclaim(char* p, size_t size) = 0;
  1945   virtual bool release() = 0;
  1947   // blocks live in a list.
  1948   ShmBkBlock* next() const { return _next; }
  1949   void set_next(ShmBkBlock* blk) { _next = blk; }
  1951 }; // end: ShmBkBlock
  1954 // ShmBkMappedBlock: describes an block allocated with mmap()
  1955 class ShmBkMappedBlock : public ShmBkBlock {
  1956 public:
  1958   ShmBkMappedBlock(AddrRange range)
  1959     : ShmBkBlock(range, SIZE_4K, false) {} // mmap: always 4K, never pinned
  1961   void print(outputStream* st) const {
  1962     ShmBkBlock::print(st);
  1963     st->print_cr(" - mmap'ed");
  1966   Type getType() {
  1967     return MMAP;
  1970   bool disclaim(char* p, size_t size) {
  1972     AddrRange r(p, size);
  1974     guarantee(_range.contains(r), "invalid disclaim");
  1976     // only disclaim whole ranges.
  1977     const AddrRange r2 = r.find_closest_aligned_range(_pagesize);
  1978     if (r2.is_empty()) {
  1979       return true;
  1982     const int rc = ::msync(r2.start(), r2.size(), MS_INVALIDATE);
  1984     if (rc != 0) {
  1985       warning("msync(0x%p, %llu, MS_INVALIDATE) failed (%d)\n", r2.start(), r2.size(), errno);
  1988     return rc == 0 ? true : false;
  1991   bool release() {
  1992     // mmap'ed blocks are released using munmap
  1993     if (::munmap(_range.start(), _range.size()) != 0) {
  1994       warning("munmap(0x%p, %llu) failed (%d)\n", _range.start(), _range.size(), errno);
  1995       return false;
  1997     return true;
  1999 }; // end: ShmBkMappedBlock
  2001 // ShmBkShmatedBlock: describes an block allocated with shmget/shmat()
  2002 class ShmBkShmatedBlock : public ShmBkBlock {
  2003 public:
  2005   ShmBkShmatedBlock(AddrRange range, size_t pagesize, bool pinned)
  2006     : ShmBkBlock(range, pagesize, pinned) {}
  2008   void print(outputStream* st) const {
  2009     ShmBkBlock::print(st);
  2010     st->print_cr(" - shmat'ed");
  2013   Type getType() {
  2014     return SHMAT;
  2017   bool disclaim(char* p, size_t size) {
  2019     AddrRange r(p, size);
  2021     if (_pinned) {
  2022       return true;
  2025     // shmat'ed blocks are disclaimed using disclaim64
  2026     guarantee(_range.contains(r), "invalid disclaim");
  2028     // only disclaim whole ranges.
  2029     const AddrRange r2 = r.find_closest_aligned_range(_pagesize);
  2030     if (r2.is_empty()) {
  2031       return true;
  2034     const bool rc = my_disclaim64(r2.start(), r2.size());
  2036     if (Verbose && !rc) {
  2037       warning("failed to disclaim shm %p-%p\n", r2.start(), r2.end());
  2040     return rc;
  2043   bool release() {
  2044     bool rc = false;
  2045     if (::shmdt(_range.start()) != 0) {
  2046       warning("shmdt(0x%p) failed (%d)\n", _range.start(), errno);
  2047     } else {
  2048       rc = true;
  2050     return rc;
  2053 }; // end: ShmBkShmatedBlock
  2055 static ShmBkBlock* g_shmbk_list = NULL;
  2056 static volatile jint g_shmbk_table_lock = 0;
  2058 // keep some usage statistics
  2059 static struct {
  2060   int nodes;    // number of nodes in list
  2061   size_t bytes; // reserved - not committed - bytes.
  2062   int reserves; // how often reserve was called
  2063   int lookups;  // how often a lookup was made
  2064 } g_shmbk_stats = { 0, 0, 0, 0 };
  2066 // add information about a shared memory segment to the bookkeeping
  2067 static void shmbk_register(ShmBkBlock* p_block) {
  2068   guarantee(p_block, "logic error");
  2069   p_block->set_next(g_shmbk_list);
  2070   g_shmbk_list = p_block;
  2071   g_shmbk_stats.reserves ++;
  2072   g_shmbk_stats.bytes += p_block->size();
  2073   g_shmbk_stats.nodes ++;
  2076 // remove information about a shared memory segment by its starting address
  2077 static void shmbk_unregister(ShmBkBlock* p_block) {
  2078   ShmBkBlock* p = g_shmbk_list;
  2079   ShmBkBlock* prev = NULL;
  2080   while (p) {
  2081     if (p == p_block) {
  2082       if (prev) {
  2083         prev->set_next(p->next());
  2084       } else {
  2085         g_shmbk_list = p->next();
  2087       g_shmbk_stats.nodes --;
  2088       g_shmbk_stats.bytes -= p->size();
  2089       return;
  2091     prev = p;
  2092     p = p->next();
  2094   assert(false, "should not happen");
  2097 // given a pointer, return shared memory bookkeeping record for the segment it points into
  2098 // using the returned block info must happen under lock protection
  2099 static ShmBkBlock* shmbk_find_by_containing_address(const char* addr) {
  2100   g_shmbk_stats.lookups ++;
  2101   ShmBkBlock* p = g_shmbk_list;
  2102   while (p) {
  2103     if (p->containsAddress(addr)) {
  2104       return p;
  2106     p = p->next();
  2108   return NULL;
  2111 // dump all information about all memory segments allocated with os::reserve_memory()
  2112 void shmbk_dump_info() {
  2113   tty->print_cr("-- shared mem bookkeeping (alive: %d segments, %llu bytes, "
  2114     "total reserves: %d total lookups: %d)",
  2115     g_shmbk_stats.nodes, g_shmbk_stats.bytes, g_shmbk_stats.reserves, g_shmbk_stats.lookups);
  2116   const ShmBkBlock* p = g_shmbk_list;
  2117   int i = 0;
  2118   while (p) {
  2119     p->print(tty);
  2120     p = p->next();
  2121     i ++;
  2125 #define LOCK_SHMBK     { ThreadCritical _LOCK_SHMBK;
  2126 #define UNLOCK_SHMBK   }
  2128 // End: shared memory bookkeeping
  2129 ////////////////////////////////////////////////////////////////////////////////////////////////////
  2131 int os::vm_page_size() {
  2132   // Seems redundant as all get out
  2133   assert(os::Aix::page_size() != -1, "must call os::init");
  2134   return os::Aix::page_size();
  2137 // Aix allocates memory by pages.
  2138 int os::vm_allocation_granularity() {
  2139   assert(os::Aix::page_size() != -1, "must call os::init");
  2140   return os::Aix::page_size();
  2143 int os::Aix::commit_memory_impl(char* addr, size_t size, bool exec) {
  2145   // Commit is a noop. There is no explicit commit
  2146   // needed on AIX. Memory is committed when touched.
  2147   //
  2148   // Debug : check address range for validity
  2149 #ifdef ASSERT
  2150   LOCK_SHMBK
  2151     ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
  2152     if (!block) {
  2153       fprintf(stderr, "invalid pointer: " INTPTR_FORMAT "\n", addr);
  2154       shmbk_dump_info();
  2155       assert(false, "invalid pointer");
  2156       return false;
  2157     } else if (!block->containsRange(addr, size)) {
  2158       fprintf(stderr, "invalid range: " INTPTR_FORMAT " .. " INTPTR_FORMAT "\n", addr, addr + size);
  2159       shmbk_dump_info();
  2160       assert(false, "invalid range");
  2161       return false;
  2163   UNLOCK_SHMBK
  2164 #endif // ASSERT
  2166   return 0;
  2169 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
  2170   return os::Aix::commit_memory_impl(addr, size, exec) == 0;
  2173 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
  2174                                   const char* mesg) {
  2175   assert(mesg != NULL, "mesg must be specified");
  2176   os::Aix::commit_memory_impl(addr, size, exec);
  2179 int os::Aix::commit_memory_impl(char* addr, size_t size,
  2180                                 size_t alignment_hint, bool exec) {
  2181   return os::Aix::commit_memory_impl(addr, size, exec);
  2184 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
  2185                           bool exec) {
  2186   return os::Aix::commit_memory_impl(addr, size, alignment_hint, exec) == 0;
  2189 void os::pd_commit_memory_or_exit(char* addr, size_t size,
  2190                                   size_t alignment_hint, bool exec,
  2191                                   const char* mesg) {
  2192   os::Aix::commit_memory_impl(addr, size, alignment_hint, exec);
  2195 bool os::pd_uncommit_memory(char* addr, size_t size) {
  2197   // Delegate to ShmBkBlock class which knows how to uncommit its memory.
  2199   bool rc = false;
  2200   LOCK_SHMBK
  2201     ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
  2202     if (!block) {
  2203       fprintf(stderr, "invalid pointer: 0x%p.\n", addr);
  2204       shmbk_dump_info();
  2205       assert(false, "invalid pointer");
  2206       return false;
  2207     } else if (!block->containsRange(addr, size)) {
  2208       fprintf(stderr, "invalid range: 0x%p .. 0x%p.\n", addr, addr + size);
  2209       shmbk_dump_info();
  2210       assert(false, "invalid range");
  2211       return false;
  2213     rc = block->disclaim(addr, size);
  2214   UNLOCK_SHMBK
  2216   if (Verbose && !rc) {
  2217     warning("failed to disclaim 0x%p .. 0x%p (0x%llX bytes).", addr, addr + size, size);
  2219   return rc;
  2222 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
  2223   return os::guard_memory(addr, size);
  2226 bool os::remove_stack_guard_pages(char* addr, size_t size) {
  2227   return os::unguard_memory(addr, size);
  2230 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
  2233 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
  2236 void os::numa_make_global(char *addr, size_t bytes) {
  2239 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
  2242 bool os::numa_topology_changed() {
  2243   return false;
  2246 size_t os::numa_get_groups_num() {
  2247   return 1;
  2250 int os::numa_get_group_id() {
  2251   return 0;
  2254 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
  2255   if (size > 0) {
  2256     ids[0] = 0;
  2257     return 1;
  2259   return 0;
  2262 bool os::get_page_info(char *start, page_info* info) {
  2263   return false;
  2266 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
  2267   return end;
  2270 // Flags for reserve_shmatted_memory:
  2271 #define RESSHM_WISHADDR_OR_FAIL                     1
  2272 #define RESSHM_TRY_16M_PAGES                        2
  2273 #define RESSHM_16M_PAGES_OR_FAIL                    4
  2275 // Result of reserve_shmatted_memory:
  2276 struct shmatted_memory_info_t {
  2277   char* addr;
  2278   size_t pagesize;
  2279   bool pinned;
  2280 };
  2282 // Reserve a section of shmatted memory.
  2283 // params:
  2284 // bytes [in]: size of memory, in bytes
  2285 // requested_addr [in]: wish address.
  2286 //                      NULL = no wish.
  2287 //                      If RESSHM_WISHADDR_OR_FAIL is set in flags and wish address cannot
  2288 //                      be obtained, function will fail. Otherwise wish address is treated as hint and
  2289 //                      another pointer is returned.
  2290 // flags [in]:          some flags. Valid flags are:
  2291 //                      RESSHM_WISHADDR_OR_FAIL - fail if wish address is given and cannot be obtained.
  2292 //                      RESSHM_TRY_16M_PAGES - try to allocate from 16M page pool
  2293 //                          (requires UseLargePages and Use16MPages)
  2294 //                      RESSHM_16M_PAGES_OR_FAIL - if you cannot allocate from 16M page pool, fail.
  2295 //                          Otherwise any other page size will do.
  2296 // p_info [out] :       holds information about the created shared memory segment.
  2297 static bool reserve_shmatted_memory(size_t bytes, char* requested_addr, int flags, shmatted_memory_info_t* p_info) {
  2299   assert(p_info, "parameter error");
  2301   // init output struct.
  2302   p_info->addr = NULL;
  2304   // neither should we be here for EXTSHM=ON.
  2305   if (os::Aix::extshm()) {
  2306     ShouldNotReachHere();
  2309   // extract flags. sanity checks.
  2310   const bool wishaddr_or_fail =
  2311     flags & RESSHM_WISHADDR_OR_FAIL;
  2312   const bool try_16M_pages =
  2313     flags & RESSHM_TRY_16M_PAGES;
  2314   const bool f16M_pages_or_fail =
  2315     flags & RESSHM_16M_PAGES_OR_FAIL;
  2317   // first check: if a wish address is given and it is mandatory, but not aligned to segment boundary,
  2318   // shmat will fail anyway, so save some cycles by failing right away
  2319   if (requested_addr && ((uintptr_t)requested_addr % SIZE_256M == 0)) {
  2320     if (wishaddr_or_fail) {
  2321       return false;
  2322     } else {
  2323       requested_addr = NULL;
  2327   char* addr = NULL;
  2329   // Align size of shm up to the largest possible page size, to avoid errors later on when we try to change
  2330   // pagesize dynamically.
  2331   const size_t size = align_size_up(bytes, SIZE_16M);
  2333   // reserve the shared segment
  2334   int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
  2335   if (shmid == -1) {
  2336     warning("shmget(.., %lld, ..) failed (errno: %d).", size, errno);
  2337     return false;
  2340   // Important note:
  2341   // It is very important that we, upon leaving this function, do not leave a shm segment alive.
  2342   // We must right after attaching it remove it from the system. System V shm segments are global and
  2343   // survive the process.
  2344   // So, from here on: Do not assert. Do not return. Always do a "goto cleanup_shm".
  2346   // try forcing the page size
  2347   size_t pagesize = -1; // unknown so far
  2349   if (UseLargePages) {
  2351     struct shmid_ds shmbuf;
  2352     memset(&shmbuf, 0, sizeof(shmbuf));
  2354     // First, try to take from 16M page pool if...
  2355     if (os::Aix::can_use_16M_pages()  // we can ...
  2356         && Use16MPages                // we are not explicitly forbidden to do so (-XX:-Use16MPages)..
  2357         && try_16M_pages) {           // caller wants us to.
  2358       shmbuf.shm_pagesize = SIZE_16M;
  2359       if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) {
  2360         pagesize = SIZE_16M;
  2361       } else {
  2362         warning("Failed to allocate %d 16M pages. 16M page pool might be exhausted. (shmctl failed with %d)",
  2363                 size / SIZE_16M, errno);
  2364         if (f16M_pages_or_fail) {
  2365           goto cleanup_shm;
  2370     // Nothing yet? Try setting 64K pages. Note that I never saw this fail, but in theory it might,
  2371     // because the 64K page pool may also be exhausted.
  2372     if (pagesize == -1) {
  2373       shmbuf.shm_pagesize = SIZE_64K;
  2374       if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) {
  2375         pagesize = SIZE_64K;
  2376       } else {
  2377         warning("Failed to allocate %d 64K pages. (shmctl failed with %d)",
  2378                 size / SIZE_64K, errno);
  2379         // here I give up. leave page_size -1 - later, after attaching, we will query the
  2380         // real page size of the attached memory. (in theory, it may be something different
  2381         // from 4K if LDR_CNTRL SHM_PSIZE is set)
  2386   // sanity point
  2387   assert(pagesize == -1 || pagesize == SIZE_16M || pagesize == SIZE_64K, "wrong page size");
  2389   // Now attach the shared segment.
  2390   addr = (char*) shmat(shmid, requested_addr, 0);
  2391   if (addr == (char*)-1) {
  2392     // How to handle attach failure:
  2393     // If it failed for a specific wish address, tolerate this: in that case, if wish address was
  2394     // mandatory, fail, if not, retry anywhere.
  2395     // If it failed for any other reason, treat that as fatal error.
  2396     addr = NULL;
  2397     if (requested_addr) {
  2398       if (wishaddr_or_fail) {
  2399         goto cleanup_shm;
  2400       } else {
  2401         addr = (char*) shmat(shmid, NULL, 0);
  2402         if (addr == (char*)-1) { // fatal
  2403           addr = NULL;
  2404           warning("shmat failed (errno: %d)", errno);
  2405           goto cleanup_shm;
  2408     } else { // fatal
  2409       addr = NULL;
  2410       warning("shmat failed (errno: %d)", errno);
  2411       goto cleanup_shm;
  2415   // sanity point
  2416   assert(addr && addr != (char*) -1, "wrong address");
  2418   // after successful Attach remove the segment - right away.
  2419   if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
  2420     warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
  2421     guarantee(false, "failed to remove shared memory segment!");
  2423   shmid = -1;
  2425   // query the real page size. In case setting the page size did not work (see above), the system
  2426   // may have given us something other then 4K (LDR_CNTRL)
  2428     const size_t real_pagesize = os::Aix::query_pagesize(addr);
  2429     if (pagesize != -1) {
  2430       assert(pagesize == real_pagesize, "unexpected pagesize after shmat");
  2431     } else {
  2432       pagesize = real_pagesize;
  2436   // Now register the reserved block with internal book keeping.
  2437   LOCK_SHMBK
  2438     const bool pinned = pagesize >= SIZE_16M ? true : false;
  2439     ShmBkShmatedBlock* const p_block = new ShmBkShmatedBlock(AddrRange(addr, size), pagesize, pinned);
  2440     assert(p_block, "");
  2441     shmbk_register(p_block);
  2442   UNLOCK_SHMBK
  2444 cleanup_shm:
  2446   // if we have not done so yet, remove the shared memory segment. This is very important.
  2447   if (shmid != -1) {
  2448     if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
  2449       warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
  2450       guarantee(false, "failed to remove shared memory segment!");
  2452     shmid = -1;
  2455   // trace
  2456   if (Verbose && !addr) {
  2457     if (requested_addr != NULL) {
  2458       warning("failed to shm-allocate 0x%llX bytes at wish address 0x%p.", size, requested_addr);
  2459     } else {
  2460       warning("failed to shm-allocate 0x%llX bytes at any address.", size);
  2464   // hand info to caller
  2465   if (addr) {
  2466     p_info->addr = addr;
  2467     p_info->pagesize = pagesize;
  2468     p_info->pinned = pagesize == SIZE_16M ? true : false;
  2471   // sanity test:
  2472   if (requested_addr && addr && wishaddr_or_fail) {
  2473     guarantee(addr == requested_addr, "shmat error");
  2476   // just one more test to really make sure we have no dangling shm segments.
  2477   guarantee(shmid == -1, "dangling shm segments");
  2479   return addr ? true : false;
  2481 } // end: reserve_shmatted_memory
  2483 // Reserve memory using mmap. Behaves the same as reserve_shmatted_memory():
  2484 // will return NULL in case of an error.
  2485 static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
  2487   // if a wish address is given, but not aligned to 4K page boundary, mmap will fail.
  2488   if (requested_addr && ((uintptr_t)requested_addr % os::vm_page_size() != 0)) {
  2489     warning("Wish address 0x%p not aligned to page boundary.", requested_addr);
  2490     return NULL;
  2493   const size_t size = align_size_up(bytes, SIZE_4K);
  2495   // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to
  2496   // msync(MS_INVALIDATE) (see os::uncommit_memory)
  2497   int flags = MAP_ANONYMOUS | MAP_SHARED;
  2499   // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
  2500   // it means if wishaddress is given but MAP_FIXED is not set.
  2501   //
  2502   // Note however that this changes semantics in SPEC1170 mode insofar as MAP_FIXED
  2503   // clobbers the address range, which is probably not what the caller wants. That's
  2504   // why I assert here (again) that the SPEC1170 compat mode is off.
  2505   // If we want to be able to run under SPEC1170, we have to do some porting and
  2506   // testing.
  2507   if (requested_addr != NULL) {
  2508     assert(!os::Aix::xpg_sus_mode(), "SPEC1170 mode not allowed.");
  2509     flags |= MAP_FIXED;
  2512   char* addr = (char*)::mmap(requested_addr, size, PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
  2514   if (addr == MAP_FAILED) {
  2515     // attach failed: tolerate for specific wish addresses. Not being able to attach
  2516     // anywhere is a fatal error.
  2517     if (requested_addr == NULL) {
  2518       // It's ok to fail here if the machine has not enough memory.
  2519       warning("mmap(NULL, 0x%llX, ..) failed (%d)", size, errno);
  2521     addr = NULL;
  2522     goto cleanup_mmap;
  2525   // If we did request a specific address and that address was not available, fail.
  2526   if (addr && requested_addr) {
  2527     guarantee(addr == requested_addr, "unexpected");
  2530   // register this mmap'ed segment with book keeping
  2531   LOCK_SHMBK
  2532     ShmBkMappedBlock* const p_block = new ShmBkMappedBlock(AddrRange(addr, size));
  2533     assert(p_block, "");
  2534     shmbk_register(p_block);
  2535   UNLOCK_SHMBK
  2537 cleanup_mmap:
  2539   // trace
  2540   if (Verbose) {
  2541     if (addr) {
  2542       fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes);
  2544     else {
  2545       if (requested_addr != NULL) {
  2546         warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr);
  2547       } else {
  2548         warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes);
  2553   return addr;
  2555 } // end: reserve_mmaped_memory
  2557 // Reserves and attaches a shared memory segment.
  2558 // Will assert if a wish address is given and could not be obtained.
  2559 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
  2560   return os::attempt_reserve_memory_at(bytes, requested_addr);
  2563 bool os::pd_release_memory(char* addr, size_t size) {
  2565   // delegate to ShmBkBlock class which knows how to uncommit its memory.
  2567   bool rc = false;
  2568   LOCK_SHMBK
  2569     ShmBkBlock* const block = shmbk_find_by_containing_address(addr);
  2570     if (!block) {
  2571       fprintf(stderr, "invalid pointer: 0x%p.\n", addr);
  2572       shmbk_dump_info();
  2573       assert(false, "invalid pointer");
  2574       return false;
  2576     else if (!block->isSameRange(addr, size)) {
  2577       if (block->getType() == ShmBkBlock::MMAP) {
  2578         // Release only the same range or a the beginning or the end of a range.
  2579         if (block->base() == addr && size < block->size()) {
  2580           ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base() + size, block->size() - size));
  2581           assert(b, "");
  2582           shmbk_register(b);
  2583           block->setAddrRange(AddrRange(addr, size));
  2585         else if (addr > block->base() && addr + size == block->base() + block->size()) {
  2586           ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base(), block->size() - size));
  2587           assert(b, "");
  2588           shmbk_register(b);
  2589           block->setAddrRange(AddrRange(addr, size));
  2591         else {
  2592           fprintf(stderr, "invalid mmap range: 0x%p .. 0x%p.\n", addr, addr + size);
  2593           shmbk_dump_info();
  2594           assert(false, "invalid mmap range");
  2595           return false;
  2598       else {
  2599         // Release only the same range. No partial release allowed.
  2600         // Soften the requirement a bit, because the user may think he owns a smaller size
  2601         // than the block is due to alignment etc.
  2602         if (block->base() != addr || block->size() < size) {
  2603           fprintf(stderr, "invalid shmget range: 0x%p .. 0x%p.\n", addr, addr + size);
  2604           shmbk_dump_info();
  2605           assert(false, "invalid shmget range");
  2606           return false;
  2610     rc = block->release();
  2611     assert(rc, "release failed");
  2612     // remove block from bookkeeping
  2613     shmbk_unregister(block);
  2614     delete block;
  2615   UNLOCK_SHMBK
  2617   if (!rc) {
  2618     warning("failed to released %lu bytes at 0x%p", size, addr);
  2621   return rc;
  2624 static bool checked_mprotect(char* addr, size_t size, int prot) {
  2626   // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will
  2627   // not tell me if protection failed when trying to protect an un-protectable range.
  2628   //
  2629   // This means if the memory was allocated using shmget/shmat, protection wont work
  2630   // but mprotect will still return 0:
  2631   //
  2632   // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm
  2634   bool rc = ::mprotect(addr, size, prot) == 0 ? true : false;
  2636   if (!rc) {
  2637     const char* const s_errno = strerror(errno);
  2638     warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno);
  2639     return false;
  2642   // mprotect success check
  2643   //
  2644   // Mprotect said it changed the protection but can I believe it?
  2645   //
  2646   // To be sure I need to check the protection afterwards. Try to
  2647   // read from protected memory and check whether that causes a segfault.
  2648   //
  2649   if (!os::Aix::xpg_sus_mode()) {
  2651     if (StubRoutines::SafeFetch32_stub()) {
  2653       const bool read_protected =
  2654         (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
  2655          SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
  2657       if (prot & PROT_READ) {
  2658         rc = !read_protected;
  2659       } else {
  2660         rc = read_protected;
  2664   if (!rc) {
  2665     assert(false, "mprotect failed.");
  2667   return rc;
  2670 // Set protections specified
  2671 bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) {
  2672   unsigned int p = 0;
  2673   switch (prot) {
  2674   case MEM_PROT_NONE: p = PROT_NONE; break;
  2675   case MEM_PROT_READ: p = PROT_READ; break;
  2676   case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
  2677   case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
  2678   default:
  2679     ShouldNotReachHere();
  2681   // is_committed is unused.
  2682   return checked_mprotect(addr, size, p);
  2685 bool os::guard_memory(char* addr, size_t size) {
  2686   return checked_mprotect(addr, size, PROT_NONE);
  2689 bool os::unguard_memory(char* addr, size_t size) {
  2690   return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
  2693 // Large page support
  2695 static size_t _large_page_size = 0;
  2697 // Enable large page support if OS allows that.
  2698 void os::large_page_init() {
  2700   // Note: os::Aix::query_multipage_support must run first.
  2702   if (!UseLargePages) {
  2703     return;
  2706   if (!Aix::can_use_64K_pages()) {
  2707     assert(!Aix::can_use_16M_pages(), "64K is a precondition for 16M.");
  2708     UseLargePages = false;
  2709     return;
  2712   if (!Aix::can_use_16M_pages() && Use16MPages) {
  2713     fprintf(stderr, "Cannot use 16M pages. Please ensure that there is a 16M page pool "
  2714             " and that the VM runs with CAP_BYPASS_RAC_VMM and CAP_PROPAGATE capabilities.\n");
  2717   // Do not report 16M page alignment as part of os::_page_sizes if we are
  2718   // explicitly forbidden from using 16M pages. Doing so would increase the
  2719   // alignment the garbage collector calculates with, slightly increasing
  2720   // heap usage. We should only pay for 16M alignment if we really want to
  2721   // use 16M pages.
  2722   if (Use16MPages && Aix::can_use_16M_pages()) {
  2723     _large_page_size = SIZE_16M;
  2724     _page_sizes[0] = SIZE_16M;
  2725     _page_sizes[1] = SIZE_64K;
  2726     _page_sizes[2] = SIZE_4K;
  2727     _page_sizes[3] = 0;
  2728   } else if (Aix::can_use_64K_pages()) {
  2729     _large_page_size = SIZE_64K;
  2730     _page_sizes[0] = SIZE_64K;
  2731     _page_sizes[1] = SIZE_4K;
  2732     _page_sizes[2] = 0;
  2735   if (Verbose) {
  2736     ("Default large page size is 0x%llX.", _large_page_size);
  2738 } // end: os::large_page_init()
  2740 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
  2741   // "exec" is passed in but not used. Creating the shared image for
  2742   // the code cache doesn't have an SHM_X executable permission to check.
  2743   Unimplemented();
  2744   return 0;
  2747 bool os::release_memory_special(char* base, size_t bytes) {
  2748   // detaching the SHM segment will also delete it, see reserve_memory_special()
  2749   Unimplemented();
  2750   return false;
  2753 size_t os::large_page_size() {
  2754   return _large_page_size;
  2757 bool os::can_commit_large_page_memory() {
  2758   // Well, sadly we cannot commit anything at all (see comment in
  2759   // os::commit_memory) but we claim to so we can make use of large pages
  2760   return true;
  2763 bool os::can_execute_large_page_memory() {
  2764   // We can do that
  2765   return true;
  2768 // Reserve memory at an arbitrary address, only if that area is
  2769 // available (and not reserved for something else).
  2770 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
  2772   bool use_mmap = false;
  2774   // mmap: smaller graining, no large page support
  2775   // shm: large graining (256M), large page support, limited number of shm segments
  2776   //
  2777   // Prefer mmap wherever we either do not need large page support or have OS limits
  2779   if (!UseLargePages || bytes < SIZE_16M) {
  2780     use_mmap = true;
  2783   char* addr = NULL;
  2784   if (use_mmap) {
  2785     addr = reserve_mmaped_memory(bytes, requested_addr);
  2786   } else {
  2787     // shmat: wish address is mandatory, and do not try 16M pages here.
  2788     shmatted_memory_info_t info;
  2789     const int flags = RESSHM_WISHADDR_OR_FAIL;
  2790     if (reserve_shmatted_memory(bytes, requested_addr, flags, &info)) {
  2791       addr = info.addr;
  2795   return addr;
  2798 size_t os::read(int fd, void *buf, unsigned int nBytes) {
  2799   return ::read(fd, buf, nBytes);
  2802 #define NANOSECS_PER_MILLISEC 1000000
  2804 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
  2805   assert(thread == Thread::current(), "thread consistency check");
  2807   // Prevent nasty overflow in deadline calculation
  2808   // by handling long sleeps similar to solaris or windows.
  2809   const jlong limit = INT_MAX;
  2810   int result;
  2811   while (millis > limit) {
  2812     if ((result = os::sleep(thread, limit, interruptible)) != OS_OK) {
  2813       return result;
  2815     millis -= limit;
  2818   ParkEvent * const slp = thread->_SleepEvent;
  2819   slp->reset();
  2820   OrderAccess::fence();
  2822   if (interruptible) {
  2823     jlong prevtime = javaTimeNanos();
  2825     // Prevent precision loss and too long sleeps
  2826     jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC;
  2828     for (;;) {
  2829       if (os::is_interrupted(thread, true)) {
  2830         return OS_INTRPT;
  2833       jlong newtime = javaTimeNanos();
  2835       assert(newtime >= prevtime, "time moving backwards");
  2836       // Doing prevtime and newtime in microseconds doesn't help precision,
  2837       // and trying to round up to avoid lost milliseconds can result in a
  2838       // too-short delay.
  2839       millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
  2841       if (millis <= 0) {
  2842         return OS_OK;
  2845       // Stop sleeping if we passed the deadline
  2846       if (newtime >= deadline) {
  2847         return OS_OK;
  2850       prevtime = newtime;
  2853         assert(thread->is_Java_thread(), "sanity check");
  2854         JavaThread *jt = (JavaThread *) thread;
  2855         ThreadBlockInVM tbivm(jt);
  2856         OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
  2858         jt->set_suspend_equivalent();
  2860         slp->park(millis);
  2862         // were we externally suspended while we were waiting?
  2863         jt->check_and_wait_while_suspended();
  2866   } else {
  2867     OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
  2868     jlong prevtime = javaTimeNanos();
  2870     // Prevent precision loss and too long sleeps
  2871     jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC;
  2873     for (;;) {
  2874       // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
  2875       // the 1st iteration ...
  2876       jlong newtime = javaTimeNanos();
  2878       if (newtime - prevtime < 0) {
  2879         // time moving backwards, should only happen if no monotonic clock
  2880         // not a guarantee() because JVM should not abort on kernel/glibc bugs
  2881         // - HS14 Commented out as not implemented.
  2882         // - TODO Maybe we should implement it?
  2883         //assert(!Aix::supports_monotonic_clock(), "time moving backwards");
  2884       } else {
  2885         millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
  2888       if (millis <= 0) break;
  2890       if (newtime >= deadline) {
  2891         break;
  2894       prevtime = newtime;
  2895       slp->park(millis);
  2897     return OS_OK;
  2901 int os::naked_sleep() {
  2902   // %% make the sleep time an integer flag. for now use 1 millisec.
  2903   return os::sleep(Thread::current(), 1, false);
  2906 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
  2907 void os::infinite_sleep() {
  2908   while (true) {    // sleep forever ...
  2909     ::sleep(100);   // ... 100 seconds at a time
  2913 // Used to convert frequent JVM_Yield() to nops
  2914 bool os::dont_yield() {
  2915   return DontYieldALot;
  2918 void os::yield() {
  2919   sched_yield();
  2922 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; }
  2924 void os::yield_all(int attempts) {
  2925   // Yields to all threads, including threads with lower priorities
  2926   // Threads on Linux are all with same priority. The Solaris style
  2927   // os::yield_all() with nanosleep(1ms) is not necessary.
  2928   sched_yield();
  2931 // Called from the tight loops to possibly influence time-sharing heuristics
  2932 void os::loop_breaker(int attempts) {
  2933   os::yield_all(attempts);
  2936 ////////////////////////////////////////////////////////////////////////////////
  2937 // thread priority support
  2939 // From AIX manpage to pthread_setschedparam
  2940 // (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?
  2941 //    topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm):
  2942 //
  2943 // "If schedpolicy is SCHED_OTHER, then sched_priority must be in the
  2944 // range from 40 to 80, where 40 is the least favored priority and 80
  2945 // is the most favored."
  2946 //
  2947 // (Actually, I doubt this even has an impact on AIX, as we do kernel
  2948 // scheduling there; however, this still leaves iSeries.)
  2949 //
  2950 // We use the same values for AIX and PASE.
  2951 int os::java_to_os_priority[CriticalPriority + 1] = {
  2952   54,             // 0 Entry should never be used
  2954   55,             // 1 MinPriority
  2955   55,             // 2
  2956   56,             // 3
  2958   56,             // 4
  2959   57,             // 5 NormPriority
  2960   57,             // 6
  2962   58,             // 7
  2963   58,             // 8
  2964   59,             // 9 NearMaxPriority
  2966   60,             // 10 MaxPriority
  2968   60              // 11 CriticalPriority
  2969 };
  2971 OSReturn os::set_native_priority(Thread* thread, int newpri) {
  2972   if (!UseThreadPriorities) return OS_OK;
  2973   pthread_t thr = thread->osthread()->pthread_id();
  2974   int policy = SCHED_OTHER;
  2975   struct sched_param param;
  2976   param.sched_priority = newpri;
  2977   int ret = pthread_setschedparam(thr, policy, &param);
  2979   if (Verbose) {
  2980     if (ret == 0) {
  2981       fprintf(stderr, "changed priority of thread %d to %d\n", (int)thr, newpri);
  2982     } else {
  2983       fprintf(stderr, "Could not changed priority for thread %d to %d (error %d, %s)\n",
  2984               (int)thr, newpri, ret, strerror(ret));
  2987   return (ret == 0) ? OS_OK : OS_ERR;
  2990 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
  2991   if (!UseThreadPriorities) {
  2992     *priority_ptr = java_to_os_priority[NormPriority];
  2993     return OS_OK;
  2995   pthread_t thr = thread->osthread()->pthread_id();
  2996   int policy = SCHED_OTHER;
  2997   struct sched_param param;
  2998   int ret = pthread_getschedparam(thr, &policy, &param);
  2999   *priority_ptr = param.sched_priority;
  3001   return (ret == 0) ? OS_OK : OS_ERR;
  3004 // Hint to the underlying OS that a task switch would not be good.
  3005 // Void return because it's a hint and can fail.
  3006 void os::hint_no_preempt() {}
  3008 ////////////////////////////////////////////////////////////////////////////////
  3009 // suspend/resume support
  3011 //  the low-level signal-based suspend/resume support is a remnant from the
  3012 //  old VM-suspension that used to be for java-suspension, safepoints etc,
  3013 //  within hotspot. Now there is a single use-case for this:
  3014 //    - calling get_thread_pc() on the VMThread by the flat-profiler task
  3015 //      that runs in the watcher thread.
  3016 //  The remaining code is greatly simplified from the more general suspension
  3017 //  code that used to be used.
  3018 //
  3019 //  The protocol is quite simple:
  3020 //  - suspend:
  3021 //      - sends a signal to the target thread
  3022 //      - polls the suspend state of the osthread using a yield loop
  3023 //      - target thread signal handler (SR_handler) sets suspend state
  3024 //        and blocks in sigsuspend until continued
  3025 //  - resume:
  3026 //      - sets target osthread state to continue
  3027 //      - sends signal to end the sigsuspend loop in the SR_handler
  3028 //
  3029 //  Note that the SR_lock plays no role in this suspend/resume protocol.
  3030 //
  3032 static void resume_clear_context(OSThread *osthread) {
  3033   osthread->set_ucontext(NULL);
  3034   osthread->set_siginfo(NULL);
  3037 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
  3038   osthread->set_ucontext(context);
  3039   osthread->set_siginfo(siginfo);
  3042 //
  3043 // Handler function invoked when a thread's execution is suspended or
  3044 // resumed. We have to be careful that only async-safe functions are
  3045 // called here (Note: most pthread functions are not async safe and
  3046 // should be avoided.)
  3047 //
  3048 // Note: sigwait() is a more natural fit than sigsuspend() from an
  3049 // interface point of view, but sigwait() prevents the signal hander
  3050 // from being run. libpthread would get very confused by not having
  3051 // its signal handlers run and prevents sigwait()'s use with the
  3052 // mutex granting granting signal.
  3053 //
  3054 // Currently only ever called on the VMThread and JavaThreads (PC sampling).
  3055 //
  3056 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
  3057   // Save and restore errno to avoid confusing native code with EINTR
  3058   // after sigsuspend.
  3059   int old_errno = errno;
  3061   Thread* thread = Thread::current();
  3062   OSThread* osthread = thread->osthread();
  3063   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
  3065   os::SuspendResume::State current = osthread->sr.state();
  3066   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
  3067     suspend_save_context(osthread, siginfo, context);
  3069     // attempt to switch the state, we assume we had a SUSPEND_REQUEST
  3070     os::SuspendResume::State state = osthread->sr.suspended();
  3071     if (state == os::SuspendResume::SR_SUSPENDED) {
  3072       sigset_t suspend_set;  // signals for sigsuspend()
  3074       // get current set of blocked signals and unblock resume signal
  3075       pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
  3076       sigdelset(&suspend_set, SR_signum);
  3078       // wait here until we are resumed
  3079       while (1) {
  3080         sigsuspend(&suspend_set);
  3082         os::SuspendResume::State result = osthread->sr.running();
  3083         if (result == os::SuspendResume::SR_RUNNING) {
  3084           break;
  3088     } else if (state == os::SuspendResume::SR_RUNNING) {
  3089       // request was cancelled, continue
  3090     } else {
  3091       ShouldNotReachHere();
  3094     resume_clear_context(osthread);
  3095   } else if (current == os::SuspendResume::SR_RUNNING) {
  3096     // request was cancelled, continue
  3097   } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
  3098     // ignore
  3099   } else {
  3100     ShouldNotReachHere();
  3103   errno = old_errno;
  3107 static int SR_initialize() {
  3108   struct sigaction act;
  3109   char *s;
  3110   // Get signal number to use for suspend/resume
  3111   if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
  3112     int sig = ::strtol(s, 0, 10);
  3113     if (sig > 0 || sig < NSIG) {
  3114       SR_signum = sig;
  3118   assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
  3119         "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
  3121   sigemptyset(&SR_sigset);
  3122   sigaddset(&SR_sigset, SR_signum);
  3124   // Set up signal handler for suspend/resume.
  3125   act.sa_flags = SA_RESTART|SA_SIGINFO;
  3126   act.sa_handler = (void (*)(int)) SR_handler;
  3128   // SR_signum is blocked by default.
  3129   // 4528190 - We also need to block pthread restart signal (32 on all
  3130   // supported Linux platforms). Note that LinuxThreads need to block
  3131   // this signal for all threads to work properly. So we don't have
  3132   // to use hard-coded signal number when setting up the mask.
  3133   pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
  3135   if (sigaction(SR_signum, &act, 0) == -1) {
  3136     return -1;
  3139   // Save signal flag
  3140   os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
  3141   return 0;
  3144 static int SR_finalize() {
  3145   return 0;
  3148 static int sr_notify(OSThread* osthread) {
  3149   int status = pthread_kill(osthread->pthread_id(), SR_signum);
  3150   assert_status(status == 0, status, "pthread_kill");
  3151   return status;
  3154 // "Randomly" selected value for how long we want to spin
  3155 // before bailing out on suspending a thread, also how often
  3156 // we send a signal to a thread we want to resume
  3157 static const int RANDOMLY_LARGE_INTEGER = 1000000;
  3158 static const int RANDOMLY_LARGE_INTEGER2 = 100;
  3160 // returns true on success and false on error - really an error is fatal
  3161 // but this seems the normal response to library errors
  3162 static bool do_suspend(OSThread* osthread) {
  3163   assert(osthread->sr.is_running(), "thread should be running");
  3164   // mark as suspended and send signal
  3166   if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
  3167     // failed to switch, state wasn't running?
  3168     ShouldNotReachHere();
  3169     return false;
  3172   if (sr_notify(osthread) != 0) {
  3173     // try to cancel, switch to running
  3175     os::SuspendResume::State result = osthread->sr.cancel_suspend();
  3176     if (result == os::SuspendResume::SR_RUNNING) {
  3177       // cancelled
  3178       return false;
  3179     } else if (result == os::SuspendResume::SR_SUSPENDED) {
  3180       // somehow managed to suspend
  3181       return true;
  3182     } else {
  3183       ShouldNotReachHere();
  3184       return false;
  3188   // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
  3190   for (int n = 0; !osthread->sr.is_suspended(); n++) {
  3191     for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
  3192       os::yield_all(i);
  3195     // timeout, try to cancel the request
  3196     if (n >= RANDOMLY_LARGE_INTEGER) {
  3197       os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
  3198       if (cancelled == os::SuspendResume::SR_RUNNING) {
  3199         return false;
  3200       } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
  3201         return true;
  3202       } else {
  3203         ShouldNotReachHere();
  3204         return false;
  3209   guarantee(osthread->sr.is_suspended(), "Must be suspended");
  3210   return true;
  3213 static void do_resume(OSThread* osthread) {
  3214   //assert(osthread->sr.is_suspended(), "thread should be suspended");
  3216   if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
  3217     // failed to switch to WAKEUP_REQUEST
  3218     ShouldNotReachHere();
  3219     return;
  3222   while (!osthread->sr.is_running()) {
  3223     if (sr_notify(osthread) == 0) {
  3224       for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
  3225         for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
  3226           os::yield_all(i);
  3229     } else {
  3230       ShouldNotReachHere();
  3234   guarantee(osthread->sr.is_running(), "Must be running!");
  3237 ////////////////////////////////////////////////////////////////////////////////
  3238 // interrupt support
  3240 void os::interrupt(Thread* thread) {
  3241   assert(Thread::current() == thread || Threads_lock->owned_by_self(),
  3242     "possibility of dangling Thread pointer");
  3244   OSThread* osthread = thread->osthread();
  3246   if (!osthread->interrupted()) {
  3247     osthread->set_interrupted(true);
  3248     // More than one thread can get here with the same value of osthread,
  3249     // resulting in multiple notifications.  We do, however, want the store
  3250     // to interrupted() to be visible to other threads before we execute unpark().
  3251     OrderAccess::fence();
  3252     ParkEvent * const slp = thread->_SleepEvent;
  3253     if (slp != NULL) slp->unpark();
  3256   // For JSR166. Unpark even if interrupt status already was set
  3257   if (thread->is_Java_thread())
  3258     ((JavaThread*)thread)->parker()->unpark();
  3260   ParkEvent * ev = thread->_ParkEvent;
  3261   if (ev != NULL) ev->unpark();
  3265 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
  3266   assert(Thread::current() == thread || Threads_lock->owned_by_self(),
  3267     "possibility of dangling Thread pointer");
  3269   OSThread* osthread = thread->osthread();
  3271   bool interrupted = osthread->interrupted();
  3273   if (interrupted && clear_interrupted) {
  3274     osthread->set_interrupted(false);
  3275     // consider thread->_SleepEvent->reset() ... optional optimization
  3278   return interrupted;
  3281 ///////////////////////////////////////////////////////////////////////////////////
  3282 // signal handling (except suspend/resume)
  3284 // This routine may be used by user applications as a "hook" to catch signals.
  3285 // The user-defined signal handler must pass unrecognized signals to this
  3286 // routine, and if it returns true (non-zero), then the signal handler must
  3287 // return immediately. If the flag "abort_if_unrecognized" is true, then this
  3288 // routine will never retun false (zero), but instead will execute a VM panic
  3289 // routine kill the process.
  3290 //
  3291 // If this routine returns false, it is OK to call it again. This allows
  3292 // the user-defined signal handler to perform checks either before or after
  3293 // the VM performs its own checks. Naturally, the user code would be making
  3294 // a serious error if it tried to handle an exception (such as a null check
  3295 // or breakpoint) that the VM was generating for its own correct operation.
  3296 //
  3297 // This routine may recognize any of the following kinds of signals:
  3298 //   SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
  3299 // It should be consulted by handlers for any of those signals.
  3300 //
  3301 // The caller of this routine must pass in the three arguments supplied
  3302 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
  3303 // field of the structure passed to sigaction(). This routine assumes that
  3304 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
  3305 //
  3306 // Note that the VM will print warnings if it detects conflicting signal
  3307 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
  3308 //
  3309 extern "C" JNIEXPORT int
  3310 JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
  3312 // Set thread signal mask (for some reason on AIX sigthreadmask() seems
  3313 // to be the thing to call; documentation is not terribly clear about whether
  3314 // pthread_sigmask also works, and if it does, whether it does the same.
  3315 bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) {
  3316   const int rc = ::pthread_sigmask(how, set, oset);
  3317   // return value semantics differ slightly for error case:
  3318   // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno
  3319   // (so, pthread_sigmask is more theadsafe for error handling)
  3320   // But success is always 0.
  3321   return rc == 0 ? true : false;
  3324 // Function to unblock all signals which are, according
  3325 // to POSIX, typical program error signals. If they happen while being blocked,
  3326 // they typically will bring down the process immediately.
  3327 bool unblock_program_error_signals() {
  3328   sigset_t set;
  3329   ::sigemptyset(&set);
  3330   ::sigaddset(&set, SIGILL);
  3331   ::sigaddset(&set, SIGBUS);
  3332   ::sigaddset(&set, SIGFPE);
  3333   ::sigaddset(&set, SIGSEGV);
  3334   return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL);
  3337 // Renamed from 'signalHandler' to avoid collision with other shared libs.
  3338 void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
  3339   assert(info != NULL && uc != NULL, "it must be old kernel");
  3341   // Never leave program error signals blocked;
  3342   // on all our platforms they would bring down the process immediately when
  3343   // getting raised while being blocked.
  3344   unblock_program_error_signals();
  3346   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();
  3634 #define DO_SIGNAL_CHECK(sig) \
  3635   if (!sigismember(&check_signal_done, sig)) \
  3636     os::Aix::check_signal_handler(sig)
  3638 // This method is a periodic task to check for misbehaving JNI applications
  3639 // under CheckJNI, we can add any periodic checks here
  3641 void os::run_periodic_checks() {
  3643   if (check_signals == false) return;
  3645   // SEGV and BUS if overridden could potentially prevent
  3646   // generation of hs*.log in the event of a crash, debugging
  3647   // such a case can be very challenging, so we absolutely
  3648   // check the following for a good measure:
  3649   DO_SIGNAL_CHECK(SIGSEGV);
  3650   DO_SIGNAL_CHECK(SIGILL);
  3651   DO_SIGNAL_CHECK(SIGFPE);
  3652   DO_SIGNAL_CHECK(SIGBUS);
  3653   DO_SIGNAL_CHECK(SIGPIPE);
  3654   DO_SIGNAL_CHECK(SIGXFSZ);
  3655   if (UseSIGTRAP) {
  3656     DO_SIGNAL_CHECK(SIGTRAP);
  3658   DO_SIGNAL_CHECK(SIGDANGER);
  3660   // ReduceSignalUsage allows the user to override these handlers
  3661   // see comments at the very top and jvm_solaris.h
  3662   if (!ReduceSignalUsage) {
  3663     DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
  3664     DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
  3665     DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
  3666     DO_SIGNAL_CHECK(BREAK_SIGNAL);
  3669   DO_SIGNAL_CHECK(SR_signum);
  3670   DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
  3673 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
  3675 static os_sigaction_t os_sigaction = NULL;
  3677 void os::Aix::check_signal_handler(int sig) {
  3678   char buf[O_BUFLEN];
  3679   address jvmHandler = NULL;
  3681   struct sigaction act;
  3682   if (os_sigaction == NULL) {
  3683     // only trust the default sigaction, in case it has been interposed
  3684     os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
  3685     if (os_sigaction == NULL) return;
  3688   os_sigaction(sig, (struct sigaction*)NULL, &act);
  3690   address thisHandler = (act.sa_flags & SA_SIGINFO)
  3691     ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
  3692     : CAST_FROM_FN_PTR(address, act.sa_handler);
  3695   switch(sig) {
  3696   case SIGSEGV:
  3697   case SIGBUS:
  3698   case SIGFPE:
  3699   case SIGPIPE:
  3700   case SIGILL:
  3701   case SIGXFSZ:
  3702     // Renamed 'signalHandler' to avoid collision with other shared libs.
  3703     jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler);
  3704     break;
  3706   case SHUTDOWN1_SIGNAL:
  3707   case SHUTDOWN2_SIGNAL:
  3708   case SHUTDOWN3_SIGNAL:
  3709   case BREAK_SIGNAL:
  3710     jvmHandler = (address)user_handler();
  3711     break;
  3713   case INTERRUPT_SIGNAL:
  3714     jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
  3715     break;
  3717   default:
  3718     if (sig == SR_signum) {
  3719       jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
  3720     } else {
  3721       return;
  3723     break;
  3726   if (thisHandler != jvmHandler) {
  3727     tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
  3728     tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
  3729     tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
  3730     // No need to check this sig any longer
  3731     sigaddset(&check_signal_done, sig);
  3732   } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) {
  3733     tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
  3734     tty->print("expected:" PTR32_FORMAT, os::Aix::get_our_sigflags(sig));
  3735     tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
  3736     // No need to check this sig any longer
  3737     sigaddset(&check_signal_done, sig);
  3740   // Dump all the signal
  3741   if (sigismember(&check_signal_done, sig)) {
  3742     print_signal_handlers(tty, buf, O_BUFLEN);
  3746 extern bool signal_name(int signo, char* buf, size_t len);
  3748 const char* os::exception_name(int exception_code, char* buf, size_t size) {
  3749   if (0 < exception_code && exception_code <= SIGRTMAX) {
  3750     // signal
  3751     if (!signal_name(exception_code, buf, size)) {
  3752       jio_snprintf(buf, size, "SIG%d", exception_code);
  3754     return buf;
  3755   } else {
  3756     return NULL;
  3760 // To install functions for atexit system call
  3761 extern "C" {
  3762   static void perfMemory_exit_helper() {
  3763     perfMemory_exit();
  3767 // This is called _before_ the most of global arguments have been parsed.
  3768 void os::init(void) {
  3769   // This is basic, we want to know if that ever changes.
  3770   // (shared memory boundary is supposed to be a 256M aligned)
  3771   assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected");
  3773   // First off, we need to know whether we run on AIX or PASE, and
  3774   // the OS level we run on.
  3775   os::Aix::initialize_os_info();
  3777   // Scan environment (SPEC1170 behaviour, etc)
  3778   os::Aix::scan_environment();
  3780   // Check which pages are supported by AIX.
  3781   os::Aix::query_multipage_support();
  3783   // Next, we need to initialize libo4 and libperfstat libraries.
  3784   if (os::Aix::on_pase()) {
  3785     os::Aix::initialize_libo4();
  3786   } else {
  3787     os::Aix::initialize_libperfstat();
  3790   // Reset the perfstat information provided by ODM.
  3791   if (os::Aix::on_aix()) {
  3792     libperfstat::perfstat_reset();
  3795   // Now initialze basic system properties. Note that for some of the values we
  3796   // need libperfstat etc.
  3797   os::Aix::initialize_system_info();
  3799   // Initialize large page support.
  3800   if (UseLargePages) {
  3801     os::large_page_init();
  3802     if (!UseLargePages) {
  3803       // initialize os::_page_sizes
  3804       _page_sizes[0] = Aix::page_size();
  3805       _page_sizes[1] = 0;
  3806       if (Verbose) {
  3807         fprintf(stderr, "Large Page initialization failed: setting UseLargePages=0.\n");
  3810   } else {
  3811     // initialize os::_page_sizes
  3812     _page_sizes[0] = Aix::page_size();
  3813     _page_sizes[1] = 0;
  3816   // debug trace
  3817   if (Verbose) {
  3818     fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size());
  3819     fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size());
  3820     fprintf(stderr, "os::_page_sizes = ( ");
  3821     for (int i = 0; _page_sizes[i]; i ++) {
  3822       fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i]));
  3824     fprintf(stderr, ")\n");
  3827   _initial_pid = getpid();
  3829   clock_tics_per_sec = sysconf(_SC_CLK_TCK);
  3831   init_random(1234567);
  3833   ThreadCritical::initialize();
  3835   // Main_thread points to the aboriginal thread.
  3836   Aix::_main_thread = pthread_self();
  3838   initial_time_count = os::elapsed_counter();
  3839   pthread_mutex_init(&dl_mutex, NULL);
  3842 // this is called _after_ the global arguments have been parsed
  3843 jint os::init_2(void) {
  3845   if (Verbose) {
  3846     fprintf(stderr, "processor count: %d\n", os::_processor_count);
  3847     fprintf(stderr, "physical memory: %lu\n", Aix::_physical_memory);
  3850   // initially build up the loaded dll map
  3851   LoadedLibraries::reload();
  3853   const int page_size = Aix::page_size();
  3854   const int map_size = page_size;
  3856   address map_address = (address) MAP_FAILED;
  3857   const int prot  = PROT_READ;
  3858   const int flags = MAP_PRIVATE|MAP_ANONYMOUS;
  3860   // use optimized addresses for the polling page,
  3861   // e.g. map it to a special 32-bit address.
  3862   if (OptimizePollingPageLocation) {
  3863     // architecture-specific list of address wishes:
  3864     address address_wishes[] = {
  3865       // AIX: addresses lower than 0x30000000 don't seem to work on AIX.
  3866       // PPC64: all address wishes are non-negative 32 bit values where
  3867       // the lower 16 bits are all zero. we can load these addresses
  3868       // with a single ppc_lis instruction.
  3869       (address) 0x30000000, (address) 0x31000000,
  3870       (address) 0x32000000, (address) 0x33000000,
  3871       (address) 0x40000000, (address) 0x41000000,
  3872       (address) 0x42000000, (address) 0x43000000,
  3873       (address) 0x50000000, (address) 0x51000000,
  3874       (address) 0x52000000, (address) 0x53000000,
  3875       (address) 0x60000000, (address) 0x61000000,
  3876       (address) 0x62000000, (address) 0x63000000
  3877     };
  3878     int address_wishes_length = sizeof(address_wishes)/sizeof(address);
  3880     // iterate over the list of address wishes:
  3881     for (int i=0; i<address_wishes_length; i++) {
  3882       // try to map with current address wish.
  3883       // AIX: AIX needs MAP_FIXED if we provide an address and mmap will
  3884       // fail if the address is already mapped.
  3885       map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size,
  3886                                      map_size, prot,
  3887                                      flags | MAP_FIXED,
  3888                                      -1, 0);
  3889       if (Verbose) {
  3890         fprintf(stderr, "SafePoint Polling Page address: %p (wish) => %p\n",
  3891                 address_wishes[i], map_address + (ssize_t)page_size);
  3894       if (map_address + (ssize_t)page_size == address_wishes[i]) {
  3895         // map succeeded and map_address is at wished address, exit loop.
  3896         break;
  3899       if (map_address != (address) MAP_FAILED) {
  3900         // map succeeded, but polling_page is not at wished address, unmap and continue.
  3901         ::munmap(map_address, map_size);
  3902         map_address = (address) MAP_FAILED;
  3904       // map failed, continue loop.
  3906   } // end OptimizePollingPageLocation
  3908   if (map_address == (address) MAP_FAILED) {
  3909     map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0);
  3911   guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page");
  3912   os::set_polling_page(map_address);
  3914   if (!UseMembar) {
  3915     address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  3916     guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
  3917     os::set_memory_serialize_page(mem_serialize_page);
  3919 #ifndef PRODUCT
  3920     if (Verbose && PrintMiscellaneous)
  3921       tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
  3922 #endif
  3925   // initialize suspend/resume support - must do this before signal_sets_init()
  3926   if (SR_initialize() != 0) {
  3927     perror("SR_initialize failed");
  3928     return JNI_ERR;
  3931   Aix::signal_sets_init();
  3932   Aix::install_signal_handlers();
  3934   // Check minimum allowable stack size for thread creation and to initialize
  3935   // the java system classes, including StackOverflowError - depends on page
  3936   // size. Add a page for compiler2 recursion in main thread.
  3937   // Add in 2*BytesPerWord times page size to account for VM stack during
  3938   // class initialization depending on 32 or 64 bit VM.
  3939   os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed,
  3940             (size_t)(StackYellowPages+StackRedPages+StackShadowPages +
  3941                      2*BytesPerWord COMPILER2_PRESENT(+1)) * Aix::page_size());
  3943   size_t threadStackSizeInBytes = ThreadStackSize * K;
  3944   if (threadStackSizeInBytes != 0 &&
  3945       threadStackSizeInBytes < os::Aix::min_stack_allowed) {
  3946         tty->print_cr("\nThe stack size specified is too small, "
  3947                       "Specify at least %dk",
  3948                       os::Aix::min_stack_allowed / K);
  3949         return JNI_ERR;
  3952   // Make the stack size a multiple of the page size so that
  3953   // the yellow/red zones can be guarded.
  3954   // note that this can be 0, if no default stacksize was set
  3955   JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size()));
  3957   Aix::libpthread_init();
  3959   if (MaxFDLimit) {
  3960     // set the number of file descriptors to max. print out error
  3961     // if getrlimit/setrlimit fails but continue regardless.
  3962     struct rlimit nbr_files;
  3963     int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
  3964     if (status != 0) {
  3965       if (PrintMiscellaneous && (Verbose || WizardMode))
  3966         perror("os::init_2 getrlimit failed");
  3967     } else {
  3968       nbr_files.rlim_cur = nbr_files.rlim_max;
  3969       status = setrlimit(RLIMIT_NOFILE, &nbr_files);
  3970       if (status != 0) {
  3971         if (PrintMiscellaneous && (Verbose || WizardMode))
  3972           perror("os::init_2 setrlimit failed");
  3977   if (PerfAllowAtExitRegistration) {
  3978     // only register atexit functions if PerfAllowAtExitRegistration is set.
  3979     // atexit functions can be delayed until process exit time, which
  3980     // can be problematic for embedded VM situations. Embedded VMs should
  3981     // call DestroyJavaVM() to assure that VM resources are released.
  3983     // note: perfMemory_exit_helper atexit function may be removed in
  3984     // the future if the appropriate cleanup code can be added to the
  3985     // VM_Exit VMOperation's doit method.
  3986     if (atexit(perfMemory_exit_helper) != 0) {
  3987       warning("os::init_2 atexit(perfMemory_exit_helper) failed");
  3991   return JNI_OK;
  3994 // this is called at the end of vm_initialization
  3995 void os::init_3(void) {
  3996   return;
  3999 // Mark the polling page as unreadable
  4000 void os::make_polling_page_unreadable(void) {
  4001   if (!guard_memory((char*)_polling_page, Aix::page_size())) {
  4002     fatal("Could not disable polling page");
  4004 };
  4006 // Mark the polling page as readable
  4007 void os::make_polling_page_readable(void) {
  4008   // Changed according to os_linux.cpp.
  4009   if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
  4010     fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page));
  4012 };
  4014 int os::active_processor_count() {
  4015   int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
  4016   assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
  4017   return online_cpus;
  4020 void os::set_native_thread_name(const char *name) {
  4021   // Not yet implemented.
  4022   return;
  4025 bool os::distribute_processes(uint length, uint* distribution) {
  4026   // Not yet implemented.
  4027   return false;
  4030 bool os::bind_to_processor(uint processor_id) {
  4031   // Not yet implemented.
  4032   return false;
  4035 void os::SuspendedThreadTask::internal_do_task() {
  4036   if (do_suspend(_thread->osthread())) {
  4037     SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
  4038     do_task(context);
  4039     do_resume(_thread->osthread());
  4043 class PcFetcher : public os::SuspendedThreadTask {
  4044 public:
  4045   PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
  4046   ExtendedPC result();
  4047 protected:
  4048   void do_task(const os::SuspendedThreadTaskContext& context);
  4049 private:
  4050   ExtendedPC _epc;
  4051 };
  4053 ExtendedPC PcFetcher::result() {
  4054   guarantee(is_done(), "task is not done yet.");
  4055   return _epc;
  4058 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
  4059   Thread* thread = context.thread();
  4060   OSThread* osthread = thread->osthread();
  4061   if (osthread->ucontext() != NULL) {
  4062     _epc = os::Aix::ucontext_get_pc((ucontext_t *) context.ucontext());
  4063   } else {
  4064     // NULL context is unexpected, double-check this is the VMThread.
  4065     guarantee(thread->is_VM_thread(), "can only be called for VMThread");
  4069 // Suspends the target using the signal mechanism and then grabs the PC before
  4070 // resuming the target. Used by the flat-profiler only
  4071 ExtendedPC os::get_thread_pc(Thread* thread) {
  4072   // Make sure that it is called by the watcher for the VMThread.
  4073   assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
  4074   assert(thread->is_VM_thread(), "Can only be called for VMThread");
  4076   PcFetcher fetcher(thread);
  4077   fetcher.run();
  4078   return fetcher.result();
  4081 // Not neede on Aix.
  4082 // int os::Aix::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) {
  4083 // }
  4085 ////////////////////////////////////////////////////////////////////////////////
  4086 // debug support
  4088 static address same_page(address x, address y) {
  4089   intptr_t page_bits = -os::vm_page_size();
  4090   if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
  4091     return x;
  4092   else if (x > y)
  4093     return (address)(intptr_t(y) | ~page_bits) + 1;
  4094   else
  4095     return (address)(intptr_t(y) & page_bits);
  4098 bool os::find(address addr, outputStream* st) {
  4100   st->print(PTR_FORMAT ": ", addr);
  4102   const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
  4103   if (lib) {
  4104     lib->print(st);
  4105     return true;
  4106   } else {
  4107     lib = LoadedLibraries::find_for_data_address(addr);
  4108     if (lib) {
  4109       lib->print(st);
  4110       return true;
  4111     } else {
  4112       st->print_cr("(outside any module)");
  4116   return false;
  4119 ////////////////////////////////////////////////////////////////////////////////
  4120 // misc
  4122 // This does not do anything on Aix. This is basically a hook for being
  4123 // able to use structured exception handling (thread-local exception filters)
  4124 // on, e.g., Win32.
  4125 void
  4126 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
  4127                          JavaCallArguments* args, Thread* thread) {
  4128   f(value, method, args, thread);
  4131 void os::print_statistics() {
  4134 int os::message_box(const char* title, const char* message) {
  4135   int i;
  4136   fdStream err(defaultStream::error_fd());
  4137   for (i = 0; i < 78; i++) err.print_raw("=");
  4138   err.cr();
  4139   err.print_raw_cr(title);
  4140   for (i = 0; i < 78; i++) err.print_raw("-");
  4141   err.cr();
  4142   err.print_raw_cr(message);
  4143   for (i = 0; i < 78; i++) err.print_raw("=");
  4144   err.cr();
  4146   char buf[16];
  4147   // Prevent process from exiting upon "read error" without consuming all CPU
  4148   while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
  4150   return buf[0] == 'y' || buf[0] == 'Y';
  4153 int os::stat(const char *path, struct stat *sbuf) {
  4154   char pathbuf[MAX_PATH];
  4155   if (strlen(path) > MAX_PATH - 1) {
  4156     errno = ENAMETOOLONG;
  4157     return -1;
  4159   os::native_path(strcpy(pathbuf, path));
  4160   return ::stat(pathbuf, sbuf);
  4163 bool os::check_heap(bool force) {
  4164   return true;
  4167 // int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
  4168 //   return ::vsnprintf(buf, count, format, args);
  4169 // }
  4171 // Is a (classpath) directory empty?
  4172 bool os::dir_is_empty(const char* path) {
  4173   DIR *dir = NULL;
  4174   struct dirent *ptr;
  4176   dir = opendir(path);
  4177   if (dir == NULL) return true;
  4179   /* Scan the directory */
  4180   bool result = true;
  4181   char buf[sizeof(struct dirent) + MAX_PATH];
  4182   while (result && (ptr = ::readdir(dir)) != NULL) {
  4183     if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
  4184       result = false;
  4187   closedir(dir);
  4188   return result;
  4191 // This code originates from JDK's sysOpen and open64_w
  4192 // from src/solaris/hpi/src/system_md.c
  4194 #ifndef O_DELETE
  4195 #define O_DELETE 0x10000
  4196 #endif
  4198 // Open a file. Unlink the file immediately after open returns
  4199 // if the specified oflag has the O_DELETE flag set.
  4200 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
  4202 int os::open(const char *path, int oflag, int mode) {
  4204   if (strlen(path) > MAX_PATH - 1) {
  4205     errno = ENAMETOOLONG;
  4206     return -1;
  4208   int fd;
  4209   int o_delete = (oflag & O_DELETE);
  4210   oflag = oflag & ~O_DELETE;
  4212   fd = ::open64(path, oflag, mode);
  4213   if (fd == -1) return -1;
  4215   // If the open succeeded, the file might still be a directory.
  4217     struct stat64 buf64;
  4218     int ret = ::fstat64(fd, &buf64);
  4219     int st_mode = buf64.st_mode;
  4221     if (ret != -1) {
  4222       if ((st_mode & S_IFMT) == S_IFDIR) {
  4223         errno = EISDIR;
  4224         ::close(fd);
  4225         return -1;
  4227     } else {
  4228       ::close(fd);
  4229       return -1;
  4233   // All file descriptors that are opened in the JVM and not
  4234   // specifically destined for a subprocess should have the
  4235   // close-on-exec flag set. If we don't set it, then careless 3rd
  4236   // party native code might fork and exec without closing all
  4237   // appropriate file descriptors (e.g. as we do in closeDescriptors in
  4238   // UNIXProcess.c), and this in turn might:
  4239   //
  4240   // - cause end-of-file to fail to be detected on some file
  4241   //   descriptors, resulting in mysterious hangs, or
  4242   //
  4243   // - might cause an fopen in the subprocess to fail on a system
  4244   //   suffering from bug 1085341.
  4245   //
  4246   // (Yes, the default setting of the close-on-exec flag is a Unix
  4247   // design flaw.)
  4248   //
  4249   // See:
  4250   // 1085341: 32-bit stdio routines should support file descriptors >255
  4251   // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
  4252   // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
  4253 #ifdef FD_CLOEXEC
  4255     int flags = ::fcntl(fd, F_GETFD);
  4256     if (flags != -1)
  4257       ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
  4259 #endif
  4261   if (o_delete != 0) {
  4262     ::unlink(path);
  4264   return fd;
  4268 // create binary file, rewriting existing file if required
  4269 int os::create_binary_file(const char* path, bool rewrite_existing) {
  4270   int oflags = O_WRONLY | O_CREAT;
  4271   if (!rewrite_existing) {
  4272     oflags |= O_EXCL;
  4274   return ::open64(path, oflags, S_IREAD | S_IWRITE);
  4277 // return current position of file pointer
  4278 jlong os::current_file_offset(int fd) {
  4279   return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
  4282 // move file pointer to the specified offset
  4283 jlong os::seek_to_file_offset(int fd, jlong offset) {
  4284   return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
  4287 // This code originates from JDK's sysAvailable
  4288 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
  4290 int os::available(int fd, jlong *bytes) {
  4291   jlong cur, end;
  4292   int mode;
  4293   struct stat64 buf64;
  4295   if (::fstat64(fd, &buf64) >= 0) {
  4296     mode = buf64.st_mode;
  4297     if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
  4298       // XXX: is the following call interruptible? If so, this might
  4299       // need to go through the INTERRUPT_IO() wrapper as for other
  4300       // blocking, interruptible calls in this file.
  4301       int n;
  4302       if (::ioctl(fd, FIONREAD, &n) >= 0) {
  4303         *bytes = n;
  4304         return 1;
  4308   if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
  4309     return 0;
  4310   } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
  4311     return 0;
  4312   } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
  4313     return 0;
  4315   *bytes = end - cur;
  4316   return 1;
  4319 int os::socket_available(int fd, jint *pbytes) {
  4320   // Linux doc says EINTR not returned, unlike Solaris
  4321   int ret = ::ioctl(fd, FIONREAD, pbytes);
  4323   //%% note ioctl can return 0 when successful, JVM_SocketAvailable
  4324   // is expected to return 0 on failure and 1 on success to the jdk.
  4325   return (ret < 0) ? 0 : 1;
  4328 // Map a block of memory.
  4329 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
  4330                         char *addr, size_t bytes, bool read_only,
  4331                         bool allow_exec) {
  4332   Unimplemented();
  4333   return NULL;
  4337 // Remap a block of memory.
  4338 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
  4339                           char *addr, size_t bytes, bool read_only,
  4340                           bool allow_exec) {
  4341   // same as map_memory() on this OS
  4342   return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
  4343                         allow_exec);
  4346 // Unmap a block of memory.
  4347 bool os::pd_unmap_memory(char* addr, size_t bytes) {
  4348   return munmap(addr, bytes) == 0;
  4351 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
  4352 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
  4353 // of a thread.
  4354 //
  4355 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
  4356 // the fast estimate available on the platform.
  4358 jlong os::current_thread_cpu_time() {
  4359   // return user + sys since the cost is the same
  4360   const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */);
  4361   assert(n >= 0, "negative CPU time");
  4362   return n;
  4365 jlong os::thread_cpu_time(Thread* thread) {
  4366   // consistent with what current_thread_cpu_time() returns
  4367   const jlong n = os::thread_cpu_time(thread, true /* user + sys */);
  4368   assert(n >= 0, "negative CPU time");
  4369   return n;
  4372 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
  4373   const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
  4374   assert(n >= 0, "negative CPU time");
  4375   return n;
  4378 static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) {
  4379   bool error = false;
  4381   jlong sys_time = 0;
  4382   jlong user_time = 0;
  4384   // reimplemented using getthrds64().
  4385   //
  4386   // goes like this:
  4387   // For the thread in question, get the kernel thread id. Then get the
  4388   // kernel thread statistics using that id.
  4389   //
  4390   // This only works of course when no pthread scheduling is used,
  4391   // ie there is a 1:1 relationship to kernel threads.
  4392   // On AIX, see AIXTHREAD_SCOPE variable.
  4394   pthread_t pthtid = thread->osthread()->pthread_id();
  4396   // retrieve kernel thread id for the pthread:
  4397   tid64_t tid = 0;
  4398   struct __pthrdsinfo pinfo;
  4399   // I just love those otherworldly IBM APIs which force me to hand down
  4400   // dummy buffers for stuff I dont care for...
  4401   char dummy[1];
  4402   int dummy_size = sizeof(dummy);
  4403   if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo),
  4404                           dummy, &dummy_size) == 0) {
  4405     tid = pinfo.__pi_tid;
  4406   } else {
  4407     tty->print_cr("pthread_getthrds_np failed.");
  4408     error = true;
  4411   // retrieve kernel timing info for that kernel thread
  4412   if (!error) {
  4413     struct thrdentry64 thrdentry;
  4414     if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) {
  4415       sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL;
  4416       user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL;
  4417     } else {
  4418       tty->print_cr("pthread_getthrds_np failed.");
  4419       error = true;
  4423   if (p_sys_time) {
  4424     *p_sys_time = sys_time;
  4427   if (p_user_time) {
  4428     *p_user_time = user_time;
  4431   if (error) {
  4432     return false;
  4435   return true;
  4438 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
  4439   jlong sys_time;
  4440   jlong user_time;
  4442   if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) {
  4443     return -1;
  4446   return user_sys_cpu_time ? sys_time + user_time : user_time;
  4449 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
  4450   info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
  4451   info_ptr->may_skip_backward = false;     // elapsed time not wall time
  4452   info_ptr->may_skip_forward = false;      // elapsed time not wall time
  4453   info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
  4456 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
  4457   info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
  4458   info_ptr->may_skip_backward = false;     // elapsed time not wall time
  4459   info_ptr->may_skip_forward = false;      // elapsed time not wall time
  4460   info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
  4463 bool os::is_thread_cpu_time_supported() {
  4464   return true;
  4467 // System loadavg support. Returns -1 if load average cannot be obtained.
  4468 // For now just return the system wide load average (no processor sets).
  4469 int os::loadavg(double values[], int nelem) {
  4471   // Implemented using libperfstat on AIX.
  4473   guarantee(nelem >= 0 && nelem <= 3, "argument error");
  4474   guarantee(values, "argument error");
  4476   if (os::Aix::on_pase()) {
  4477     Unimplemented();
  4478     return -1;
  4479   } else {
  4480     // AIX: use libperfstat
  4481     //
  4482     // See also:
  4483     // http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_cputot.htm
  4484     // /usr/include/libperfstat.h:
  4486     // Use the already AIX version independent get_cpuinfo.
  4487     os::Aix::cpuinfo_t ci;
  4488     if (os::Aix::get_cpuinfo(&ci)) {
  4489       for (int i = 0; i < nelem; i++) {
  4490         values[i] = ci.loadavg[i];
  4492     } else {
  4493       return -1;
  4495     return nelem;
  4499 void os::pause() {
  4500   char filename[MAX_PATH];
  4501   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
  4502     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
  4503   } else {
  4504     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
  4507   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  4508   if (fd != -1) {
  4509     struct stat buf;
  4510     ::close(fd);
  4511     while (::stat(filename, &buf) == 0) {
  4512       (void)::poll(NULL, 0, 100);
  4514   } else {
  4515     jio_fprintf(stderr,
  4516       "Could not open pause file '%s', continuing immediately.\n", filename);
  4520 bool os::Aix::is_primordial_thread() {
  4521   if (pthread_self() == (pthread_t)1) {
  4522     return true;
  4523   } else {
  4524     return false;
  4528 // OS recognitions (PASE/AIX, OS level) call this before calling any
  4529 // one of Aix::on_pase(), Aix::os_version() static
  4530 void os::Aix::initialize_os_info() {
  4532   assert(_on_pase == -1 && _os_version == -1, "already called.");
  4534   struct utsname uts;
  4535   memset(&uts, 0, sizeof(uts));
  4536   strcpy(uts.sysname, "?");
  4537   if (::uname(&uts) == -1) {
  4538     fprintf(stderr, "uname failed (%d)\n", errno);
  4539     guarantee(0, "Could not determine whether we run on AIX or PASE");
  4540   } else {
  4541     if (Verbose) {
  4542       fprintf(stderr,"uname says: sysname \"%s\" version \"%s\" release \"%s\" "
  4543               "node \"%s\" machine \"%s\"\n",
  4544               uts.sysname, uts.version, uts.release, uts.nodename, uts.machine);
  4546     const int major = atoi(uts.version);
  4547     assert(major > 0, "invalid OS version");
  4548     const int minor = atoi(uts.release);
  4549     assert(minor > 0, "invalid OS release");
  4550     _os_version = (major << 8) | minor;
  4551     if (strcmp(uts.sysname, "OS400") == 0) {
  4552       Unimplemented();
  4553     } else if (strcmp(uts.sysname, "AIX") == 0) {
  4554       // We run on AIX. We do not support versions older than AIX 5.3.
  4555       _on_pase = 0;
  4556       if (_os_version < 0x0503) {
  4557         fprintf(stderr, "AIX release older than AIX 5.3 not supported.\n");
  4558         assert(false, "AIX release too old.");
  4559       } else {
  4560         if (Verbose) {
  4561           fprintf(stderr, "We run on AIX %d.%d\n", major, minor);
  4564     } else {
  4565       assert(false, "unknown OS");
  4569   guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release");
  4571 } // end: os::Aix::initialize_os_info()
  4573 // Scan environment for important settings which might effect the VM.
  4574 // Trace out settings. Warn about invalid settings and/or correct them.
  4575 //
  4576 // Must run after os::Aix::initialue_os_info().
  4577 void os::Aix::scan_environment() {
  4579   char* p;
  4580   int rc;
  4582   // Warn explicity if EXTSHM=ON is used. That switch changes how
  4583   // System V shared memory behaves. One effect is that page size of
  4584   // shared memory cannot be change dynamically, effectivly preventing
  4585   // large pages from working.
  4586   // This switch was needed on AIX 32bit, but on AIX 64bit the general
  4587   // recommendation is (in OSS notes) to switch it off.
  4588   p = ::getenv("EXTSHM");
  4589   if (Verbose) {
  4590     fprintf(stderr, "EXTSHM=%s.\n", p ? p : "<unset>");
  4592   if (p && strcmp(p, "ON") == 0) {
  4593     fprintf(stderr, "Unsupported setting: EXTSHM=ON. Large Page support will be disabled.\n");
  4594     _extshm = 1;
  4595   } else {
  4596     _extshm = 0;
  4599   // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs.
  4600   // Not tested, not supported.
  4601   //
  4602   // Note that it might be worth the trouble to test and to require it, if only to
  4603   // get useful return codes for mprotect.
  4604   //
  4605   // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before
  4606   // exec() ? before loading the libjvm ? ....)
  4607   p = ::getenv("XPG_SUS_ENV");
  4608   if (Verbose) {
  4609     fprintf(stderr, "XPG_SUS_ENV=%s.\n", p ? p : "<unset>");
  4611   if (p && strcmp(p, "ON") == 0) {
  4612     _xpg_sus_mode = 1;
  4613     fprintf(stderr, "Unsupported setting: XPG_SUS_ENV=ON\n");
  4614     // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to
  4615     // clobber address ranges. If we ever want to support that, we have to do some
  4616     // testing first.
  4617     guarantee(false, "XPG_SUS_ENV=ON not supported");
  4618   } else {
  4619     _xpg_sus_mode = 0;
  4622   // Switch off AIX internal (pthread) guard pages. This has
  4623   // immediate effect for any pthread_create calls which follow.
  4624   p = ::getenv("AIXTHREAD_GUARDPAGES");
  4625   if (Verbose) {
  4626     fprintf(stderr, "AIXTHREAD_GUARDPAGES=%s.\n", p ? p : "<unset>");
  4627     fprintf(stderr, "setting AIXTHREAD_GUARDPAGES=0.\n");
  4629   rc = ::putenv("AIXTHREAD_GUARDPAGES=0");
  4630   guarantee(rc == 0, "");
  4632 } // end: os::Aix::scan_environment()
  4634 // PASE: initialize the libo4 library (AS400 PASE porting library).
  4635 void os::Aix::initialize_libo4() {
  4636   Unimplemented();
  4639 // AIX: initialize the libperfstat library (we load this dynamically
  4640 // because it is only available on AIX.
  4641 void os::Aix::initialize_libperfstat() {
  4643   assert(os::Aix::on_aix(), "AIX only");
  4645   if (!libperfstat::init()) {
  4646     fprintf(stderr, "libperfstat initialization failed.\n");
  4647     assert(false, "libperfstat initialization failed");
  4648   } else {
  4649     if (Verbose) {
  4650       fprintf(stderr, "libperfstat initialized.\n");
  4653 } // end: os::Aix::initialize_libperfstat
  4655 /////////////////////////////////////////////////////////////////////////////
  4656 // thread stack
  4658 // function to query the current stack size using pthread_getthrds_np
  4659 //
  4660 // ! do not change anything here unless you know what you are doing !
  4661 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
  4663   // This only works when invoked on a pthread. As we agreed not to use
  4664   // primordial threads anyway, I assert here
  4665   guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread");
  4667   // information about this api can be found (a) in the pthread.h header and
  4668   // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
  4669   //
  4670   // The use of this API to find out the current stack is kind of undefined.
  4671   // But after a lot of tries and asking IBM about it, I concluded that it is safe
  4672   // enough for cases where I let the pthread library create its stacks. For cases
  4673   // where I create an own stack and pass this to pthread_create, it seems not to
  4674   // work (the returned stack size in that case is 0).
  4676   pthread_t tid = pthread_self();
  4677   struct __pthrdsinfo pinfo;
  4678   char dummy[1]; // we only need this to satisfy the api and to not get E
  4679   int dummy_size = sizeof(dummy);
  4681   memset(&pinfo, 0, sizeof(pinfo));
  4683   const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
  4684                                       sizeof(pinfo), dummy, &dummy_size);
  4686   if (rc != 0) {
  4687     fprintf(stderr, "pthread_getthrds_np failed (%d)\n", rc);
  4688     guarantee(0, "pthread_getthrds_np failed");
  4691   guarantee(pinfo.__pi_stackend, "returned stack base invalid");
  4693   // the following can happen when invoking pthread_getthrds_np on a pthread running on a user provided stack
  4694   // (when handing down a stack to pthread create, see pthread_attr_setstackaddr).
  4695   // Not sure what to do here - I feel inclined to forbid this use case completely.
  4696   guarantee(pinfo.__pi_stacksize, "returned stack size invalid");
  4698   // On AIX, stacks are not necessarily page aligned so round the base and size accordingly
  4699   if (p_stack_base) {
  4700     (*p_stack_base) = (address) align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size());
  4703   if (p_stack_size) {
  4704     (*p_stack_size) = pinfo.__pi_stacksize - os::Aix::stack_page_size();
  4707 #ifndef PRODUCT
  4708   if (Verbose) {
  4709     fprintf(stderr,
  4710             "query_stack_dimensions() -> real stack_base=" INTPTR_FORMAT ", real stack_addr=" INTPTR_FORMAT
  4711             ", real stack_size=" INTPTR_FORMAT
  4712             ", stack_base=" INTPTR_FORMAT ", stack_size=" INTPTR_FORMAT "\n",
  4713             (intptr_t)pinfo.__pi_stackend, (intptr_t)pinfo.__pi_stackaddr, pinfo.__pi_stacksize,
  4714             (intptr_t)align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()),
  4715             pinfo.__pi_stacksize - os::Aix::stack_page_size());
  4717 #endif
  4719 } // end query_stack_dimensions
  4721 // get the current stack base from the OS (actually, the pthread library)
  4722 address os::current_stack_base() {
  4723   address p;
  4724   query_stack_dimensions(&p, 0);
  4725   return p;
  4728 // get the current stack size from the OS (actually, the pthread library)
  4729 size_t os::current_stack_size() {
  4730   size_t s;
  4731   query_stack_dimensions(0, &s);
  4732   return s;
  4735 // Refer to the comments in os_solaris.cpp park-unpark.
  4736 //
  4737 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
  4738 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
  4739 // For specifics regarding the bug see GLIBC BUGID 261237 :
  4740 //    http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
  4741 // Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
  4742 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
  4743 // is used. (The simple C test-case provided in the GLIBC bug report manifests the
  4744 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
  4745 // and monitorenter when we're using 1-0 locking. All those operations may result in
  4746 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
  4747 // of libpthread avoids the problem, but isn't practical.
  4748 //
  4749 // Possible remedies:
  4750 //
  4751 // 1.   Establish a minimum relative wait time. 50 to 100 msecs seems to work.
  4752 //      This is palliative and probabilistic, however. If the thread is preempted
  4753 //      between the call to compute_abstime() and pthread_cond_timedwait(), more
  4754 //      than the minimum period may have passed, and the abstime may be stale (in the
  4755 //      past) resultin in a hang. Using this technique reduces the odds of a hang
  4756 //      but the JVM is still vulnerable, particularly on heavily loaded systems.
  4757 //
  4758 // 2.   Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
  4759 //      of the usual flag-condvar-mutex idiom. The write side of the pipe is set
  4760 //      NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
  4761 //      reduces to poll()+read(). This works well, but consumes 2 FDs per extant
  4762 //      thread.
  4763 //
  4764 // 3.   Embargo pthread_cond_timedwait() and implement a native "chron" thread
  4765 //      that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
  4766 //      a timeout request to the chron thread and then blocking via pthread_cond_wait().
  4767 //      This also works well. In fact it avoids kernel-level scalability impediments
  4768 //      on certain platforms that don't handle lots of active pthread_cond_timedwait()
  4769 //      timers in a graceful fashion.
  4770 //
  4771 // 4.   When the abstime value is in the past it appears that control returns
  4772 //      correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
  4773 //      Subsequent timedwait/wait calls may hang indefinitely. Given that, we
  4774 //      can avoid the problem by reinitializing the condvar -- by cond_destroy()
  4775 //      followed by cond_init() -- after all calls to pthread_cond_timedwait().
  4776 //      It may be possible to avoid reinitialization by checking the return
  4777 //      value from pthread_cond_timedwait(). In addition to reinitializing the
  4778 //      condvar we must establish the invariant that cond_signal() is only called
  4779 //      within critical sections protected by the adjunct mutex. This prevents
  4780 //      cond_signal() from "seeing" a condvar that's in the midst of being
  4781 //      reinitialized or that is corrupt. Sadly, this invariant obviates the
  4782 //      desirable signal-after-unlock optimization that avoids futile context switching.
  4783 //
  4784 //      I'm also concerned that some versions of NTPL might allocate an auxilliary
  4785 //      structure when a condvar is used or initialized. cond_destroy() would
  4786 //      release the helper structure. Our reinitialize-after-timedwait fix
  4787 //      put excessive stress on malloc/free and locks protecting the c-heap.
  4788 //
  4789 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
  4790 // It may be possible to refine (4) by checking the kernel and NTPL verisons
  4791 // and only enabling the work-around for vulnerable environments.
  4793 // utility to compute the abstime argument to timedwait:
  4794 // millis is the relative timeout time
  4795 // abstime will be the absolute timeout time
  4796 // TODO: replace compute_abstime() with unpackTime()
  4798 static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
  4799   if (millis < 0) millis = 0;
  4800   struct timeval now;
  4801   int status = gettimeofday(&now, NULL);
  4802   assert(status == 0, "gettimeofday");
  4803   jlong seconds = millis / 1000;
  4804   millis %= 1000;
  4805   if (seconds > 50000000) { // see man cond_timedwait(3T)
  4806     seconds = 50000000;
  4808   abstime->tv_sec = now.tv_sec  + seconds;
  4809   long       usec = now.tv_usec + millis * 1000;
  4810   if (usec >= 1000000) {
  4811     abstime->tv_sec += 1;
  4812     usec -= 1000000;
  4814   abstime->tv_nsec = usec * 1000;
  4815   return abstime;
  4819 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
  4820 // Conceptually TryPark() should be equivalent to park(0).
  4822 int os::PlatformEvent::TryPark() {
  4823   for (;;) {
  4824     const int v = _Event;
  4825     guarantee ((v == 0) || (v == 1), "invariant");
  4826     if (Atomic::cmpxchg (0, &_Event, v) == v) return v;
  4830 void os::PlatformEvent::park() {       // AKA "down()"
  4831   // Invariant: Only the thread associated with the Event/PlatformEvent
  4832   // may call park().
  4833   // TODO: assert that _Assoc != NULL or _Assoc == Self
  4834   int v;
  4835   for (;;) {
  4836     v = _Event;
  4837     if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
  4839   guarantee (v >= 0, "invariant");
  4840   if (v == 0) {
  4841     // Do this the hard way by blocking ...
  4842     int status = pthread_mutex_lock(_mutex);
  4843     assert_status(status == 0, status, "mutex_lock");
  4844     guarantee (_nParked == 0, "invariant");
  4845     ++ _nParked;
  4846     while (_Event < 0) {
  4847       status = pthread_cond_wait(_cond, _mutex);
  4848       assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait");
  4850     -- _nParked;
  4852     // In theory we could move the ST of 0 into _Event past the unlock(),
  4853     // but then we'd need a MEMBAR after the ST.
  4854     _Event = 0;
  4855     status = pthread_mutex_unlock(_mutex);
  4856     assert_status(status == 0, status, "mutex_unlock");
  4858   guarantee (_Event >= 0, "invariant");
  4861 int os::PlatformEvent::park(jlong millis) {
  4862   guarantee (_nParked == 0, "invariant");
  4864   int v;
  4865   for (;;) {
  4866     v = _Event;
  4867     if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
  4869   guarantee (v >= 0, "invariant");
  4870   if (v != 0) return OS_OK;
  4872   // We do this the hard way, by blocking the thread.
  4873   // Consider enforcing a minimum timeout value.
  4874   struct timespec abst;
  4875   compute_abstime(&abst, millis);
  4877   int ret = OS_TIMEOUT;
  4878   int status = pthread_mutex_lock(_mutex);
  4879   assert_status(status == 0, status, "mutex_lock");
  4880   guarantee (_nParked == 0, "invariant");
  4881   ++_nParked;
  4883   // Object.wait(timo) will return because of
  4884   // (a) notification
  4885   // (b) timeout
  4886   // (c) thread.interrupt
  4887   //
  4888   // Thread.interrupt and object.notify{All} both call Event::set.
  4889   // That is, we treat thread.interrupt as a special case of notification.
  4890   // The underlying Solaris implementation, cond_timedwait, admits
  4891   // spurious/premature wakeups, but the JLS/JVM spec prevents the
  4892   // JVM from making those visible to Java code. As such, we must
  4893   // filter out spurious wakeups. We assume all ETIME returns are valid.
  4894   //
  4895   // TODO: properly differentiate simultaneous notify+interrupt.
  4896   // In that case, we should propagate the notify to another waiter.
  4898   while (_Event < 0) {
  4899     status = pthread_cond_timedwait(_cond, _mutex, &abst);
  4900     assert_status(status == 0 || status == ETIMEDOUT,
  4901           status, "cond_timedwait");
  4902     if (!FilterSpuriousWakeups) break;         // previous semantics
  4903     if (status == ETIMEDOUT) break;
  4904     // We consume and ignore EINTR and spurious wakeups.
  4906   --_nParked;
  4907   if (_Event >= 0) {
  4908      ret = OS_OK;
  4910   _Event = 0;
  4911   status = pthread_mutex_unlock(_mutex);
  4912   assert_status(status == 0, status, "mutex_unlock");
  4913   assert (_nParked == 0, "invariant");
  4914   return ret;
  4917 void os::PlatformEvent::unpark() {
  4918   int v, AnyWaiters;
  4919   for (;;) {
  4920     v = _Event;
  4921     if (v > 0) {
  4922       // The LD of _Event could have reordered or be satisfied
  4923       // by a read-aside from this processor's write buffer.
  4924       // To avoid problems execute a barrier and then
  4925       // ratify the value.
  4926       OrderAccess::fence();
  4927       if (_Event == v) return;
  4928       continue;
  4930     if (Atomic::cmpxchg (v+1, &_Event, v) == v) break;
  4932   if (v < 0) {
  4933     // Wait for the thread associated with the event to vacate
  4934     int status = pthread_mutex_lock(_mutex);
  4935     assert_status(status == 0, status, "mutex_lock");
  4936     AnyWaiters = _nParked;
  4938     if (AnyWaiters != 0) {
  4939       // We intentional signal *after* dropping the lock
  4940       // to avoid a common class of futile wakeups.
  4941       status = pthread_cond_signal(_cond);
  4942       assert_status(status == 0, status, "cond_signal");
  4944     // Mutex should be locked for pthread_cond_signal(_cond).
  4945     status = pthread_mutex_unlock(_mutex);
  4946     assert_status(status == 0, status, "mutex_unlock");
  4949   // Note that we signal() _after dropping the lock for "immortal" Events.
  4950   // This is safe and avoids a common class of futile wakeups. In rare
  4951   // circumstances this can cause a thread to return prematurely from
  4952   // cond_{timed}wait() but the spurious wakeup is benign and the victim will
  4953   // simply re-test the condition and re-park itself.
  4957 // JSR166
  4958 // -------------------------------------------------------
  4960 //
  4961 // The solaris and linux implementations of park/unpark are fairly
  4962 // conservative for now, but can be improved. They currently use a
  4963 // mutex/condvar pair, plus a a count.
  4964 // Park decrements count if > 0, else does a condvar wait. Unpark
  4965 // sets count to 1 and signals condvar. Only one thread ever waits
  4966 // on the condvar. Contention seen when trying to park implies that someone
  4967 // is unparking you, so don't wait. And spurious returns are fine, so there
  4968 // is no need to track notifications.
  4969 //
  4971 #define MAX_SECS 100000000
  4972 //
  4973 // This code is common to linux and solaris and will be moved to a
  4974 // common place in dolphin.
  4975 //
  4976 // The passed in time value is either a relative time in nanoseconds
  4977 // or an absolute time in milliseconds. Either way it has to be unpacked
  4978 // into suitable seconds and nanoseconds components and stored in the
  4979 // given timespec structure.
  4980 // Given time is a 64-bit value and the time_t used in the timespec is only
  4981 // a signed-32-bit value (except on 64-bit Linux) we have to watch for
  4982 // overflow if times way in the future are given. Further on Solaris versions
  4983 // prior to 10 there is a restriction (see cond_timedwait) that the specified
  4984 // number of seconds, in abstime, is less than current_time + 100,000,000.
  4985 // As it will be 28 years before "now + 100000000" will overflow we can
  4986 // ignore overflow and just impose a hard-limit on seconds using the value
  4987 // of "now + 100,000,000". This places a limit on the timeout of about 3.17
  4988 // years from "now".
  4989 //
  4991 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
  4992   assert (time > 0, "convertTime");
  4994   struct timeval now;
  4995   int status = gettimeofday(&now, NULL);
  4996   assert(status == 0, "gettimeofday");
  4998   time_t max_secs = now.tv_sec + MAX_SECS;
  5000   if (isAbsolute) {
  5001     jlong secs = time / 1000;
  5002     if (secs > max_secs) {
  5003       absTime->tv_sec = max_secs;
  5005     else {
  5006       absTime->tv_sec = secs;
  5008     absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
  5010   else {
  5011     jlong secs = time / NANOSECS_PER_SEC;
  5012     if (secs >= MAX_SECS) {
  5013       absTime->tv_sec = max_secs;
  5014       absTime->tv_nsec = 0;
  5016     else {
  5017       absTime->tv_sec = now.tv_sec + secs;
  5018       absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
  5019       if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
  5020         absTime->tv_nsec -= NANOSECS_PER_SEC;
  5021         ++absTime->tv_sec; // note: this must be <= max_secs
  5025   assert(absTime->tv_sec >= 0, "tv_sec < 0");
  5026   assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
  5027   assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
  5028   assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
  5031 void Parker::park(bool isAbsolute, jlong time) {
  5032   // Optional fast-path check:
  5033   // Return immediately if a permit is available.
  5034   if (_counter > 0) {
  5035       _counter = 0;
  5036       OrderAccess::fence();
  5037       return;
  5040   Thread* thread = Thread::current();
  5041   assert(thread->is_Java_thread(), "Must be JavaThread");
  5042   JavaThread *jt = (JavaThread *)thread;
  5044   // Optional optimization -- avoid state transitions if there's an interrupt pending.
  5045   // Check interrupt before trying to wait
  5046   if (Thread::is_interrupted(thread, false)) {
  5047     return;
  5050   // Next, demultiplex/decode time arguments
  5051   timespec absTime;
  5052   if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
  5053     return;
  5055   if (time > 0) {
  5056     unpackTime(&absTime, isAbsolute, time);
  5060   // Enter safepoint region
  5061   // Beware of deadlocks such as 6317397.
  5062   // The per-thread Parker:: mutex is a classic leaf-lock.
  5063   // In particular a thread must never block on the Threads_lock while
  5064   // holding the Parker:: mutex. If safepoints are pending both the
  5065   // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
  5066   ThreadBlockInVM tbivm(jt);
  5068   // Don't wait if cannot get lock since interference arises from
  5069   // unblocking. Also. check interrupt before trying wait
  5070   if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
  5071     return;
  5074   int status;
  5075   if (_counter > 0) { // no wait needed
  5076     _counter = 0;
  5077     status = pthread_mutex_unlock(_mutex);
  5078     assert (status == 0, "invariant");
  5079     OrderAccess::fence();
  5080     return;
  5083 #ifdef ASSERT
  5084   // Don't catch signals while blocked; let the running threads have the signals.
  5085   // (This allows a debugger to break into the running thread.)
  5086   sigset_t oldsigs;
  5087   sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals();
  5088   pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
  5089 #endif
  5091   OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
  5092   jt->set_suspend_equivalent();
  5093   // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
  5095   if (time == 0) {
  5096     status = pthread_cond_wait (_cond, _mutex);
  5097   } else {
  5098     status = pthread_cond_timedwait (_cond, _mutex, &absTime);
  5099     if (status != 0 && WorkAroundNPTLTimedWaitHang) {
  5100       pthread_cond_destroy (_cond);
  5101       pthread_cond_init    (_cond, NULL);
  5104   assert_status(status == 0 || status == EINTR ||
  5105                 status == ETIME || status == ETIMEDOUT,
  5106                 status, "cond_timedwait");
  5108 #ifdef ASSERT
  5109   pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
  5110 #endif
  5112   _counter = 0;
  5113   status = pthread_mutex_unlock(_mutex);
  5114   assert_status(status == 0, status, "invariant");
  5115   // If externally suspended while waiting, re-suspend
  5116   if (jt->handle_special_suspend_equivalent_condition()) {
  5117     jt->java_suspend_self();
  5120   OrderAccess::fence();
  5123 void Parker::unpark() {
  5124   int s, status;
  5125   status = pthread_mutex_lock(_mutex);
  5126   assert (status == 0, "invariant");
  5127   s = _counter;
  5128   _counter = 1;
  5129   if (s < 1) {
  5130     if (WorkAroundNPTLTimedWaitHang) {
  5131       status = pthread_cond_signal (_cond);
  5132       assert (status == 0, "invariant");
  5133       status = pthread_mutex_unlock(_mutex);
  5134       assert (status == 0, "invariant");
  5135     } else {
  5136       status = pthread_mutex_unlock(_mutex);
  5137       assert (status == 0, "invariant");
  5138       status = pthread_cond_signal (_cond);
  5139       assert (status == 0, "invariant");
  5141   } else {
  5142     pthread_mutex_unlock(_mutex);
  5143     assert (status == 0, "invariant");
  5148 extern char** environ;
  5150 // Run the specified command in a separate process. Return its exit value,
  5151 // or -1 on failure (e.g. can't fork a new process).
  5152 // Unlike system(), this function can be called from signal handler. It
  5153 // doesn't block SIGINT et al.
  5154 int os::fork_and_exec(char* cmd) {
  5155   char * argv[4] = {"sh", "-c", cmd, NULL};
  5157   pid_t pid = fork();
  5159   if (pid < 0) {
  5160     // fork failed
  5161     return -1;
  5163   } else if (pid == 0) {
  5164     // child process
  5166     // try to be consistent with system(), which uses "/usr/bin/sh" on AIX
  5167     execve("/usr/bin/sh", argv, environ);
  5169     // execve failed
  5170     _exit(-1);
  5172   } else  {
  5173     // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
  5174     // care about the actual exit code, for now.
  5176     int status;
  5178     // Wait for the child process to exit.  This returns immediately if
  5179     // the child has already exited. */
  5180     while (waitpid(pid, &status, 0) < 0) {
  5181         switch (errno) {
  5182         case ECHILD: return 0;
  5183         case EINTR: break;
  5184         default: return -1;
  5188     if (WIFEXITED(status)) {
  5189        // The child exited normally; get its exit code.
  5190        return WEXITSTATUS(status);
  5191     } else if (WIFSIGNALED(status)) {
  5192        // The child exited because of a signal
  5193        // The best value to return is 0x80 + signal number,
  5194        // because that is what all Unix shells do, and because
  5195        // it allows callers to distinguish between process exit and
  5196        // process death by signal.
  5197        return 0x80 + WTERMSIG(status);
  5198     } else {
  5199        // Unknown exit code; pass it through
  5200        return status;
  5203   // Remove warning.
  5204   return -1;
  5207 // is_headless_jre()
  5208 //
  5209 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
  5210 // in order to report if we are running in a headless jre.
  5211 //
  5212 // Since JDK8 xawt/libmawt.so is moved into the same directory
  5213 // as libawt.so, and renamed libawt_xawt.so
  5214 bool os::is_headless_jre() {
  5215   struct stat statbuf;
  5216   char buf[MAXPATHLEN];
  5217   char libmawtpath[MAXPATHLEN];
  5218   const char *xawtstr  = "/xawt/libmawt.so";
  5219   const char *new_xawtstr = "/libawt_xawt.so";
  5221   char *p;
  5223   // Get path to libjvm.so
  5224   os::jvm_path(buf, sizeof(buf));
  5226   // Get rid of libjvm.so
  5227   p = strrchr(buf, '/');
  5228   if (p == NULL) return false;
  5229   else *p = '\0';
  5231   // Get rid of client or server
  5232   p = strrchr(buf, '/');
  5233   if (p == NULL) return false;
  5234   else *p = '\0';
  5236   // check xawt/libmawt.so
  5237   strcpy(libmawtpath, buf);
  5238   strcat(libmawtpath, xawtstr);
  5239   if (::stat(libmawtpath, &statbuf) == 0) return false;
  5241   // check libawt_xawt.so
  5242   strcpy(libmawtpath, buf);
  5243   strcat(libmawtpath, new_xawtstr);
  5244   if (::stat(libmawtpath, &statbuf) == 0) return false;
  5246   return true;
  5249 // Get the default path to the core file
  5250 // Returns the length of the string
  5251 int os::get_core_path(char* buffer, size_t bufferSize) {
  5252   const char* p = get_current_directory(buffer, bufferSize);
  5254   if (p == NULL) {
  5255     assert(p != NULL, "failed to get current directory");
  5256     return 0;
  5259   return strlen(buffer);
  5262 #ifndef PRODUCT
  5263 void TestReserveMemorySpecial_test() {
  5264   // No tests available for this platform
  5266 #endif

mercurial