hotspot/src/os/bsd/vm/os_bsd.cpp
changeset 10739 91935236600e
parent 10565 dc90c239f4ec
child 11161 ec855b5a23c2
equal deleted inserted replaced
10738:cc19612c6b9f 10739:91935236600e
   134 #if defined(__FreeBSD__) || defined(__NetBSD__)
   134 #if defined(__FreeBSD__) || defined(__NetBSD__)
   135 # include <elf.h>
   135 # include <elf.h>
   136 #endif
   136 #endif
   137 
   137 
   138 #ifdef __APPLE__
   138 #ifdef __APPLE__
   139 #include <mach/mach.h> // semaphore_* API
   139 # include <mach/mach.h> // semaphore_* API
   140 #include <mach-o/dyld.h>
   140 # include <mach-o/dyld.h>
       
   141 # include <sys/proc_info.h>
       
   142 # include <objc/objc-auto.h>
   141 #endif
   143 #endif
   142 
   144 
   143 #ifndef MAP_ANONYMOUS
   145 #ifndef MAP_ANONYMOUS
   144 #define MAP_ANONYMOUS MAP_ANON
   146 #define MAP_ANONYMOUS MAP_ANON
   145 #endif
   147 #endif
   383       fclose(fp);
   385       fclose(fp);
   384     }
   386     }
   385   }
   387   }
   386   _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
   388   _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
   387   assert(processor_count() > 0, "bsd error");
   389   assert(processor_count() > 0, "bsd error");
       
   390 }
       
   391 #endif
       
   392 
       
   393 #ifdef __APPLE__
       
   394 static const char *get_home() {
       
   395   const char *home_dir = ::getenv("HOME");
       
   396   if ((home_dir == NULL) || (*home_dir == '\0')) {
       
   397     struct passwd *passwd_info = getpwuid(geteuid());
       
   398     if (passwd_info != NULL) {
       
   399       home_dir = passwd_info->pw_dir;
       
   400     }
       
   401   }
       
   402 
       
   403   return home_dir;
   388 }
   404 }
   389 #endif
   405 #endif
   390 
   406 
   391 void os::init_system_properties_values() {
   407 void os::init_system_properties_values() {
   392 //  char arch[12];
   408 //  char arch[12];
   436 
   452 
   437 #define EXTENSIONS_DIR  "/lib/ext"
   453 #define EXTENSIONS_DIR  "/lib/ext"
   438 #define ENDORSED_DIR    "/lib/endorsed"
   454 #define ENDORSED_DIR    "/lib/endorsed"
   439 #define REG_DIR         "/usr/java/packages"
   455 #define REG_DIR         "/usr/java/packages"
   440 
   456 
       
   457 #ifdef __APPLE__
       
   458 #define SYS_EXTENSIONS_DIR   "/Library/Java/Extensions"
       
   459 #define SYS_EXTENSIONS_DIRS  SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
       
   460         const char *user_home_dir = get_home();
       
   461         // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir
       
   462         int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
       
   463             sizeof(SYS_EXTENSIONS_DIRS);
       
   464 #endif
       
   465 
   441   {
   466   {
   442     /* sysclasspath, java_home, dll_dir */
   467     /* sysclasspath, java_home, dll_dir */
   443     {
   468     {
   444         char *home_path;
   469         char *home_path;
   445         char *dll_path;
   470         char *dll_path;
   460         Arguments::set_dll_dir(dll_path);
   485         Arguments::set_dll_dir(dll_path);
   461 
   486 
   462         if (pslash != NULL) {
   487         if (pslash != NULL) {
   463             pslash = strrchr(buf, '/');
   488             pslash = strrchr(buf, '/');
   464             if (pslash != NULL) {
   489             if (pslash != NULL) {
   465                 *pslash = '\0';       /* get rid of /<arch> */
   490                 *pslash = '\0';       /* get rid of /<arch> (/lib on macosx) */
       
   491 #ifndef __APPLE__
   466                 pslash = strrchr(buf, '/');
   492                 pslash = strrchr(buf, '/');
   467                 if (pslash != NULL)
   493                 if (pslash != NULL)
   468                     *pslash = '\0';   /* get rid of /lib */
   494                     *pslash = '\0';   /* get rid of /lib */
       
   495 #endif
   469             }
   496             }
   470         }
   497         }
   471 
   498 
   472         home_path = malloc(strlen(buf) + 1);
   499         home_path = malloc(strlen(buf) + 1);
   473         if (home_path == NULL)
   500         if (home_path == NULL)
   498          * Construct the invariant part of ld_library_path. Note that the
   525          * Construct the invariant part of ld_library_path. Note that the
   499          * space for the colon and the trailing null are provided by the
   526          * space for the colon and the trailing null are provided by the
   500          * nulls included by the sizeof operator (so actually we allocate
   527          * nulls included by the sizeof operator (so actually we allocate
   501          * a byte more than necessary).
   528          * a byte more than necessary).
   502          */
   529          */
       
   530 #ifdef __APPLE__
       
   531         ld_library_path = (char *) malloc(system_ext_size);
       
   532         sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir);
       
   533 #else
   503         ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
   534         ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
   504             strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
   535             strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
   505         sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
   536         sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
       
   537 #endif
   506 
   538 
   507         /*
   539         /*
   508          * Get the user setting of LD_LIBRARY_PATH, and prepended it.  It
   540          * Get the user setting of LD_LIBRARY_PATH, and prepended it.  It
   509          * should always exist (until the legacy problem cited above is
   541          * should always exist (until the legacy problem cited above is
   510          * addressed).
   542          * addressed).
   511          */
   543          */
   512 #ifdef __APPLE__
   544 #ifdef __APPLE__
       
   545         // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper
       
   546         char *l = getenv("JAVA_LIBRARY_PATH");
       
   547         if (l != NULL) {
       
   548             char *t = ld_library_path;
       
   549             /* That's +1 for the colon and +1 for the trailing '\0' */
       
   550             ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
       
   551             sprintf(ld_library_path, "%s:%s", l, t);
       
   552             free(t);
       
   553         }
       
   554 
   513         char *v = getenv("DYLD_LIBRARY_PATH");
   555         char *v = getenv("DYLD_LIBRARY_PATH");
   514 #else
   556 #else
   515         char *v = getenv("LD_LIBRARY_PATH");
   557         char *v = getenv("LD_LIBRARY_PATH");
   516 #endif
   558 #endif
   517         if (v != NULL) {
   559         if (v != NULL) {
   518             char *t = ld_library_path;
   560             char *t = ld_library_path;
   519             /* That's +1 for the colon and +1 for the trailing '\0' */
   561             /* That's +1 for the colon and +1 for the trailing '\0' */
   520             ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
   562             ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
   521             sprintf(ld_library_path, "%s:%s", v, t);
   563             sprintf(ld_library_path, "%s:%s", v, t);
       
   564             free(t);
   522         }
   565         }
   523         Arguments::set_library_path(ld_library_path);
   566         Arguments::set_library_path(ld_library_path);
   524     }
   567     }
   525 
   568 
   526     /*
   569     /*
   529      * Note that the space for the colon and the trailing null are provided
   572      * Note that the space for the colon and the trailing null are provided
   530      * by the nulls included by the sizeof operator (so actually one byte more
   573      * by the nulls included by the sizeof operator (so actually one byte more
   531      * than necessary is allocated).
   574      * than necessary is allocated).
   532      */
   575      */
   533     {
   576     {
       
   577 #ifdef __APPLE__
       
   578         char *buf = malloc(strlen(Arguments::get_java_home()) +
       
   579             sizeof(EXTENSIONS_DIR) + system_ext_size);
       
   580         sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
       
   581             SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
       
   582 #else
   534         char *buf = malloc(strlen(Arguments::get_java_home()) +
   583         char *buf = malloc(strlen(Arguments::get_java_home()) +
   535             sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
   584             sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
   536         sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
   585         sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
   537             Arguments::get_java_home());
   586             Arguments::get_java_home());
       
   587 #endif
       
   588 
   538         Arguments::set_ext_dirs(buf);
   589         Arguments::set_ext_dirs(buf);
   539     }
   590     }
   540 
   591 
   541     /* Endorsed standards default directory. */
   592     /* Endorsed standards default directory. */
   542     {
   593     {
   545         sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
   596         sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
   546         Arguments::set_endorsed_dirs(buf);
   597         Arguments::set_endorsed_dirs(buf);
   547     }
   598     }
   548   }
   599   }
   549 
   600 
       
   601 #ifdef __APPLE__
       
   602 #undef SYS_EXTENSIONS_DIR
       
   603 #endif
   550 #undef malloc
   604 #undef malloc
   551 #undef getenv
   605 #undef getenv
   552 #undef EXTENSIONS_DIR
   606 #undef EXTENSIONS_DIR
   553 #undef ENDORSED_DIR
   607 #undef ENDORSED_DIR
   554 
   608 
   882     return true;
   936     return true;
   883   }
   937   }
   884 #endif
   938 #endif
   885 }
   939 }
   886 
   940 
       
   941 #ifdef __APPLE__
       
   942 // library handle for calling objc_registerThreadWithCollector()
       
   943 // without static linking to the libobjc library
       
   944 #define OBJC_LIB "/usr/lib/libobjc.dylib"
       
   945 #define OBJC_GCREGISTER "objc_registerThreadWithCollector"
       
   946 typedef void (*objc_registerThreadWithCollector_t)();
       
   947 extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
       
   948 objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
       
   949 #endif
       
   950 
   887 // Thread start routine for all newly created threads
   951 // Thread start routine for all newly created threads
   888 static void *java_start(Thread *thread) {
   952 static void *java_start(Thread *thread) {
   889   // Try to randomize the cache line index of hot stack frames.
   953   // Try to randomize the cache line index of hot stack frames.
   890   // This helps when threads of the same stack traces evict each other's
   954   // This helps when threads of the same stack traces evict each other's
   891   // cache lines. The threads can be either from the same JVM instance, or
   955   // cache lines. The threads can be either from the same JVM instance, or
   926   // initialize signal mask for this thread
   990   // initialize signal mask for this thread
   927   os::Bsd::hotspot_sigmask(thread);
   991   os::Bsd::hotspot_sigmask(thread);
   928 
   992 
   929   // initialize floating point control register
   993   // initialize floating point control register
   930   os::Bsd::init_thread_fpu_state();
   994   os::Bsd::init_thread_fpu_state();
       
   995 
       
   996 #ifdef __APPLE__
       
   997   // register thread with objc gc
       
   998   if (objc_registerThreadWithCollectorFunction != NULL) {
       
   999     objc_registerThreadWithCollectorFunction();
       
  1000   }
       
  1001 #endif
   931 
  1002 
   932   // handshaking with parent thread
  1003   // handshaking with parent thread
   933   {
  1004   {
   934     MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
  1005     MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
   935 
  1006 
  1745 
  1816 
  1746 const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
  1817 const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
  1747 
  1818 
  1748 // This must be hard coded because it's the system's temporary
  1819 // This must be hard coded because it's the system's temporary
  1749 // directory not the java application's temp directory, ala java.io.tmpdir.
  1820 // directory not the java application's temp directory, ala java.io.tmpdir.
       
  1821 #ifdef __APPLE__
       
  1822 // macosx has a secure per-user temporary directory
       
  1823 char temp_path_storage[PATH_MAX];
       
  1824 const char* os::get_temp_directory() {
       
  1825   static char *temp_path = NULL;
       
  1826   if (temp_path == NULL) {
       
  1827     int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
       
  1828     if (pathSize == 0 || pathSize > PATH_MAX) {
       
  1829       strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
       
  1830     }
       
  1831     temp_path = temp_path_storage;
       
  1832   }
       
  1833   return temp_path;
       
  1834 }
       
  1835 #else /* __APPLE__ */
  1750 const char* os::get_temp_directory() { return "/tmp"; }
  1836 const char* os::get_temp_directory() { return "/tmp"; }
       
  1837 #endif /* __APPLE__ */
  1751 
  1838 
  1752 static bool file_exists(const char* filename) {
  1839 static bool file_exists(const char* filename) {
  1753   struct stat statbuf;
  1840   struct stat statbuf;
  1754   if (filename == NULL || strlen(filename) == 0) {
  1841   if (filename == NULL || strlen(filename) == 0) {
  1755     return false;
  1842     return false;
  4529   }
  4616   }
  4530 
  4617 
  4531   // initialize thread priority policy
  4618   // initialize thread priority policy
  4532   prio_init();
  4619   prio_init();
  4533 
  4620 
       
  4621 #ifdef __APPLE__
       
  4622   // dynamically link to objective c gc registration
       
  4623   void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
       
  4624   if (handleLibObjc != NULL) {
       
  4625     objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
       
  4626   }
       
  4627 #endif
       
  4628 
  4534   return JNI_OK;
  4629   return JNI_OK;
  4535 }
  4630 }
  4536 
  4631 
  4537 // this is called at the end of vm_initialization
  4632 // this is called at the end of vm_initialization
  4538 void os::init_3(void) { }
  4633 void os::init_3(void) { }
  4557   // Bsd doesn't yet have a (official) notion of processor sets,
  4652   // Bsd doesn't yet have a (official) notion of processor sets,
  4558   // so just return the number of online processors.
  4653   // so just return the number of online processors.
  4559   int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
  4654   int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
  4560   assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
  4655   assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
  4561   return online_cpus;
  4656   return online_cpus;
       
  4657 #endif
       
  4658 }
       
  4659 
       
  4660 void os::set_native_thread_name(const char *name) {
       
  4661 #if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
       
  4662   // This is only supported in Snow Leopard and beyond
       
  4663   if (name != NULL) {
       
  4664     // Add a "Java: " prefix to the name
       
  4665     char buf[MAXTHREADNAMESIZE];
       
  4666     snprintf(buf, sizeof(buf), "Java: %s", name);
       
  4667     pthread_setname_np(buf);
       
  4668   }
  4562 #endif
  4669 #endif
  4563 }
  4670 }
  4564 
  4671 
  4565 bool os::distribute_processes(uint length, uint* distribution) {
  4672 bool os::distribute_processes(uint length, uint* distribution) {
  4566   // Not yet implemented.
  4673   // Not yet implemented.
  5676 //
  5783 //
  5677 bool os::is_headless_jre() {
  5784 bool os::is_headless_jre() {
  5678     struct stat statbuf;
  5785     struct stat statbuf;
  5679     char buf[MAXPATHLEN];
  5786     char buf[MAXPATHLEN];
  5680     char libmawtpath[MAXPATHLEN];
  5787     char libmawtpath[MAXPATHLEN];
  5681     const char *xawtstr  = "/xawt/libmawt.so";
  5788     const char *xawtstr  = "/xawt/libmawt" JNI_LIB_SUFFIX;
  5682     const char *motifstr = "/motif21/libmawt.so";
  5789     const char *motifstr = "/motif21/libmawt" JNI_LIB_SUFFIX;
  5683     char *p;
  5790     char *p;
  5684 
  5791 
  5685     // Get path to libjvm.so
  5792     // Get path to libjvm.so
  5686     os::jvm_path(buf, sizeof(buf));
  5793     os::jvm_path(buf, sizeof(buf));
  5687 
  5794