--- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Aug 06 11:57:31 2008 -0400
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Aug 21 23:36:31 2008 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -94,6 +94,9 @@
static int SR_signum = SIGUSR2;
sigset_t SR_sigset;
+/* Used to protect dlsym() calls */
+static pthread_mutex_t dl_mutex;
+
////////////////////////////////////////////////////////////////////////////////
// utility functions
@@ -1504,6 +1507,24 @@
const char* os::get_temp_directory() { return "/tmp/"; }
+void os::dll_build_name(
+ char* buffer, size_t buflen, const char* pname, const char* fname) {
+ // copied from libhpi
+ const size_t pnamelen = pname ? strlen(pname) : 0;
+
+ /* Quietly truncate on buffer overflow. Should be an error. */
+ if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
+ *buffer = '\0';
+ return;
+ }
+
+ if (pnamelen == 0) {
+ sprintf(buffer, "lib%s.so", fname);
+ } else {
+ sprintf(buffer, "%s/lib%s.so", pname, fname);
+ }
+}
+
const char* os::get_current_directory(char *buf, int buflen) {
return getcwd(buf, buflen);
}
@@ -1753,7 +1774,17 @@
return NULL;
}
-
+/*
+ * glibc-2.0 libdl is not MT safe. If you are building with any glibc,
+ * chances are you might want to run the generated bits against glibc-2.0
+ * libdl.so, so always use locking for any version of glibc.
+ */
+void* os::dll_lookup(void* handle, const char* name) {
+ pthread_mutex_lock(&dl_mutex);
+ void* res = dlsym(handle, name);
+ pthread_mutex_unlock(&dl_mutex);
+ return res;
+}
bool _print_ascii_file(const char* filename, outputStream* st) {
@@ -2289,7 +2320,7 @@
dlsym(RTLD_DEFAULT, "sched_getcpu")));
if (sched_getcpu() != -1) { // Does it work?
- void *handle = dlopen("libnuma.so", RTLD_LAZY);
+ void *handle = dlopen("libnuma.so.1", RTLD_LAZY);
if (handle != NULL) {
set_numa_node_to_cpus(CAST_TO_FN_PTR(numa_node_to_cpus_func_t,
dlsym(handle, "numa_node_to_cpus")));
@@ -2425,8 +2456,20 @@
return ::mprotect(bottom, size, prot) == 0;
}
-bool os::protect_memory(char* addr, size_t size) {
- return linux_mprotect(addr, size, PROT_READ);
+// Set protections specified
+bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
+ bool is_committed) {
+ unsigned int p = 0;
+ switch (prot) {
+ case MEM_PROT_NONE: p = PROT_NONE; break;
+ case MEM_PROT_READ: p = PROT_READ; break;
+ case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
+ case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
+ default:
+ ShouldNotReachHere();
+ }
+ // is_committed is unused.
+ return linux_mprotect(addr, bytes, p);
}
bool os::guard_memory(char* addr, size_t size) {
@@ -3580,6 +3623,7 @@
Linux::clock_init();
initial_time_count = os::elapsed_counter();
+ pthread_mutex_init(&dl_mutex, NULL);
}
// To install functions for atexit system call
@@ -3715,8 +3759,9 @@
// Mark the polling page as readable
void os::make_polling_page_readable(void) {
- if( !protect_memory((char *)_polling_page, Linux::page_size()) )
+ if( !linux_mprotect((char *)_polling_page, Linux::page_size(), PROT_READ)) {
fatal("Could not enable polling page");
+ }
};
int os::active_processor_count() {