src/os/solaris/vm/os_solaris.cpp

changeset 1082
bd441136a5ce
parent 1014
0fbdb4381b99
parent 1077
660978a2a31a
child 1091
6bdd6923ba16
     1.1 --- a/src/os/solaris/vm/os_solaris.cpp	Wed Mar 18 11:37:48 2009 -0400
     1.2 +++ b/src/os/solaris/vm/os_solaris.cpp	Thu Mar 19 09:13:24 2009 -0700
     1.3 @@ -3220,7 +3220,7 @@
     1.4    return true;
     1.5  }
     1.6  
     1.7 -char* os::reserve_memory_special(size_t bytes) {
     1.8 +char* os::reserve_memory_special(size_t bytes, char* addr) {
     1.9    assert(UseLargePages && UseISM, "only for ISM large pages");
    1.10  
    1.11    size_t size = bytes;
    1.12 @@ -4451,6 +4451,9 @@
    1.13  int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
    1.14  int_fnP_thread_t os::Solaris::_thr_continue_mutator;
    1.15  
    1.16 +// (Static) wrapper for getisax(2) call.
    1.17 +os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
    1.18 +
    1.19  // (Static) wrappers for the liblgrp API
    1.20  os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
    1.21  os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
    1.22 @@ -4465,16 +4468,19 @@
    1.23  // (Static) wrapper for meminfo() call.
    1.24  os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
    1.25  
    1.26 -static address resolve_symbol(const char *name) {
    1.27 -  address addr;
    1.28 -
    1.29 -  addr = (address) dlsym(RTLD_DEFAULT, name);
    1.30 +static address resolve_symbol_lazy(const char* name) {
    1.31 +  address addr = (address) dlsym(RTLD_DEFAULT, name);
    1.32    if(addr == NULL) {
    1.33      // RTLD_DEFAULT was not defined on some early versions of 2.5.1
    1.34      addr = (address) dlsym(RTLD_NEXT, name);
    1.35 -    if(addr == NULL) {
    1.36 -      fatal(dlerror());
    1.37 -    }
    1.38 +  }
    1.39 +  return addr;
    1.40 +}
    1.41 +
    1.42 +static address resolve_symbol(const char* name) {
    1.43 +  address addr = resolve_symbol_lazy(name);
    1.44 +  if(addr == NULL) {
    1.45 +    fatal(dlerror());
    1.46    }
    1.47    return addr;
    1.48  }
    1.49 @@ -4673,15 +4679,26 @@
    1.50  }
    1.51  
    1.52  void os::Solaris::misc_sym_init() {
    1.53 -  address func = (address)dlsym(RTLD_DEFAULT, "meminfo");
    1.54 -  if(func == NULL) {
    1.55 -    func = (address) dlsym(RTLD_NEXT, "meminfo");
    1.56 -  }
    1.57 +  address func;
    1.58 +
    1.59 +  // getisax
    1.60 +  func = resolve_symbol_lazy("getisax");
    1.61 +  if (func != NULL) {
    1.62 +    os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
    1.63 +  }
    1.64 +
    1.65 +  // meminfo
    1.66 +  func = resolve_symbol_lazy("meminfo");
    1.67    if (func != NULL) {
    1.68      os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
    1.69    }
    1.70  }
    1.71  
    1.72 +uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
    1.73 +  assert(_getisax != NULL, "_getisax not set");
    1.74 +  return _getisax(array, n);
    1.75 +}
    1.76 +
    1.77  // Symbol doesn't exist in Solaris 8 pset.h
    1.78  #ifndef PS_MYID
    1.79  #define PS_MYID -3
    1.80 @@ -4716,6 +4733,10 @@
    1.81  
    1.82    Solaris::initialize_system_info();
    1.83  
    1.84 +  // Initialize misc. symbols as soon as possible, so we can use them
    1.85 +  // if we need them.
    1.86 +  Solaris::misc_sym_init();
    1.87 +
    1.88    int fd = open("/dev/zero", O_RDWR);
    1.89    if (fd < 0) {
    1.90      fatal1("os::init: cannot open /dev/zero (%s)", strerror(errno));
    1.91 @@ -4857,7 +4878,6 @@
    1.92      }
    1.93    }
    1.94  
    1.95 -  Solaris::misc_sym_init();
    1.96    Solaris::signal_sets_init();
    1.97    Solaris::init_signal_mem();
    1.98    Solaris::install_signal_handlers();

mercurial