Mercurial > hg > graal-compiler
diff src/os/bsd/vm/os_bsd.cpp @ 4006:436b4a3231bf
7098194: integrate macosx-port changes
Summary: Integrate bsd-port/hotspot and macosx-port/hotspot changes as of 2011.09.29.
Reviewed-by: kvn, dholmes, never, phh
Contributed-by: Christos Zoulas <christos@zoulas.com>, Greg Lewis <glewis@eyesbeyond.com>, Kurt Miller <kurt@intricatesoftware.com>, Alexander Strange <astrange@apple.com>, Mike Swingler <swingler@apple.com>, Roger Hoover <rhoover@apple.com>, Victor Hernandez <vhernandez@apple.com>, Pratik Solanki <psolanki@apple.com>
author | dcubed |
---|---|
date | Thu, 13 Oct 2011 09:35:42 -0700 |
parents | f08d439fab8c |
children | 36b057451829 |
line wrap: on
line diff
--- a/src/os/bsd/vm/os_bsd.cpp Mon Oct 10 21:01:36 2011 -0400 +++ b/src/os/bsd/vm/os_bsd.cpp Thu Oct 13 09:35:42 2011 -0700 @@ -136,8 +136,10 @@ #endif #ifdef __APPLE__ -#include <mach/mach.h> // semaphore_* API -#include <mach-o/dyld.h> +# include <mach/mach.h> // semaphore_* API +# include <mach-o/dyld.h> +# include <sys/proc_info.h> +# include <objc/objc-auto.h> #endif #ifndef MAP_ANONYMOUS @@ -388,6 +390,20 @@ } #endif +#ifdef __APPLE__ +static const char *get_home() { + const char *home_dir = ::getenv("HOME"); + if ((home_dir == NULL) || (*home_dir == '\0')) { + struct passwd *passwd_info = getpwuid(geteuid()); + if (passwd_info != NULL) { + home_dir = passwd_info->pw_dir; + } + } + + return home_dir; +} +#endif + void os::init_system_properties_values() { // char arch[12]; // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); @@ -438,6 +454,15 @@ #define ENDORSED_DIR "/lib/endorsed" #define REG_DIR "/usr/java/packages" +#ifdef __APPLE__ +#define SYS_EXTENSIONS_DIR "/Library/Java/Extensions" +#define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java" + const char *user_home_dir = get_home(); + // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir + int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) + + sizeof(SYS_EXTENSIONS_DIRS); +#endif + { /* sysclasspath, java_home, dll_dir */ { @@ -462,10 +487,12 @@ if (pslash != NULL) { pslash = strrchr(buf, '/'); if (pslash != NULL) { - *pslash = '\0'; /* get rid of /<arch> */ + *pslash = '\0'; /* get rid of /<arch> (/lib on macosx) */ +#ifndef __APPLE__ pslash = strrchr(buf, '/'); if (pslash != NULL) *pslash = '\0'; /* get rid of /lib */ +#endif } } @@ -500,9 +527,14 @@ * nulls included by the sizeof operator (so actually we allocate * a byte more than necessary). */ +#ifdef __APPLE__ + ld_library_path = (char *) malloc(system_ext_size); + sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir); +#else ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); +#endif /* * Get the user setting of LD_LIBRARY_PATH, and prepended it. It @@ -510,6 +542,16 @@ * addressed). */ #ifdef __APPLE__ + // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper + char *l = getenv("JAVA_LIBRARY_PATH"); + if (l != NULL) { + char *t = ld_library_path; + /* That's +1 for the colon and +1 for the trailing '\0' */ + ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1); + sprintf(ld_library_path, "%s:%s", l, t); + free(t); + } + char *v = getenv("DYLD_LIBRARY_PATH"); #else char *v = getenv("LD_LIBRARY_PATH"); @@ -519,6 +561,7 @@ /* That's +1 for the colon and +1 for the trailing '\0' */ ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); sprintf(ld_library_path, "%s:%s", v, t); + free(t); } Arguments::set_library_path(ld_library_path); } @@ -531,10 +574,18 @@ * than necessary is allocated). */ { +#ifdef __APPLE__ + char *buf = malloc(strlen(Arguments::get_java_home()) + + sizeof(EXTENSIONS_DIR) + system_ext_size); + sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" + SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home()); +#else char *buf = malloc(strlen(Arguments::get_java_home()) + sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR)); sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, Arguments::get_java_home()); +#endif + Arguments::set_ext_dirs(buf); } @@ -547,6 +598,9 @@ } } +#ifdef __APPLE__ +#undef SYS_EXTENSIONS_DIR +#endif #undef malloc #undef getenv #undef EXTENSIONS_DIR @@ -884,6 +938,16 @@ #endif } +#ifdef __APPLE__ +// library handle for calling objc_registerThreadWithCollector() +// without static linking to the libobjc library +#define OBJC_LIB "/usr/lib/libobjc.dylib" +#define OBJC_GCREGISTER "objc_registerThreadWithCollector" +typedef void (*objc_registerThreadWithCollector_t)(); +extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction; +objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL; +#endif + // Thread start routine for all newly created threads static void *java_start(Thread *thread) { // Try to randomize the cache line index of hot stack frames. @@ -929,6 +993,13 @@ // initialize floating point control register os::Bsd::init_thread_fpu_state(); +#ifdef __APPLE__ + // register thread with objc gc + if (objc_registerThreadWithCollectorFunction != NULL) { + objc_registerThreadWithCollectorFunction(); + } +#endif + // handshaking with parent thread { MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag); @@ -1747,7 +1818,23 @@ // This must be hard coded because it's the system's temporary // directory not the java application's temp directory, ala java.io.tmpdir. +#ifdef __APPLE__ +// macosx has a secure per-user temporary directory +char temp_path_storage[PATH_MAX]; +const char* os::get_temp_directory() { + static char *temp_path = NULL; + if (temp_path == NULL) { + int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX); + if (pathSize == 0 || pathSize > PATH_MAX) { + strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage)); + } + temp_path = temp_path_storage; + } + return temp_path; +} +#else /* __APPLE__ */ const char* os::get_temp_directory() { return "/tmp"; } +#endif /* __APPLE__ */ static bool file_exists(const char* filename) { struct stat statbuf; @@ -4531,6 +4618,14 @@ // initialize thread priority policy prio_init(); +#ifdef __APPLE__ + // dynamically link to objective c gc registration + void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY); + if (handleLibObjc != NULL) { + objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER); + } +#endif + return JNI_OK; } @@ -4562,6 +4657,18 @@ #endif } +void os::set_native_thread_name(const char *name) { +#if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + // This is only supported in Snow Leopard and beyond + if (name != NULL) { + // Add a "Java: " prefix to the name + char buf[MAXTHREADNAMESIZE]; + snprintf(buf, sizeof(buf), "Java: %s", name); + pthread_setname_np(buf); + } +#endif +} + bool os::distribute_processes(uint length, uint* distribution) { // Not yet implemented. return false; @@ -5678,8 +5785,8 @@ struct stat statbuf; char buf[MAXPATHLEN]; char libmawtpath[MAXPATHLEN]; - const char *xawtstr = "/xawt/libmawt.so"; - const char *motifstr = "/motif21/libmawt.so"; + const char *xawtstr = "/xawt/libmawt" JNI_LIB_SUFFIX; + const char *motifstr = "/motif21/libmawt" JNI_LIB_SUFFIX; char *p; // Get path to libjvm.so