src/os/linux/vm/hpi_linux.cpp

Fri, 11 Jul 2008 01:14:44 -0700

author
trims
date
Fri, 11 Jul 2008 01:14:44 -0700
changeset 670
9c2ecc2ffb12
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 # include "incls/_precompiled.incl"
    26 # include "incls/_hpi_linux.cpp.incl"
    28 # include <sys/param.h>
    29 # include <dlfcn.h>
    31 typedef jint (JNICALL *init_t)(GetInterfaceFunc *, void *);
    33 void hpi::initialize_get_interface(vm_calls_t *callbacks) {
    34     char buf[JVM_MAXPATHLEN];
    35     void *hpi_handle;
    36     GetInterfaceFunc& getintf = _get_interface;
    37     jint (JNICALL * DLL_Initialize)(GetInterfaceFunc *, void *);
    39     if (HPILibPath && HPILibPath[0]) {
    40       strncpy(buf, HPILibPath, JVM_MAXPATHLEN - 1);
    41       buf[JVM_MAXPATHLEN - 1] = '\0';
    42     } else {
    43       const char *thread_type = "native_threads";
    45       os::jvm_path(buf, JVM_MAXPATHLEN);
    47 #ifdef PRODUCT
    48       const char * hpi_lib = "/libhpi.so";
    49 #else
    50       char * ptr = strrchr(buf, '/');
    51       assert(strstr(ptr, "/libjvm") == ptr, "invalid library name");
    52       const char * hpi_lib = strstr(ptr, "_g") ? "/libhpi_g.so" : "/libhpi.so";
    53 #endif
    55       *(strrchr(buf, '/')) = '\0';  /* get rid of /libjvm.so */
    56       char* p = strrchr(buf, '/');
    57       if (p != NULL) p[1] = '\0';   /* get rid of hotspot    */
    58       strcat(buf, thread_type);
    59       strcat(buf, hpi_lib);
    60     }
    62     if (TraceHPI) tty->print_cr("Loading HPI %s ", buf);
    63 #ifdef SPARC
    64     // On 64-bit Ubuntu Sparc RTLD_NOW leads to unresolved deps in libpthread.so
    65 #   define OPEN_MODE RTLD_LAZY
    66 #else
    67     // We use RTLD_NOW because of bug 4032715
    68 #   define OPEN_MODE RTLD_NOW
    69 #endif
    70     hpi_handle = dlopen(buf, OPEN_MODE);
    71 #undef OPEN_MODE
    73     if (hpi_handle == NULL) {
    74         if (TraceHPI) tty->print_cr("HPI dlopen failed: %s", dlerror());
    75         return;
    76     }
    77     DLL_Initialize = CAST_TO_FN_PTR(jint (JNICALL *)(GetInterfaceFunc *, void *),
    78                                     dlsym(hpi_handle, "DLL_Initialize"));
    79     if (TraceHPI && DLL_Initialize == NULL) tty->print_cr("HPI dlsym of DLL_Initialize failed: %s", dlerror());
    80     if (DLL_Initialize == NULL ||
    81         (*DLL_Initialize)(&getintf, callbacks) < 0) {
    82         if (TraceHPI) tty->print_cr("HPI DLL_Initialize failed");
    83         return;
    84     }
    85     if (TraceHPI)  tty->print_cr("HPI loaded successfully");
    86 }

mercurial