src/os/solaris/vm/os_solaris.inline.hpp

Wed, 27 Mar 2013 19:21:18 +0100

author
tschatzl
date
Wed, 27 Mar 2013 19:21:18 +0100
changeset 4854
754c24457b20
parent 4675
63e54c37ac64
child 5309
feae15578b2f
permissions
-rw-r--r--

7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method.
Reviewed-by: jmasa, tamao

duke@435 1 /*
hseigel@4465 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
stefank@2314 26 #define OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
stefank@2314 27
twisti@4318 28 #include "runtime/atomic.inline.hpp"
stefank@2314 29 #include "runtime/os.hpp"
twisti@4318 30
stefank@2314 31 #ifdef TARGET_OS_ARCH_solaris_x86
stefank@2314 32 # include "orderAccess_solaris_x86.inline.hpp"
stefank@2314 33 #endif
stefank@2314 34 #ifdef TARGET_OS_ARCH_solaris_sparc
stefank@2314 35 # include "orderAccess_solaris_sparc.inline.hpp"
stefank@2314 36 #endif
stefank@2314 37
ikrylov@2322 38 // System includes
ikrylov@2322 39 #include <sys/param.h>
ikrylov@2322 40 #include <dlfcn.h>
ikrylov@2322 41 #include <sys/socket.h>
ikrylov@2322 42 #include <sys/poll.h>
ikrylov@2322 43 #include <sys/filio.h>
ikrylov@2322 44 #include <unistd.h>
ikrylov@2322 45 #include <netdb.h>
ikrylov@2322 46 #include <setjmp.h>
ikrylov@2322 47
duke@435 48 inline const char* os::file_separator() { return "/"; }
duke@435 49 inline const char* os::line_separator() { return "\n"; }
duke@435 50 inline const char* os::path_separator() { return ":"; }
duke@435 51
duke@435 52 // File names are case-sensitive on windows only
duke@435 53 inline int os::file_name_strcmp(const char* s1, const char* s2) {
duke@435 54 return strcmp(s1, s2);
duke@435 55 }
duke@435 56
duke@435 57 inline bool os::uses_stack_guard_pages() {
duke@435 58 return true;
duke@435 59 }
duke@435 60
duke@435 61 inline bool os::allocate_stack_guard_pages() {
duke@435 62 assert(uses_stack_guard_pages(), "sanity check");
duke@435 63 int r = thr_main() ;
duke@435 64 guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ;
duke@435 65 return r;
duke@435 66 }
duke@435 67
duke@435 68
duke@435 69 // On Solaris, reservations are made on a page by page basis, nothing to do.
zgu@3900 70 inline void os::pd_split_reserved_memory(char *base, size_t size,
duke@435 71 size_t split, bool realloc) {
duke@435 72 }
duke@435 73
duke@435 74
duke@435 75 // Bang the shadow pages if they need to be touched to be mapped.
duke@435 76 inline void os::bang_stack_shadow_pages() {
duke@435 77 }
ikrylov@2322 78 inline void os::dll_unload(void *lib) { ::dlclose(lib); }
duke@435 79
ikrylov@2322 80 inline DIR* os::opendir(const char* dirname) {
duke@435 81 assert(dirname != NULL, "just checking");
duke@435 82 return ::opendir(dirname);
duke@435 83 }
duke@435 84
ikrylov@2322 85 inline int os::readdir_buf_size(const char *path) {
duke@435 86 int size = pathconf(path, _PC_NAME_MAX);
duke@435 87 return (size < 0 ? MAXPATHLEN : size) + sizeof(dirent) + 1;
duke@435 88 }
duke@435 89
ikrylov@2322 90 inline struct dirent* os::readdir(DIR* dirp, dirent* dbuf) {
duke@435 91 assert(dirp != NULL, "just checking");
duke@435 92 #if defined(_LP64) || defined(_GNU_SOURCE)
duke@435 93 dirent* p;
duke@435 94 int status;
duke@435 95
duke@435 96 if((status = ::readdir_r(dirp, dbuf, &p)) != 0) {
duke@435 97 errno = status;
duke@435 98 return NULL;
duke@435 99 } else
duke@435 100 return p;
duke@435 101 #else // defined(_LP64) || defined(_GNU_SOURCE)
duke@435 102 return ::readdir_r(dirp, dbuf);
duke@435 103 #endif // defined(_LP64) || defined(_GNU_SOURCE)
duke@435 104 }
duke@435 105
ikrylov@2322 106 inline int os::closedir(DIR *dirp) {
ikrylov@2322 107 assert(dirp != NULL, "argument is NULL");
duke@435 108 return ::closedir(dirp);
duke@435 109 }
duke@435 110
duke@435 111 //////////////////////////////////////////////////////////////////////////////
duke@435 112 ////////////////////////////////////////////////////////////////////////////////
duke@435 113
duke@435 114 // macros for interruptible io and system calls and system call restarting
duke@435 115
duke@435 116 #define _INTERRUPTIBLE(_setup, _cmd, _result, _thread, _clear, _before, _after, _int_enable) \
duke@435 117 do { \
duke@435 118 _setup; \
duke@435 119 _before; \
duke@435 120 OSThread* _osthread = _thread->osthread(); \
duke@435 121 if (_int_enable && _thread->has_last_Java_frame()) { \
duke@435 122 /* this is java interruptible io stuff */ \
duke@435 123 if (os::is_interrupted(_thread, _clear)) { \
duke@435 124 os::Solaris::bump_interrupted_before_count(); \
duke@435 125 _result = OS_INTRPT; \
duke@435 126 } else { \
duke@435 127 /* _cmd always expands to an assignment to _result */ \
duke@435 128 if ((_cmd) < 0 && errno == EINTR \
duke@435 129 && os::is_interrupted(_thread, _clear)) { \
duke@435 130 os::Solaris::bump_interrupted_during_count(); \
duke@435 131 _result = OS_INTRPT; \
duke@435 132 } \
duke@435 133 } \
duke@435 134 } else { \
duke@435 135 /* this is normal blocking io stuff */ \
duke@435 136 _cmd; \
duke@435 137 } \
duke@435 138 _after; \
duke@435 139 } while(false)
duke@435 140
duke@435 141 // Interruptible io support + restarting of interrupted system calls
duke@435 142
duke@435 143 #ifndef ASSERT
duke@435 144
duke@435 145 #define INTERRUPTIBLE(_cmd, _result, _clear) do { \
duke@435 146 _INTERRUPTIBLE( JavaThread* _thread = (JavaThread*)ThreadLocalStorage::thread(),_result = _cmd, _result, _thread, _clear, , , UseVMInterruptibleIO); \
duke@435 147 } while((_result == OS_ERR) && (errno == EINTR))
duke@435 148
duke@435 149 #else
duke@435 150
duke@435 151 // This adds an assertion that it is only called from thread_in_native
duke@435 152 // The call overhead is skipped for performance in product mode
duke@435 153 #define INTERRUPTIBLE(_cmd, _result, _clear) do { \
duke@435 154 _INTERRUPTIBLE(JavaThread* _thread = os::Solaris::setup_interruptible_native(), _result = _cmd, _result, _thread, _clear, , os::Solaris::cleanup_interruptible_native(_thread), UseVMInterruptibleIO ); \
duke@435 155 } while((_result == OS_ERR) && (errno == EINTR))
duke@435 156
duke@435 157 #endif
duke@435 158
duke@435 159 // Used for calls from _thread_in_vm, not from _thread_in_native
duke@435 160 #define INTERRUPTIBLE_VM(_cmd, _result, _clear) do { \
duke@435 161 _INTERRUPTIBLE(JavaThread* _thread = os::Solaris::setup_interruptible(), _result = _cmd, _result, _thread, _clear, , os::Solaris::cleanup_interruptible(_thread), UseVMInterruptibleIO ); \
duke@435 162 } while((_result == OS_ERR) && (errno == EINTR))
duke@435 163
duke@435 164 /* Use NORESTART when the system call cannot return EINTR, when something other
duke@435 165 than a system call is being invoked, or when the caller must do EINTR
duke@435 166 handling. */
duke@435 167
duke@435 168 #ifndef ASSERT
duke@435 169
duke@435 170 #define INTERRUPTIBLE_NORESTART(_cmd, _result, _clear) \
duke@435 171 _INTERRUPTIBLE( JavaThread* _thread = (JavaThread*)ThreadLocalStorage::thread(),_result = _cmd, _result, _thread, _clear, , , UseVMInterruptibleIO)
duke@435 172
duke@435 173 #else
duke@435 174
duke@435 175 // This adds an assertion that it is only called from thread_in_native
duke@435 176 // The call overhead is skipped for performance in product mode
duke@435 177 #define INTERRUPTIBLE_NORESTART(_cmd, _result, _clear) \
duke@435 178 _INTERRUPTIBLE(JavaThread* _thread = os::Solaris::setup_interruptible_native(), _result = _cmd, _result, _thread, _clear, , os::Solaris::cleanup_interruptible_native(_thread), UseVMInterruptibleIO )
duke@435 179
duke@435 180 #endif
duke@435 181
duke@435 182 // Don't attend to UseVMInterruptibleIO. Always allow interruption.
duke@435 183 // Also assumes that it is called from the _thread_blocked state.
duke@435 184 // Used by os_sleep().
duke@435 185
duke@435 186 #define INTERRUPTIBLE_NORESTART_VM_ALWAYS(_cmd, _result, _thread, _clear) \
duke@435 187 _INTERRUPTIBLE(os::Solaris::setup_interruptible_already_blocked(_thread), _result = _cmd, _result, _thread, _clear, , , true )
duke@435 188
duke@435 189 #define INTERRUPTIBLE_RETURN_INT(_cmd, _clear) do { \
duke@435 190 int _result; \
duke@435 191 do { \
duke@435 192 INTERRUPTIBLE(_cmd, _result, _clear); \
duke@435 193 } while((_result == OS_ERR) && (errno == EINTR)); \
duke@435 194 return _result; \
duke@435 195 } while(false)
duke@435 196
duke@435 197 #define INTERRUPTIBLE_RETURN_INT_VM(_cmd, _clear) do { \
duke@435 198 int _result; \
duke@435 199 do { \
duke@435 200 INTERRUPTIBLE_VM(_cmd, _result, _clear); \
duke@435 201 } while((_result == OS_ERR) && (errno == EINTR)); \
duke@435 202 return _result; \
duke@435 203 } while(false)
duke@435 204
duke@435 205 #define INTERRUPTIBLE_RETURN_INT_NORESTART(_cmd, _clear) do { \
duke@435 206 int _result; \
duke@435 207 INTERRUPTIBLE_NORESTART(_cmd, _result, _clear); \
duke@435 208 return _result; \
duke@435 209 } while(false)
duke@435 210
duke@435 211 /* Use the RESTARTABLE macros when interruptible io is not needed */
duke@435 212
duke@435 213 #define RESTARTABLE(_cmd, _result) do { \
duke@435 214 do { \
duke@435 215 _result = _cmd; \
duke@435 216 } while((_result == OS_ERR) && (errno == EINTR)); \
duke@435 217 } while(false)
duke@435 218
duke@435 219 #define RESTARTABLE_RETURN_INT(_cmd) do { \
duke@435 220 int _result; \
duke@435 221 RESTARTABLE(_cmd, _result); \
duke@435 222 return _result; \
duke@435 223 } while(false)
iveresov@576 224
iveresov@576 225 inline bool os::numa_has_static_binding() { return false; }
iveresov@576 226 inline bool os::numa_has_group_homing() { return true; }
stefank@2314 227
ikrylov@2322 228 inline int os::socket(int domain, int type, int protocol) {
ikrylov@2322 229 return ::socket(domain, type, protocol);
ikrylov@2322 230 }
ikrylov@2322 231
ikrylov@2322 232 inline int os::listen(int fd, int count) {
ikrylov@2322 233 if (fd < 0) return OS_ERR;
ikrylov@2322 234
ikrylov@2322 235 return ::listen(fd, count);
ikrylov@2322 236 }
ikrylov@2322 237
ikrylov@2322 238 inline int os::socket_shutdown(int fd, int howto){
ikrylov@2322 239 return ::shutdown(fd, howto);
ikrylov@2322 240 }
ikrylov@2322 241
phh@3344 242 inline int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len){
phh@3344 243 return ::getsockname(fd, him, len);
ikrylov@2322 244 }
ikrylov@2322 245
ikrylov@2322 246 inline int os::get_host_name(char* name, int namelen){
ikrylov@2322 247 return ::gethostname(name, namelen);
ikrylov@2322 248 }
ikrylov@2322 249
phh@3344 250 inline struct hostent* os::get_host_by_name(char* name) {
ikrylov@2322 251 return ::gethostbyname(name);
ikrylov@2322 252 }
phh@3344 253
ikrylov@2322 254 inline int os::get_sock_opt(int fd, int level, int optname,
phh@3344 255 char* optval, socklen_t* optlen) {
phh@3344 256 return ::getsockopt(fd, level, optname, optval, optlen);
ikrylov@2322 257 }
ikrylov@2322 258
ikrylov@2322 259 inline int os::set_sock_opt(int fd, int level, int optname,
phh@3344 260 const char *optval, socklen_t optlen) {
ikrylov@2322 261 return ::setsockopt(fd, level, optname, optval, optlen);
ikrylov@2322 262 }
stefank@2314 263 #endif // OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP

mercurial