src/os/solaris/vm/hpi_solaris.cpp

Thu, 19 Mar 2009 09:13:24 -0700

author
kvn
date
Thu, 19 Mar 2009 09:13:24 -0700
changeset 1082
bd441136a5ce
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright 1998-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_solaris.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 {
    35     char buf[JVM_MAXPATHLEN];
    36     void *hpi_handle;
    37     GetInterfaceFunc& getintf = _get_interface;
    38     jint (JNICALL * DLL_Initialize)(GetInterfaceFunc *, void *);
    40     if (HPILibPath && HPILibPath[0]) {
    41       strncpy(buf, HPILibPath, JVM_MAXPATHLEN - 1);
    42       buf[JVM_MAXPATHLEN - 1] = '\0';
    43     } else {
    44       const char *thread_type = "native_threads";
    46       os::jvm_path(buf, JVM_MAXPATHLEN);
    48 #ifdef PRODUCT
    49       const char * hpi_lib = "/libhpi.so";
    50 #else
    51       char * ptr = strrchr(buf, '/');
    52       assert(strstr(ptr, "/libjvm") == ptr, "invalid library name");
    53       const char * hpi_lib = strstr(ptr, "_g") ? "/libhpi_g.so" : "/libhpi.so";
    54 #endif
    56       *(strrchr(buf, '/')) = '\0';  /* get rid of /libjvm.so */
    57       char* p = strrchr(buf, '/');
    58       if (p != NULL) p[1] = '\0';   /* get rid of hotspot    */
    59       strcat(buf, thread_type);
    60       strcat(buf, hpi_lib);
    61     }
    62     /* we use RTLD_NOW because of bug 4032715 */
    63     if (TraceHPI)  tty->print_cr("Loading HPI %s ", buf);
    64     hpi_handle = dlopen(buf, RTLD_NOW);
    65     if (hpi_handle == NULL) {
    66         if (TraceHPI) tty->print_cr("HPI dlopen failed: %s", dlerror());
    67         return;
    68     }
    69     DLL_Initialize = CAST_TO_FN_PTR(jint (JNICALL *)(GetInterfaceFunc *, void *),
    70                                     dlsym(hpi_handle, "DLL_Initialize"));
    71     if (TraceHPI && DLL_Initialize == NULL) tty->print_cr("HPI dlsym of DLL_Initialize failed: %s", dlerror());
    72     if (DLL_Initialize == NULL ||
    73         (*DLL_Initialize)(&getintf, callbacks) < 0) {
    74         if (TraceHPI) tty->print_cr("HPI DLL_Initialize failed");
    75         return;
    76     }
    77     if (TraceHPI)  tty->print_cr("HPI loaded successfully");
    78 }

mercurial