annotate src/os/bsd/vm/os_bsd.cpp @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 4c84d351cca9
children cefad50507d8 2bd38d594b9a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 /*
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25 // no precompiled headers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26 #include "classfile/classLoader.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 #include "classfile/systemDictionary.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28 #include "classfile/vmSymbols.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 #include "code/icBuffer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 #include "code/vtableStubs.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 #include "compiler/compileBroker.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6966
diff changeset
32 #include "compiler/disassembler.hpp"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 #include "interpreter/interpreter.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 #include "jvm_bsd.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 #include "memory/allocation.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 #include "memory/filemap.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 #include "mutex_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 #include "oops/oop.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 #include "os_share_bsd.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 #include "prims/jniFastGetField.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 #include "prims/jvm.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 #include "prims/jvm_misc.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 #include "runtime/arguments.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 #include "runtime/extendedPC.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 #include "runtime/globals.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 #include "runtime/interfaceSupport.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 #include "runtime/java.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 #include "runtime/javaCalls.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 #include "runtime/mutexLocker.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 #include "runtime/objectMonitor.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 #include "runtime/osThread.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 #include "runtime/perfMemory.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 #include "runtime/sharedRuntime.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 #include "runtime/statSampler.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 #include "runtime/stubRoutines.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6966
diff changeset
56 #include "runtime/thread.inline.hpp"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 #include "runtime/threadCritical.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 #include "runtime/timer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 #include "services/attachListener.hpp"
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
60 #include "services/memTracker.hpp"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61 #include "services/runtimeService.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 #include "utilities/decoder.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 #include "utilities/defaultStream.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 #include "utilities/events.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 #include "utilities/growableArray.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 #include "utilities/vmError.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 // put OS-includes here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 # include <sys/types.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 # include <sys/mman.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 # include <sys/stat.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 # include <sys/select.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 # include <pthread.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 # include <signal.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 # include <errno.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 # include <dlfcn.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 # include <stdio.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 # include <unistd.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 # include <sys/resource.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 # include <pthread.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 # include <sys/stat.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 # include <sys/time.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 # include <sys/times.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 # include <sys/utsname.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 # include <sys/socket.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 # include <sys/wait.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 # include <time.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 # include <pwd.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 # include <poll.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 # include <semaphore.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 # include <fcntl.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 # include <string.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 # include <sys/param.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 # include <sys/sysctl.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 # include <sys/ipc.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96 # include <sys/shm.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 #ifndef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 # include <link.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 # include <stdint.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 # include <inttypes.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102 # include <sys/ioctl.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 #if defined(__FreeBSD__) || defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 # include <elf.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 #ifdef __APPLE__
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
109 # include <mach/mach.h> // semaphore_* API
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
110 # include <mach-o/dyld.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
111 # include <sys/proc_info.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
112 # include <objc/objc-auto.h>
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
114
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115 #ifndef MAP_ANONYMOUS
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 #define MAP_ANONYMOUS MAP_ANON
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119 #define MAX_PATH (2 * K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 // for timer info max values which include all bits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 #define LARGEPAGES_BIT (1 << 6)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 // global variables
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 julong os::Bsd::_physical_memory = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 pthread_t os::Bsd::_main_thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 int os::Bsd::_page_size = -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 static jlong initial_time_count=0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 static int clock_tics_per_sec = 100;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138 // For diagnostics to print a message once. see run_periodic_checks
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 static sigset_t check_signal_done;
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
140 static bool check_signals = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 static pid_t _initial_pid = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 /* Signal number used to suspend/resume a thread */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 /* do not use any signal number less than SIGSEGV, see 4355769 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147 static int SR_signum = SIGUSR2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 sigset_t SR_sigset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 // utility functions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154 static int SR_initialize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 julong os::available_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 return Bsd::available_memory();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 julong os::Bsd::available_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 // XXXBSD: this is just a stopgap implementation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 return physical_memory() >> 2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 julong os::physical_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 return Bsd::physical_memory();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170 // environment support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172 bool os::getenv(const char* name, char* buf, int len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 const char* val = ::getenv(name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 if (val != NULL && strlen(val) < (size_t)len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 strcpy(buf, val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 if (len > 0) buf[0] = 0; // return a null string
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 // Return true if user is running as root.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185 bool os::have_special_privileges() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 static bool init = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 static bool privileges = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 if (!init) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189 privileges = (getuid() != geteuid()) || (getgid() != getegid());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 init = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 return privileges;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 // Cpu architecture string
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 #if defined(ZERO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 static char cpu_arch[] = ZERO_LIBARCH;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 #elif defined(IA64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 static char cpu_arch[] = "ia64";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 #elif defined(IA32)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 static char cpu_arch[] = "i386";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 #elif defined(AMD64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 static char cpu_arch[] = "amd64";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 #elif defined(ARM)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 static char cpu_arch[] = "arm";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 #elif defined(PPC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209 static char cpu_arch[] = "ppc";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 #elif defined(SPARC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 # ifdef _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 static char cpu_arch[] = "sparcv9";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 static char cpu_arch[] = "sparc";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 #error Add appropriate cpu_arch setting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
220 // Compiler variant
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
221 #ifdef COMPILER2
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
222 #define COMPILER_VARIANT "server"
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
223 #else
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
224 #define COMPILER_VARIANT "client"
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
225 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
227
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 void os::Bsd::initialize_system_info() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229 int mib[2];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 size_t len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 int cpu_val;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
232 julong mem_val;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 /* get processors count via hw.ncpus sysctl */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 mib[0] = CTL_HW;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 mib[1] = HW_NCPU;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 len = sizeof(cpu_val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
239 assert(len == sizeof(cpu_val), "unexpected data size");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240 set_processor_count(cpu_val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 set_processor_count(1); // fallback
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
246 /* get physical memory via hw.memsize sysctl (hw.memsize is used
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
247 * since it returns a 64 bit value)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 mib[0] = CTL_HW;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
250 mib[1] = HW_MEMSIZE;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 len = sizeof(mem_val);
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
252 if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
253 assert(len == sizeof(mem_val), "unexpected data size");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254 _physical_memory = mem_val;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
255 } else {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
257 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 // limit _physical_memory memory view on OpenBSD since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 // datasize rlimit restricts us anyway.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263 struct rlimit limits;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 getrlimit(RLIMIT_DATA, &limits);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
270 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
271 static const char *get_home() {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
272 const char *home_dir = ::getenv("HOME");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
273 if ((home_dir == NULL) || (*home_dir == '\0')) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
274 struct passwd *passwd_info = getpwuid(geteuid());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
275 if (passwd_info != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
276 home_dir = passwd_info->pw_dir;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
277 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
278 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
279
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
280 return home_dir;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
281 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
282 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
283
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
284 void os::init_system_properties_values() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285 // char arch[12];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288 // The next steps are taken in the product version:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289 //
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
290 // Obtain the JAVA_HOME value from the location of libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
291 // This library should be located at:
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
292 // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
293 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 // If "/jre/lib/" appears at the right place in the path, then we
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
295 // assume libjvm.so is installed in a JDK and we use this path.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
296 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 // Otherwise exit with message: "Could not create the Java virtual machine."
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299 // The following extra steps are taken in the debugging version:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 // If "/jre/lib/" does NOT appear at the right place in the path
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302 // instead of exit check for $JAVA_HOME environment variable.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
305 // then we append a fake suffix "hotspot/libjvm.so" to this path so
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
306 // it looks like libjvm.so is installed there
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
307 // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
308 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309 // Otherwise exit.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
311 // Important note: if the location of libjvm.so changes this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
312 // code needs to be changed accordingly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314 // The next few definitions allow the code to be verbatim:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
315 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
316 #define getenv(n) ::getenv(n)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
317
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319 * See ld(1):
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 * The linker uses the following search paths to locate required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321 * shared libraries:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322 * 1: ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
323 * ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
324 * 7: The default directories, normally /lib and /usr/lib.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
325 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
326 #ifndef DEFAULT_LIBPATH
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
327 #define DEFAULT_LIBPATH "/lib:/usr/lib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
328 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
329
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
330 #define EXTENSIONS_DIR "/lib/ext"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
331 #define ENDORSED_DIR "/lib/endorsed"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
332 #define REG_DIR "/usr/java/packages"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
333
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
334 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
335 #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
336 #define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
337 const char *user_home_dir = get_home();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
338 // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
339 int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
340 sizeof(SYS_EXTENSIONS_DIRS);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
341 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
342
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
343 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
344 /* sysclasspath, java_home, dll_dir */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
345 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
346 char *home_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
347 char *dll_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
348 char *pslash;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
349 char buf[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
350 os::jvm_path(buf, sizeof(buf));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
351
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
352 // Found the full path to libjvm.so.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
353 // Now cut the path to <java_home>/jre if we can.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
354 *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
355 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
356 if (pslash != NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
357 *pslash = '\0'; /* get rid of /{client|server|hotspot} */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
358 dll_path = malloc(strlen(buf) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
359 if (dll_path == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
360 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
361 strcpy(dll_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
362 Arguments::set_dll_dir(dll_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
363
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
364 if (pslash != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
365 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
366 if (pslash != NULL) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
367 *pslash = '\0'; /* get rid of /<arch> (/lib on macosx) */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
368 #ifndef __APPLE__
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
369 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
370 if (pslash != NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
371 *pslash = '\0'; /* get rid of /lib */
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
372 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
373 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
374 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
375
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
376 home_path = malloc(strlen(buf) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
377 if (home_path == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
378 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
379 strcpy(home_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
380 Arguments::set_java_home(home_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
381
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
382 if (!set_boot_path('/', ':'))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
383 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
384 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
385
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
386 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
387 * Where to look for native libraries
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
388 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
389 * Note: Due to a legacy implementation, most of the library path
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
390 * is set in the launcher. This was to accomodate linking restrictions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
391 * on legacy Bsd implementations (which are no longer supported).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
392 * Eventually, all the library path setting will be done here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
393 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
394 * However, to prevent the proliferation of improperly built native
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
395 * libraries, the new path component /usr/java/packages is added here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
396 * Eventually, all the library path setting will be done here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
397 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
398 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
399 char *ld_library_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
400
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
401 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
402 * Construct the invariant part of ld_library_path. Note that the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
403 * space for the colon and the trailing null are provided by the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
404 * nulls included by the sizeof operator (so actually we allocate
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
405 * a byte more than necessary).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
406 */
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
407 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
408 ld_library_path = (char *) malloc(system_ext_size);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
409 sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
410 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
411 ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
412 strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
413 sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
414 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
415
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
416 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
417 * Get the user setting of LD_LIBRARY_PATH, and prepended it. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
418 * should always exist (until the legacy problem cited above is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
419 * addressed).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
420 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
421 #ifdef __APPLE__
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
422 // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
423 char *l = getenv("JAVA_LIBRARY_PATH");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
424 if (l != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
425 char *t = ld_library_path;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
426 /* That's +1 for the colon and +1 for the trailing '\0' */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
427 ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
428 sprintf(ld_library_path, "%s:%s", l, t);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
429 free(t);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
430 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
431
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
432 char *v = getenv("DYLD_LIBRARY_PATH");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
433 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
434 char *v = getenv("LD_LIBRARY_PATH");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
435 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
436 if (v != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
437 char *t = ld_library_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
438 /* That's +1 for the colon and +1 for the trailing '\0' */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
439 ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
440 sprintf(ld_library_path, "%s:%s", v, t);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
441 free(t);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
442 }
4960
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
443
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
444 #ifdef __APPLE__
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
445 // Apple's Java6 has "." at the beginning of java.library.path.
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
446 // OpenJDK on Windows has "." at the end of java.library.path.
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
447 // OpenJDK on Linux and Solaris don't have "." in java.library.path
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
448 // at all. To ease the transition from Apple's Java6 to OpenJDK7,
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
449 // "." is appended to the end of java.library.path. Yes, this
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
450 // could cause a change in behavior, but Apple's Java6 behavior
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
451 // can be achieved by putting "." at the beginning of the
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
452 // JAVA_LIBRARY_PATH environment variable.
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
453 {
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
454 char *t = ld_library_path;
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
455 // that's +3 for appending ":." and the trailing '\0'
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
456 ld_library_path = (char *) malloc(strlen(t) + 3);
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
457 sprintf(ld_library_path, "%s:%s", t, ".");
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
458 free(t);
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
459 }
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
460 #endif
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
461
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
462 Arguments::set_library_path(ld_library_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
463 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
464
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
465 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
466 * Extensions directories.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
467 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
468 * Note that the space for the colon and the trailing null are provided
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
469 * by the nulls included by the sizeof operator (so actually one byte more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
470 * than necessary is allocated).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
471 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
472 {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
473 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
474 char *buf = malloc(strlen(Arguments::get_java_home()) +
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
475 sizeof(EXTENSIONS_DIR) + system_ext_size);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
476 sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
477 SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
478 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
479 char *buf = malloc(strlen(Arguments::get_java_home()) +
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
480 sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
481 sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
482 Arguments::get_java_home());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
483 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
484
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
485 Arguments::set_ext_dirs(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
486 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
487
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
488 /* Endorsed standards default directory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
489 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
490 char * buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
491 buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
492 sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
493 Arguments::set_endorsed_dirs(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
494 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
495 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
496
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
497 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
498 #undef SYS_EXTENSIONS_DIR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
499 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
500 #undef malloc
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
501 #undef getenv
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
502 #undef EXTENSIONS_DIR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
503 #undef ENDORSED_DIR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
504
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
505 // Done
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
506 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
507 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
508
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
509 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
510 // breakpoint support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
511
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
512 void os::breakpoint() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
513 BREAKPOINT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
514 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
515
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
516 extern "C" void breakpoint() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
517 // use debugger to set breakpoint here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
518 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
519
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
520 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
521 // signal support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
522
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
523 debug_only(static bool signal_sets_initialized = false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
524 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
525
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
526 bool os::Bsd::is_sig_ignored(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
527 struct sigaction oact;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
528 sigaction(sig, (struct sigaction*)NULL, &oact);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
529 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
530 : CAST_FROM_FN_PTR(void*, oact.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
531 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
532 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
533 else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
534 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
535 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
536
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
537 void os::Bsd::signal_sets_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
538 // Should also have an assertion stating we are still single-threaded.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
539 assert(!signal_sets_initialized, "Already initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
540 // Fill in signals that are necessarily unblocked for all threads in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
541 // the VM. Currently, we unblock the following signals:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
542 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
543 // by -Xrs (=ReduceSignalUsage));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
544 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
545 // other threads. The "ReduceSignalUsage" boolean tells us not to alter
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
546 // the dispositions or masks wrt these signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
547 // Programs embedding the VM that want to use the above signals for their
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
548 // own purposes must, at this time, use the "-Xrs" option to prevent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
549 // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
550 // (See bug 4345157, and other related bugs).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
551 // In reality, though, unblocking these signals is really a nop, since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
552 // these signals are not blocked by default.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
553 sigemptyset(&unblocked_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
554 sigemptyset(&allowdebug_blocked_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
555 sigaddset(&unblocked_sigs, SIGILL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
556 sigaddset(&unblocked_sigs, SIGSEGV);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
557 sigaddset(&unblocked_sigs, SIGBUS);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
558 sigaddset(&unblocked_sigs, SIGFPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
559 sigaddset(&unblocked_sigs, SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
560
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
561 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
562 if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
563 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
564 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
565 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
566 if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
567 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
568 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
569 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
570 if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
571 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
572 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
573 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
574 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
575 // Fill in signals that are blocked by all but the VM thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
576 sigemptyset(&vm_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
577 if (!ReduceSignalUsage)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
578 sigaddset(&vm_sigs, BREAK_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
579 debug_only(signal_sets_initialized = true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
580
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
581 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
582
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
583 // These are signals that are unblocked while a thread is running Java.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
584 // (For some reason, they get blocked by default.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
585 sigset_t* os::Bsd::unblocked_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
586 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
587 return &unblocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
588 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
589
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
590 // These are the signals that are blocked while a (non-VM) thread is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
591 // running Java. Only the VM thread handles these signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
592 sigset_t* os::Bsd::vm_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
593 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
594 return &vm_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
595 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
596
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
597 // These are signals that are blocked during cond_wait to allow debugger in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
598 sigset_t* os::Bsd::allowdebug_blocked_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
599 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
600 return &allowdebug_blocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
601 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
602
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
603 void os::Bsd::hotspot_sigmask(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
604
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
605 //Save caller's signal mask before setting VM signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
606 sigset_t caller_sigmask;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
607 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
608
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
609 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
610 osthread->set_caller_sigmask(caller_sigmask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
611
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
612 pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
613
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
614 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
615 if (thread->is_VM_thread()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
616 // Only the VM thread handles BREAK_SIGNAL ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
617 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
618 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
619 // ... all other threads block BREAK_SIGNAL
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
620 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
621 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
622 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
623 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
624
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
625
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
626 //////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
627 // create new thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
628
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
629 // check if it's safe to start a new thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
630 static bool _thread_safety_check(Thread* thread) {
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
631 return true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
632 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
633
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
634 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
635 // library handle for calling objc_registerThreadWithCollector()
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
636 // without static linking to the libobjc library
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
637 #define OBJC_LIB "/usr/lib/libobjc.dylib"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
638 #define OBJC_GCREGISTER "objc_registerThreadWithCollector"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
639 typedef void (*objc_registerThreadWithCollector_t)();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
640 extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
641 objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
642 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
643
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
644 #ifdef __APPLE__
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
645 static uint64_t locate_unique_thread_id(mach_port_t mach_thread_port) {
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
646 // Additional thread_id used to correlate threads in SA
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
647 thread_identifier_info_data_t m_ident_info;
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
648 mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
649
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
650 thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO,
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
651 (thread_info_t) &m_ident_info, &count);
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
652
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
653 return m_ident_info.thread_id;
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
654 }
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
655 #endif
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
656
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
657 // Thread start routine for all newly created threads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
658 static void *java_start(Thread *thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
659 // Try to randomize the cache line index of hot stack frames.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
660 // This helps when threads of the same stack traces evict each other's
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
661 // cache lines. The threads can be either from the same JVM instance, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
662 // from different JVM instances. The benefit is especially true for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
663 // processors with hyperthreading technology.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
664 static int counter = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
665 int pid = os::current_process_id();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
666 alloca(((pid ^ counter++) & 7) * 128);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
667
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
668 ThreadLocalStorage::set_thread(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
669
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
670 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
671 Monitor* sync = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
672
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
673 // non floating stack BsdThreads needs extra check, see above
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
674 if (!_thread_safety_check(thread)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
675 // notify parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
676 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
677 osthread->set_state(ZOMBIE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
678 sync->notify_all();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
679 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
680 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
681
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
682 #ifdef __APPLE__
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
683 // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
684 mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
685 guarantee(thread_id != 0, "thread id missing from pthreads");
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
686 osthread->set_thread_id(thread_id);
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
687
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
688 uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
689 guarantee(unique_thread_id != 0, "unique thread id was not found");
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
690 osthread->set_unique_thread_id(unique_thread_id);
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
691 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
692 // thread_id is pthread_id on BSD
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
693 osthread->set_thread_id(::pthread_self());
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
694 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
695 // initialize signal mask for this thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
696 os::Bsd::hotspot_sigmask(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
697
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
698 // initialize floating point control register
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
699 os::Bsd::init_thread_fpu_state();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
700
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
701 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
702 // register thread with objc gc
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
703 if (objc_registerThreadWithCollectorFunction != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
704 objc_registerThreadWithCollectorFunction();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
705 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
706 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
707
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
708 // handshaking with parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
709 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
710 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
711
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
712 // notify parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
713 osthread->set_state(INITIALIZED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
714 sync->notify_all();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
715
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
716 // wait until os::start_thread()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
717 while (osthread->get_state() == INITIALIZED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
718 sync->wait(Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
719 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
720 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
721
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
722 // call one more level start routine
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
723 thread->run();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
724
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
725 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
726 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
727
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
728 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
729 assert(thread->osthread() == NULL, "caller responsible");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
730
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
731 // Allocate the OSThread object
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
732 OSThread* osthread = new OSThread(NULL, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
733 if (osthread == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
734 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
735 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
736
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
737 // set the correct thread state
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
738 osthread->set_thread_type(thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
739
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
740 // Initial state is ALLOCATED but not INITIALIZED
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
741 osthread->set_state(ALLOCATED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
742
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
743 thread->set_osthread(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
744
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
745 // init thread attributes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
746 pthread_attr_t attr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
747 pthread_attr_init(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
748 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
749
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
750 // stack size
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
751 if (os::Bsd::supports_variable_stack_size()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
752 // calculate stack size if it's not specified by caller
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
753 if (stack_size == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
754 stack_size = os::Bsd::default_stack_size(thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
755
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
756 switch (thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
757 case os::java_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
758 // Java threads use ThreadStackSize which default value can be
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
759 // changed with the flag -Xss
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
760 assert (JavaThread::stack_size_at_create() > 0, "this should be set");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
761 stack_size = JavaThread::stack_size_at_create();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
762 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
763 case os::compiler_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
764 if (CompilerThreadStackSize > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
765 stack_size = (size_t)(CompilerThreadStackSize * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
766 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
767 } // else fall through:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
768 // use VMThreadStackSize if CompilerThreadStackSize is not defined
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
769 case os::vm_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
770 case os::pgc_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
771 case os::cgc_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
772 case os::watcher_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
773 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
774 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
775 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
776 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
777
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
778 stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
779 pthread_attr_setstacksize(&attr, stack_size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
780 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
781 // let pthread_create() pick the default value.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
782 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
783
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
784 ThreadState state;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
785
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
786 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
787 pthread_t tid;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
788 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
789
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
790 pthread_attr_destroy(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
791
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
792 if (ret != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
793 if (PrintMiscellaneous && (Verbose || WizardMode)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
794 perror("pthread_create()");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
795 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
796 // Need to clean up stuff we've allocated so far
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
797 thread->set_osthread(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
798 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
799 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
800 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
801
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
802 // Store pthread info into the OSThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
803 osthread->set_pthread_id(tid);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
804
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
805 // Wait until child thread is either initialized or aborted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
806 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
807 Monitor* sync_with_child = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
808 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
809 while ((state = osthread->get_state()) == ALLOCATED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
810 sync_with_child->wait(Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
811 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
812 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
813
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
814 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
815
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
816 // Aborted due to thread limit being reached
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
817 if (state == ZOMBIE) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
818 thread->set_osthread(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
819 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
820 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
821 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
822
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
823 // The thread is returned suspended (in state INITIALIZED),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
824 // and is started higher up in the call chain
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
825 assert(state == INITIALIZED, "race condition");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
826 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
827 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
828
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
829 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
830 // attach existing thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
831
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
832 // bootstrap the main thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
833 bool os::create_main_thread(JavaThread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
834 assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
835 return create_attached_thread(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
836 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
837
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
838 bool os::create_attached_thread(JavaThread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
839 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
840 thread->verify_not_published();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
841 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
842
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
843 // Allocate the OSThread object
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
844 OSThread* osthread = new OSThread(NULL, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
845
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
846 if (osthread == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
847 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
848 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
849
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
850 // Store pthread info into the OSThread
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
851 #ifdef __APPLE__
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
852 // thread_id is mach thread on macos, which pthreads graciously caches and provides for us
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
853 mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self());
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
854 guarantee(thread_id != 0, "just checking");
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
855 osthread->set_thread_id(thread_id);
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
856
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
857 uint64_t unique_thread_id = locate_unique_thread_id(thread_id);
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
858 guarantee(unique_thread_id != 0, "just checking");
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
859 osthread->set_unique_thread_id(unique_thread_id);
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
860 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
861 osthread->set_thread_id(::pthread_self());
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
862 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
863 osthread->set_pthread_id(::pthread_self());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
864
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
865 // initialize floating point control register
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
866 os::Bsd::init_thread_fpu_state();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
867
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
868 // Initial thread state is RUNNABLE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
869 osthread->set_state(RUNNABLE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
870
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
871 thread->set_osthread(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
872
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
873 // initialize signal mask for this thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
874 // and save the caller's signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
875 os::Bsd::hotspot_sigmask(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
876
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
877 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
878 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
879
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
880 void os::pd_start_thread(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
881 OSThread * osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
882 assert(osthread->get_state() != INITIALIZED, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
883 Monitor* sync_with_child = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
884 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
885 sync_with_child->notify();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
886 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
887
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
888 // Free Bsd resources related to the OSThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
889 void os::free_thread(OSThread* osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
890 assert(osthread != NULL, "osthread not set");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
891
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
892 if (Thread::current()->osthread() == osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
893 // Restore caller's signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
894 sigset_t sigmask = osthread->caller_sigmask();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
895 pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
896 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
897
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
898 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
899 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
900
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
901 //////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
902 // thread local storage
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
903
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
904 int os::allocate_thread_local_storage() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
905 pthread_key_t key;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
906 int rslt = pthread_key_create(&key, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
907 assert(rslt == 0, "cannot allocate thread local storage");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
908 return (int)key;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
909 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
910
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
911 // Note: This is currently not used by VM, as we don't destroy TLS key
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
912 // on VM exit.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
913 void os::free_thread_local_storage(int index) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
914 int rslt = pthread_key_delete((pthread_key_t)index);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
915 assert(rslt == 0, "invalid index");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
916 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
917
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
918 void os::thread_local_storage_at_put(int index, void* value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
919 int rslt = pthread_setspecific((pthread_key_t)index, value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
920 assert(rslt == 0, "pthread_setspecific failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
921 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
922
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
923 extern "C" Thread* get_thread() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
924 return ThreadLocalStorage::thread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
925 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
926
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
927
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
928 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
929 // time support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
930
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
931 // Time since start-up in seconds to a fine granularity.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
932 // Used by VMSelfDestructTimer and the MemProfiler.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
933 double os::elapsedTime() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
934
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
935 return (double)(os::elapsed_counter()) * 0.000001;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
936 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
937
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
938 jlong os::elapsed_counter() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
939 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
940 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
941 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
942 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
943
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
944 jlong os::elapsed_frequency() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
945 return (1000 * 1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
946 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
947
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10208
diff changeset
948 bool os::supports_vtime() { return true; }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
949 bool os::enable_vtime() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
950 bool os::vtime_enabled() { return false; }
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10208
diff changeset
951
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
952 double os::elapsedVTime() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
953 // better than nothing, but not much
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
954 return elapsedTime();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
955 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
956
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
957 jlong os::javaTimeMillis() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
958 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
959 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
960 assert(status != -1, "bsd error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
961 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
962 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
963
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
964 #ifndef CLOCK_MONOTONIC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
965 #define CLOCK_MONOTONIC (1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
966 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
967
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
968 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
969 void os::Bsd::clock_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
970 // XXXDARWIN: Investigate replacement monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
971 }
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
972 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
973 void os::Bsd::clock_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
974 struct timespec res;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
975 struct timespec tp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
976 if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
977 ::clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
978 // yes, monotonic clock is supported
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
979 _clock_gettime = ::clock_gettime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
980 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
981 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
982 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
983
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
984
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
985 jlong os::javaTimeNanos() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
986 if (Bsd::supports_monotonic_clock()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
987 struct timespec tp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
988 int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
989 assert(status == 0, "gettime error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
990 jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
991 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
992 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
993 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
994 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
995 assert(status != -1, "bsd error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
996 jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
997 return 1000 * usecs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
998 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
999 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1001 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1002 if (Bsd::supports_monotonic_clock()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1003 info_ptr->max_value = ALL_64_BITS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1004
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1005 // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1006 info_ptr->may_skip_backward = false; // not subject to resetting or drifting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1007 info_ptr->may_skip_forward = false; // not subject to resetting or drifting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1008 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1009 // gettimeofday - based on time in seconds since the Epoch thus does not wrap
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1010 info_ptr->max_value = ALL_64_BITS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1011
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1012 // gettimeofday is a real time clock so it skips
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1013 info_ptr->may_skip_backward = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1014 info_ptr->may_skip_forward = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1015 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1016
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1017 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1018 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1019
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1020 // Return the real, user, and system times in seconds from an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1021 // arbitrary fixed point in the past.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1022 bool os::getTimesSecs(double* process_real_time,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1023 double* process_user_time,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1024 double* process_system_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1025 struct tms ticks;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1026 clock_t real_ticks = times(&ticks);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1027
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1028 if (real_ticks == (clock_t) (-1)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1029 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1030 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1031 double ticks_per_second = (double) clock_tics_per_sec;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1032 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1033 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1034 *process_real_time = ((double) real_ticks) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1035
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1036 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1037 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1038 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1039
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1040
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1041 char * os::local_time_string(char *buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1042 struct tm t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1043 time_t long_time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1044 time(&long_time);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1045 localtime_r(&long_time, &t);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1046 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1047 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1048 t.tm_hour, t.tm_min, t.tm_sec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1049 return buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1050 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1051
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1052 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1053 return localtime_r(clock, res);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1054 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1055
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1056 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1057 // runtime exit support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1058
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1059 // Note: os::shutdown() might be called very early during initialization, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1060 // called from signal handler. Before adding something to os::shutdown(), make
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1061 // sure it is async-safe and can handle partially initialized VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1062 void os::shutdown() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1063
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1064 // allow PerfMemory to attempt cleanup of any persistent resources
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1065 perfMemory_exit();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1066
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1067 // needs to remove object in file system
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1068 AttachListener::abort();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1069
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1070 // flush buffered output, finish log files
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1071 ostream_abort();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1072
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1073 // Check for abort hook
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1074 abort_hook_t abort_hook = Arguments::abort_hook();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1075 if (abort_hook != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1076 abort_hook();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1077 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1078
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1079 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1080
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1081 // Note: os::abort() might be called very early during initialization, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1082 // called from signal handler. Before adding something to os::abort(), make
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1083 // sure it is async-safe and can handle partially initialized VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1084 void os::abort(bool dump_core) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1085 os::shutdown();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1086 if (dump_core) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1087 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1088 fdStream out(defaultStream::output_fd());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1089 out.print_raw("Current thread is ");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1090 char buf[16];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1091 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1092 out.print_raw_cr(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1093 out.print_raw_cr("Dumping core ...");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1094 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1095 ::abort(); // dump core
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1096 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1097
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1098 ::exit(1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1099 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1100
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1101 // Die immediately, no exit hook, no abort hook, no cleanup.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1102 void os::die() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1103 // _exit() on BsdThreads only kills current thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1104 ::abort();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1105 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1106
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1107 // unused on bsd for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1108 void os::set_error_file(const char *logfile) {}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1109
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1110
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1111 // This method is a copy of JDK's sysGetLastErrorString
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1112 // from src/solaris/hpi/src/system_md.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1113
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1114 size_t os::lasterror(char *buf, size_t len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1115
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1116 if (errno == 0) return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1118 const char *s = ::strerror(errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1119 size_t n = ::strlen(s);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1120 if (n >= len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1121 n = len - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1122 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1123 ::strncpy(buf, s, n);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1124 buf[n] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1125 return n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1126 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1127
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1128 intx os::current_thread_id() {
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1129 #ifdef __APPLE__
12095
c6ec0a97b30a 8022808: Kitchensink hangs on macos
sla
parents: 11092
diff changeset
1130 return (intx)::pthread_mach_thread_np(::pthread_self());
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1131 #else
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1132 return (intx)::pthread_self();
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1133 #endif
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1134 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1135 int os::current_process_id() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1136
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1137 // Under the old bsd thread library, bsd gives each thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1138 // its own process id. Because of this each thread will return
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1139 // a different pid if this method were to return the result
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1140 // of getpid(2). Bsd provides no api that returns the pid
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1141 // of the launcher thread for the vm. This implementation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1142 // returns a unique pid, the pid of the launcher thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1143 // that starts the vm 'process'.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1144
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1145 // Under the NPTL, getpid() returns the same pid as the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1146 // launcher thread rather than a unique pid per thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1147 // Use gettid() if you want the old pre NPTL behaviour.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1148
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1149 // if you are looking for the result of a call to getpid() that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1150 // returns a unique pid for the calling thread, then look at the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1151 // OSThread::thread_id() method in osThread_bsd.hpp file
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1152
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1153 return (int)(_initial_pid ? _initial_pid : getpid());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1154 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1155
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1156 // DLL functions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1157
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1158 #define JNI_LIB_PREFIX "lib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1159 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1160 #define JNI_LIB_SUFFIX ".dylib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1161 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1162 #define JNI_LIB_SUFFIX ".so"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1163 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1164
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1165 const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1166
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1167 // This must be hard coded because it's the system's temporary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1168 // directory not the java application's temp directory, ala java.io.tmpdir.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1169 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1170 // macosx has a secure per-user temporary directory
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1171 char temp_path_storage[PATH_MAX];
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1172 const char* os::get_temp_directory() {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1173 static char *temp_path = NULL;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1174 if (temp_path == NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1175 int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1176 if (pathSize == 0 || pathSize > PATH_MAX) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1177 strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1178 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1179 temp_path = temp_path_storage;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1180 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1181 return temp_path;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1182 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1183 #else /* __APPLE__ */
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1184 const char* os::get_temp_directory() { return "/tmp"; }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1185 #endif /* __APPLE__ */
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1186
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1187 static bool file_exists(const char* filename) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1188 struct stat statbuf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1189 if (filename == NULL || strlen(filename) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1190 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1191 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1192 return os::stat(filename, &statbuf) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1193 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1194
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1195 bool os::dll_build_name(char* buffer, size_t buflen,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1196 const char* pname, const char* fname) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1197 bool retval = false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1198 // Copied from libhpi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1199 const size_t pnamelen = pname ? strlen(pname) : 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1200
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1201 // Return error on buffer overflow.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1202 if (pnamelen + strlen(fname) + strlen(JNI_LIB_PREFIX) + strlen(JNI_LIB_SUFFIX) + 2 > buflen) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1203 return retval;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1204 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1205
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1206 if (pnamelen == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1207 snprintf(buffer, buflen, JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, fname);
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1208 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1209 } else if (strchr(pname, *os::path_separator()) != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1210 int n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1211 char** pelements = split_path(pname, &n);
9059
17bf4d428955 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 8713
diff changeset
1212 if (pelements == NULL) {
9062
dcubed
parents: 8854 9060
diff changeset
1213 return false;
9059
17bf4d428955 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 8713
diff changeset
1214 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1215 for (int i = 0 ; i < n ; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1216 // Really shouldn't be NULL, but check can't hurt
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1217 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1218 continue; // skip the empty path values
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1219 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1220 snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1221 pelements[i], fname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1222 if (file_exists(buffer)) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1223 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1224 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1225 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1226 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1227 // release the storage
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1228 for (int i = 0 ; i < n ; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1229 if (pelements[i] != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1230 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1231 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1232 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1233 if (pelements != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1234 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1235 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1236 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1237 snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1238 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1239 }
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1240 return retval;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1241 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1242
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1243 // check if addr is inside libjvm.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1244 bool os::address_is_in_vm(address addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1245 static address libjvm_base_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1246 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1247
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1248 if (libjvm_base_addr == NULL) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1249 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1250 libjvm_base_addr = (address)dlinfo.dli_fbase;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1251 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1252 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1253 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1254
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1255 if (dladdr((void *)addr, &dlinfo) != 0) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1256 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1257 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1258
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1259 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1260 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1261
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1262
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1263 #define MACH_MAXSYMLEN 256
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1264
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1265 bool os::dll_address_to_function_name(address addr, char *buf,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1266 int buflen, int *offset) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1267 // buf is not optional, but offset is optional
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1268 assert(buf != NULL, "sanity check");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1269
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1270 Dl_info dlinfo;
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1271 char localbuf[MACH_MAXSYMLEN];
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1272
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1273 if (dladdr((void*)addr, &dlinfo) != 0) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1274 // see if we have a matching symbol
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1275 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1276 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1277 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1278 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1279 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1280 return true;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1281 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1282 // no matching symbol so try for just file info
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1283 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1284 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1285 buf, buflen, offset, dlinfo.dli_fname)) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1286 return true;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1287 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1288 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1289
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1290 // Handle non-dynamic manually:
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1291 if (dlinfo.dli_fbase != NULL &&
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1292 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1293 dlinfo.dli_fbase)) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1294 if (!Decoder::demangle(localbuf, buf, buflen)) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1295 jio_snprintf(buf, buflen, "%s", localbuf);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1296 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1297 return true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1298 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1299 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1300 buf[0] = '\0';
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1301 if (offset != NULL) *offset = -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1302 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1303 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1304
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1305 // ported from solaris version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1306 bool os::dll_address_to_library_name(address addr, char* buf,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1307 int buflen, int* offset) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1308 // buf is not optional, but offset is optional
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1309 assert(buf != NULL, "sanity check");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1310
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1311 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1312
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1313 if (dladdr((void*)addr, &dlinfo) != 0) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1314 if (dlinfo.dli_fname != NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1315 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1316 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1317 if (dlinfo.dli_fbase != NULL && offset != NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1318 *offset = addr - (address)dlinfo.dli_fbase;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1319 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1320 return true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1321 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1322
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1323 buf[0] = '\0';
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1324 if (offset) *offset = -1;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1325 return false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1326 }
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1327
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1328 // Loads .dll/.so and
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1329 // in case of error it checks if .dll/.so was built for the
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1330 // same architecture as Hotspot is running on
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1331
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1332 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1333 void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1334 void * result= ::dlopen(filename, RTLD_LAZY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1335 if (result != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1336 // Successful loading
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1337 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1338 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1339
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1340 // Read system error message into ebuf
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1341 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1342 ebuf[ebuflen-1]='\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1343
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1344 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1345 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1346 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1347 void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1348 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1349 void * result= ::dlopen(filename, RTLD_LAZY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1350 if (result != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1351 // Successful loading
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1352 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1353 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1354
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1355 Elf32_Ehdr elf_head;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1356
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1357 // Read system error message into ebuf
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1358 // It may or may not be overwritten below
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1359 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1360 ebuf[ebuflen-1]='\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1361 int diag_msg_max_length=ebuflen-strlen(ebuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1362 char* diag_msg_buf=ebuf+strlen(ebuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1363
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1364 if (diag_msg_max_length==0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1365 // No more space in ebuf for additional diagnostics message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1366 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1367 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1368
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1369
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1370 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1371
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1372 if (file_descriptor < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1373 // Can't open library, report dlerror() message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1374 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1375 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1376
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1377 bool failed_to_read_elf_head=
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1378 (sizeof(elf_head)!=
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1379 (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1380
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1381 ::close(file_descriptor);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1382 if (failed_to_read_elf_head) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1383 // file i/o error - report dlerror() msg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1384 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1385 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1386
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1387 typedef struct {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1388 Elf32_Half code; // Actual value as defined in elf.h
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1389 Elf32_Half compat_class; // Compatibility of archs at VM's sense
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1390 char elf_class; // 32 or 64 bit
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1391 char endianess; // MSB or LSB
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1392 char* name; // String representation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1393 } arch_t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1394
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1395 #ifndef EM_486
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1396 #define EM_486 6 /* Intel 80486 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1397 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1398
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1399 #ifndef EM_MIPS_RS3_LE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1400 #define EM_MIPS_RS3_LE 10 /* MIPS */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1401 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1402
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1403 #ifndef EM_PPC64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1404 #define EM_PPC64 21 /* PowerPC64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1405 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1406
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1407 #ifndef EM_S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1408 #define EM_S390 22 /* IBM System/390 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1409 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1410
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1411 #ifndef EM_IA_64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1412 #define EM_IA_64 50 /* HP/Intel IA-64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1413 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1414
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1415 #ifndef EM_X86_64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1416 #define EM_X86_64 62 /* AMD x86-64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1417 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1418
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1419 static const arch_t arch_array[]={
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1420 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1421 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1422 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1423 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1424 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1425 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1426 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1427 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1428 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1429 {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1430 {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1431 {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1432 {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1433 {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1434 {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1435 {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1436 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1437
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1438 #if (defined IA32)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1439 static Elf32_Half running_arch_code=EM_386;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1440 #elif (defined AMD64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1441 static Elf32_Half running_arch_code=EM_X86_64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1442 #elif (defined IA64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1443 static Elf32_Half running_arch_code=EM_IA_64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1444 #elif (defined __sparc) && (defined _LP64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1445 static Elf32_Half running_arch_code=EM_SPARCV9;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1446 #elif (defined __sparc) && (!defined _LP64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1447 static Elf32_Half running_arch_code=EM_SPARC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1448 #elif (defined __powerpc64__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1449 static Elf32_Half running_arch_code=EM_PPC64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1450 #elif (defined __powerpc__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1451 static Elf32_Half running_arch_code=EM_PPC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1452 #elif (defined ARM)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1453 static Elf32_Half running_arch_code=EM_ARM;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1454 #elif (defined S390)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1455 static Elf32_Half running_arch_code=EM_S390;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1456 #elif (defined ALPHA)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1457 static Elf32_Half running_arch_code=EM_ALPHA;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1458 #elif (defined MIPSEL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1459 static Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1460 #elif (defined PARISC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1461 static Elf32_Half running_arch_code=EM_PARISC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1462 #elif (defined MIPS)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1463 static Elf32_Half running_arch_code=EM_MIPS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1464 #elif (defined M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1465 static Elf32_Half running_arch_code=EM_68K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1466 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1467 #error Method os::dll_load requires that one of following is defined:\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1468 IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1469 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1470
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1471 // Identify compatability class for VM's architecture and library's architecture
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1472 // Obtain string descriptions for architectures
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1473
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1474 arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1475 int running_arch_index=-1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1476
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1477 for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1478 if (running_arch_code == arch_array[i].code) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1479 running_arch_index = i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1480 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1481 if (lib_arch.code == arch_array[i].code) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1482 lib_arch.compat_class = arch_array[i].compat_class;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1483 lib_arch.name = arch_array[i].name;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1484 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1485 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1486
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1487 assert(running_arch_index != -1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1488 "Didn't find running architecture code (running_arch_code) in arch_array");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1489 if (running_arch_index == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1490 // Even though running architecture detection failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1491 // we may still continue with reporting dlerror() message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1492 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1493 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1494
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1495 if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1496 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1497 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1498 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1499
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1500 #ifndef S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1501 if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1502 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1503 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1504 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1505 #endif // !S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1506
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1507 if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1508 if ( lib_arch.name!=NULL ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1509 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1510 " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1511 lib_arch.name, arch_array[running_arch_index].name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1512 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1513 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1514 " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1515 lib_arch.code,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1516 arch_array[running_arch_index].name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1517 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1518 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1519
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1520 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1521 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1522 #endif /* !__APPLE__ */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1523
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1524 // XXX: Do we need a lock around this as per Linux?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1525 void* os::dll_lookup(void* handle, const char* name) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1526 return dlsym(handle, name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1527 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1528
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1529
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1530 static bool _print_ascii_file(const char* filename, outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1531 int fd = ::open(filename, O_RDONLY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1532 if (fd == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1533 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1534 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1535
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1536 char buf[32];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1537 int bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1538 while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1539 st->print_raw(buf, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1540 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1541
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1542 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1543
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1544 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1545 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1546
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1547 void os::print_dll_info(outputStream *st) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1548 st->print_cr("Dynamic libraries:");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1549 #ifdef RTLD_DI_LINKMAP
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1550 Dl_info dli;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1551 void *handle;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1552 Link_map *map;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1553 Link_map *p;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1554
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1555 if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1556 dli.dli_fname == NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1557 st->print_cr("Error: Cannot print dynamic libraries.");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1558 return;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1559 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1560 handle = dlopen(dli.dli_fname, RTLD_LAZY);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1561 if (handle == NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1562 st->print_cr("Error: Cannot print dynamic libraries.");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1563 return;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1564 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1565 dlinfo(handle, RTLD_DI_LINKMAP, &map);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1566 if (map == NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1567 st->print_cr("Error: Cannot print dynamic libraries.");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1568 return;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1569 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1570
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1571 while (map->l_prev != NULL)
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1572 map = map->l_prev;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1573
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1574 while (map != NULL) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1575 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1576 map = map->l_next;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1577 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1578
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1579 dlclose(handle);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1580 #elif defined(__APPLE__)
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1581 uint32_t count;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1582 uint32_t i;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1583
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1584 count = _dyld_image_count();
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1585 for (i = 1; i < count; i++) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1586 const char *name = _dyld_get_image_name(i);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1587 intptr_t slide = _dyld_get_image_vmaddr_slide(i);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1588 st->print_cr(PTR_FORMAT " \t%s", slide, name);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1589 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1590 #else
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1591 st->print_cr("Error: Cannot print dynamic libraries.");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1592 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1593 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1594
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1595 void os::print_os_info_brief(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1596 st->print("Bsd");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1597
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1598 os::Posix::print_uname_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1599 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1600
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1601 void os::print_os_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1602 st->print("OS:");
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1603 st->print("Bsd");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1604
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1605 os::Posix::print_uname_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1606
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1607 os::Posix::print_rlimit_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1608
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1609 os::Posix::print_load_average(st);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1610 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1611
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1612 void os::pd_print_cpu_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1613 // Nothing to do for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1614 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1615
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1616 void os::print_memory_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1617
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1618 st->print("Memory:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1619 st->print(" %dk page", os::vm_page_size()>>10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1620
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1621 st->print(", physical " UINT64_FORMAT "k",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1622 os::physical_memory() >> 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1623 st->print("(" UINT64_FORMAT "k free)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1624 os::available_memory() >> 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1625 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1626
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1627 // meminfo
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1628 st->print("\n/proc/meminfo:\n");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1629 _print_ascii_file("/proc/meminfo", st);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1630 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1631 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1632
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1633 // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1634 // but they're the same for all the bsd arch that we support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1635 // and they're the same for solaris but there's no common place to put this.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1636 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1637 "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1638 "ILL_COPROC", "ILL_BADSTK" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1639
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1640 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1641 "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1642 "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1643
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1644 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1645
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1646 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1647
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1648 void os::print_siginfo(outputStream* st, void* siginfo) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1649 st->print("siginfo:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1650
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1651 const int buflen = 100;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1652 char buf[buflen];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1653 siginfo_t *si = (siginfo_t*)siginfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1654 st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1655 if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1656 st->print("si_errno=%s", buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1657 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1658 st->print("si_errno=%d", si->si_errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1659 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1660 const int c = si->si_code;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1661 assert(c > 0, "unexpected si_code");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1662 switch (si->si_signo) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1663 case SIGILL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1664 st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1665 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1666 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1667 case SIGFPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1668 st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1669 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1670 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1671 case SIGSEGV:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1672 st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1673 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1674 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1675 case SIGBUS:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1676 st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1677 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1678 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1679 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1680 st->print(", si_code=%d", si->si_code);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1681 // no si_addr
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1682 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1683
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1684 if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1685 UseSharedSpaces) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1686 FileMapInfo* mapinfo = FileMapInfo::current_info();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1687 if (mapinfo->is_in_shared_space(si->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1688 st->print("\n\nError accessing class data sharing archive." \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1689 " Mapped file inaccessible during execution, " \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1690 " possible disk/network problem.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1691 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1692 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1693 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1694 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1695
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1696
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1697 static void print_signal_handler(outputStream* st, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1698 char* buf, size_t buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1699
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1700 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1701 st->print_cr("Signal Handlers:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1702 print_signal_handler(st, SIGSEGV, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1703 print_signal_handler(st, SIGBUS , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1704 print_signal_handler(st, SIGFPE , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1705 print_signal_handler(st, SIGPIPE, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1706 print_signal_handler(st, SIGXFSZ, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1707 print_signal_handler(st, SIGILL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1708 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1709 print_signal_handler(st, SR_signum, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1710 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1711 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1712 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1713 print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1714 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1715
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1716 static char saved_jvm_path[MAXPATHLEN] = {0};
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1717
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1718 // Find the full path to the current module, libjvm
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1719 void os::jvm_path(char *buf, jint buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1720 // Error checking.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1721 if (buflen < MAXPATHLEN) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1722 assert(false, "must use a large-enough buffer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1723 buf[0] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1724 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1725 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1726 // Lazy resolve the path to current module.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1727 if (saved_jvm_path[0] != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1728 strcpy(buf, saved_jvm_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1729 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1730 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1731
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1732 char dli_fname[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1733 bool ret = dll_address_to_library_name(
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1734 CAST_FROM_FN_PTR(address, os::jvm_path),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1735 dli_fname, sizeof(dli_fname), NULL);
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1736 assert(ret, "cannot locate libjvm");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1737 char *rp = NULL;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1738 if (ret && dli_fname[0] != '\0') {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1739 rp = realpath(dli_fname, buf);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1740 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1741 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1742 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1743
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1744 if (Arguments::created_by_gamma_launcher()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1745 // Support for the gamma launcher. Typical value for buf is
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1746 // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm". If "/jre/lib/" appears at
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1747 // the right place in the string, then assume we are installed in a JDK and
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1748 // we're done. Otherwise, check for a JAVA_HOME environment variable and
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1749 // construct a path to the JVM being overridden.
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1750
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1751 const char *p = buf + strlen(buf) - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1752 for (int count = 0; p > buf && count < 5; ++count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1753 for (--p; p > buf && *p != '/'; --p)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1754 /* empty */ ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1755 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1756
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1757 if (strncmp(p, "/jre/lib/", 9) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1758 // Look for JAVA_HOME in the environment.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1759 char* java_home_var = ::getenv("JAVA_HOME");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1760 if (java_home_var != NULL && java_home_var[0] != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1761 char* jrelib_p;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1762 int len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1763
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1764 // Check the current module name "libjvm"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1765 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1766 assert(strstr(p, "/libjvm") == p, "invalid library name");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1767
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1768 rp = realpath(java_home_var, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1769 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1770 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1771
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1772 // determine if this is a legacy image or modules image
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1773 // modules image doesn't have "jre" subdirectory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1774 len = strlen(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1775 jrelib_p = buf + len;
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1776
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1777 // Add the appropriate library subdir
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1778 snprintf(jrelib_p, buflen-len, "/jre/lib");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1779 if (0 != access(buf, F_OK)) {
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1780 snprintf(jrelib_p, buflen-len, "/lib");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1781 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1782
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1783 // Add the appropriate client or server subdir
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1784 len = strlen(buf);
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1785 jrelib_p = buf + len;
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1786 snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1787 if (0 != access(buf, F_OK)) {
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1788 snprintf(jrelib_p, buflen-len, "");
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1789 }
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1790
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1791 // If the path exists within JAVA_HOME, add the JVM library name
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1792 // to complete the path to JVM being overridden. Otherwise fallback
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1793 // to the path to the current library.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1794 if (0 == access(buf, F_OK)) {
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1795 // Use current module name "libjvm"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1796 len = strlen(buf);
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1797 snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1798 } else {
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1799 // Fall back to path of current library
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1800 rp = realpath(dli_fname, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1801 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1802 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1803 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1804 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1805 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1806 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1807
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1808 strcpy(saved_jvm_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1809 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1810
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1811 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1812 // no prefix required, not even "_"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1813 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1814
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1815 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1816 // no suffix required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1817 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1818
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1819 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1820 // sun.misc.Signal support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1821
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1822 static volatile jint sigint_count = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1823
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1824 static void
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1825 UserHandler(int sig, void *siginfo, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1826 // 4511530 - sem_post is serialized and handled by the manager thread. When
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1827 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1828 // don't want to flood the manager thread with sem_post requests.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1829 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1830 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1831
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1832 // Ctrl-C is pressed during error reporting, likely because the error
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1833 // handler fails to abort. Let VM die immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1834 if (sig == SIGINT && is_error_reported()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1835 os::die();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1836 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1837
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1838 os::signal_notify(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1839 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1840
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1841 void* os::user_handler() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1842 return CAST_FROM_FN_PTR(void*, UserHandler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1843 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1844
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1845 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1846 typedef void (*sa_handler_t)(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1847 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1848 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1849
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1850 void* os::signal(int signal_number, void* handler) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1851 struct sigaction sigAct, oldSigAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1852
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1853 sigfillset(&(sigAct.sa_mask));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1854 sigAct.sa_flags = SA_RESTART|SA_SIGINFO;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1855 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1856
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1857 if (sigaction(signal_number, &sigAct, &oldSigAct)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1858 // -1 means registration failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1859 return (void *)-1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1860 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1861
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1862 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1863 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1864
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1865 void os::signal_raise(int signal_number) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1866 ::raise(signal_number);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1867 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1868
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1869 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1870 * The following code is moved from os.cpp for making this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1871 * code platform specific, which it is by its very nature.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1872 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1873
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1874 // Will be modified when max signal is changed to be dynamic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1875 int os::sigexitnum_pd() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1876 return NSIG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1877 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1878
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1879 // a counter for each possible signal value
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1880 static volatile jint pending_signals[NSIG+1] = { 0 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1881
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1882 // Bsd(POSIX) specific hand shaking semaphore.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1883 #ifdef __APPLE__
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1884 typedef semaphore_t os_semaphore_t;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1885 #define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1886 #define SEM_WAIT(sem) semaphore_wait(sem)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1887 #define SEM_POST(sem) semaphore_signal(sem)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1888 #define SEM_DESTROY(sem) semaphore_destroy(mach_task_self(), sem)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1889 #else
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1890 typedef sem_t os_semaphore_t;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1891 #define SEM_INIT(sem, value) sem_init(&sem, 0, value)
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1892 #define SEM_WAIT(sem) sem_wait(&sem)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1893 #define SEM_POST(sem) sem_post(&sem)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1894 #define SEM_DESTROY(sem) sem_destroy(&sem)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1895 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1896
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1897 class Semaphore : public StackObj {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1898 public:
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1899 Semaphore();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1900 ~Semaphore();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1901 void signal();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1902 void wait();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1903 bool trywait();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1904 bool timedwait(unsigned int sec, int nsec);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1905 private:
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1906 jlong currenttime() const;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1907 semaphore_t _semaphore;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1908 };
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1909
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1910 Semaphore::Semaphore() : _semaphore(0) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1911 SEM_INIT(_semaphore, 0);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1912 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1913
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1914 Semaphore::~Semaphore() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1915 SEM_DESTROY(_semaphore);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1916 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1917
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1918 void Semaphore::signal() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1919 SEM_POST(_semaphore);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1920 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1921
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1922 void Semaphore::wait() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1923 SEM_WAIT(_semaphore);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1924 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1925
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1926 jlong Semaphore::currenttime() const {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1927 struct timeval tv;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1928 gettimeofday(&tv, NULL);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1929 return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1930 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1931
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1932 #ifdef __APPLE__
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1933 bool Semaphore::trywait() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1934 return timedwait(0, 0);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1935 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1936
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1937 bool Semaphore::timedwait(unsigned int sec, int nsec) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1938 kern_return_t kr = KERN_ABORTED;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1939 mach_timespec_t waitspec;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1940 waitspec.tv_sec = sec;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1941 waitspec.tv_nsec = nsec;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1942
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1943 jlong starttime = currenttime();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1944
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1945 kr = semaphore_timedwait(_semaphore, waitspec);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1946 while (kr == KERN_ABORTED) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1947 jlong totalwait = (sec * NANOSECS_PER_SEC) + nsec;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1948
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1949 jlong current = currenttime();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1950 jlong passedtime = current - starttime;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1951
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1952 if (passedtime >= totalwait) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1953 waitspec.tv_sec = 0;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1954 waitspec.tv_nsec = 0;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1955 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1956 jlong waittime = totalwait - (current - starttime);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1957 waitspec.tv_sec = waittime / NANOSECS_PER_SEC;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1958 waitspec.tv_nsec = waittime % NANOSECS_PER_SEC;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1959 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1960
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1961 kr = semaphore_timedwait(_semaphore, waitspec);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1962 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1963
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1964 return kr == KERN_SUCCESS;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1965 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1966
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1967 #else
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1968
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1969 bool Semaphore::trywait() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1970 return sem_trywait(&_semaphore) == 0;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1971 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1972
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1973 bool Semaphore::timedwait(unsigned int sec, int nsec) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1974 struct timespec ts;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1975 jlong endtime = unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1976
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1977 while (1) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1978 int result = sem_timedwait(&_semaphore, &ts);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1979 if (result == 0) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1980 return true;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1981 } else if (errno == EINTR) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1982 continue;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1983 } else if (errno == ETIMEDOUT) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1984 return false;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1985 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1986 return false;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1987 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1988 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1989 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1990
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1991 #endif // __APPLE__
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1992
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1993 static os_semaphore_t sig_sem;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1994 static Semaphore sr_semaphore;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
1995
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1996 void os::signal_init_pd() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1997 // Initialize signal structures
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1998 ::memset((void*)pending_signals, 0, sizeof(pending_signals));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1999
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2000 // Initialize signal semaphore
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2001 ::SEM_INIT(sig_sem, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2002 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2003
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2004 void os::signal_notify(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2005 Atomic::inc(&pending_signals[sig]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2006 ::SEM_POST(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2007 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2008
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2009 static int check_pending_signals(bool wait) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2010 Atomic::store(0, &sigint_count);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2011 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2012 for (int i = 0; i < NSIG + 1; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2013 jint n = pending_signals[i];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2014 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2015 return i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2016 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2017 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2018 if (!wait) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2019 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2020 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2021 JavaThread *thread = JavaThread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2022 ThreadBlockInVM tbivm(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2023
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2024 bool threadIsSuspended;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2025 do {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2026 thread->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2027 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2028 ::SEM_WAIT(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2029
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2030 // were we externally suspended while we were waiting?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2031 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2032 if (threadIsSuspended) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2033 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2034 // The semaphore has been incremented, but while we were waiting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2035 // another thread suspended us. We don't want to continue running
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2036 // while suspended because that would surprise the thread that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2037 // suspended us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2038 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2039 ::SEM_POST(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2040
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2041 thread->java_suspend_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2042 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2043 } while (threadIsSuspended);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2044 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2045 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2046
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2047 int os::signal_lookup() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2048 return check_pending_signals(false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2049 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2050
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2051 int os::signal_wait() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2052 return check_pending_signals(true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2053 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2054
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2055 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2056 // Virtual Memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2057
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2058 int os::vm_page_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2059 // Seems redundant as all get out
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2060 assert(os::Bsd::page_size() != -1, "must call os::init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2061 return os::Bsd::page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2062 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2063
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2064 // Solaris allocates memory by pages.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2065 int os::vm_allocation_granularity() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2066 assert(os::Bsd::page_size() != -1, "must call os::init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2067 return os::Bsd::page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2068 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2069
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2070 // Rationale behind this function:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2071 // current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2072 // mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2073 // samples for JITted code. Here we create private executable mapping over the code cache
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2074 // and then we can use standard (well, almost, as mapping can change) way to provide
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2075 // info for the reporting script by storing timestamp and location of symbol
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2076 void bsd_wrap_code(char* base, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2077 static volatile jint cnt = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2078
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2079 if (!UseOprofile) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2080 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2081 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2082
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2083 char buf[PATH_MAX + 1];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2084 int num = Atomic::add(1, &cnt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2085
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2086 snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2087 os::get_temp_directory(), os::current_process_id(), num);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2088 unlink(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2089
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2090 int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2091
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2092 if (fd != -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2093 off_t rv = ::lseek(fd, size-2, SEEK_SET);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2094 if (rv != (off_t)-1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2095 if (::write(fd, "", 1) == 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2096 mmap(base, size,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2097 PROT_READ|PROT_WRITE|PROT_EXEC,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2098 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2099 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2100 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2101 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2102 unlink(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2103 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2104 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2105
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2106 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2107 int err) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2108 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2109 ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2110 strerror(err), err);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2111 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2112
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2113 // NOTE: Bsd kernel does not really reserve the pages for us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2114 // All it does is to check if there are enough free pages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2115 // left at the time of mmap(). This could be a potential
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2116 // problem.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2117 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2118 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2119 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2120 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2121 if (::mprotect(addr, size, prot) == 0) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2122 return true;
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2123 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2124 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2125 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2126 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2127 if (res != (uintptr_t) MAP_FAILED) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2128 return true;
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2129 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2130 #endif
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2131
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2132 // Warn about any commit errors we see in non-product builds just
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2133 // in case mmap() doesn't work as described on the man page.
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2134 NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);)
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2135
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2136 return false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2137 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2138
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2139 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2140 bool exec) {
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2141 // alignment_hint is ignored on this OS
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2142 return pd_commit_memory(addr, size, exec);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2143 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2144
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2145 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2146 const char* mesg) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2147 assert(mesg != NULL, "mesg must be specified");
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2148 if (!pd_commit_memory(addr, size, exec)) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2149 // add extra info in product mode for vm_exit_out_of_memory():
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2150 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2151 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2152 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2153 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2154
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2155 void os::pd_commit_memory_or_exit(char* addr, size_t size,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2156 size_t alignment_hint, bool exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2157 const char* mesg) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2158 // alignment_hint is ignored on this OS
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2159 pd_commit_memory_or_exit(addr, size, exec, mesg);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2160 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2161
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2162 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2163 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2164
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2165 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2166 ::madvise(addr, bytes, MADV_DONTNEED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2167 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2168
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2169 void os::numa_make_global(char *addr, size_t bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2170 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2171
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2172 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2173 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2174
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2175 bool os::numa_topology_changed() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2176
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2177 size_t os::numa_get_groups_num() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2178 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2179 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2180
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2181 int os::numa_get_group_id() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2182 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2183 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2184
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2185 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2186 if (size > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2187 ids[0] = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2188 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2189 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2190 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2191 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2192
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2193 bool os::get_page_info(char *start, page_info* info) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2194 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2195 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2196
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2197 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2198 return end;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2199 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2200
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2201
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2202 bool os::pd_uncommit_memory(char* addr, size_t size) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2203 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2204 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2205 return ::mprotect(addr, size, PROT_NONE) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2206 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2207 uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2208 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2209 return res != (uintptr_t) MAP_FAILED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2210 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2211 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2212
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2213 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2214 return os::commit_memory(addr, size, !ExecMem);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2215 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2216
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2217 // If this is a growable mapping, remove the guard pages entirely by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2218 // munmap()ping them. If not, just call uncommit_memory().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2219 bool os::remove_stack_guard_pages(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2220 return os::uncommit_memory(addr, size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2221 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2222
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2223 static address _highest_vm_reserved_address = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2224
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2225 // If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2226 // at 'requested_addr'. If there are existing memory mappings at the same
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2227 // location, however, they will be overwritten. If 'fixed' is false,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2228 // 'requested_addr' is only treated as a hint, the return value may or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2229 // may not start from the requested address. Unlike Bsd mmap(), this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2230 // function returns NULL to indicate failure.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2231 static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2232 char * addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2233 int flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2234
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2235 flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2236 if (fixed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2237 assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2238 flags |= MAP_FIXED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2239 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2240
10157
f32b6c267d2e 8012015: Use PROT_NONE when reserving memory
mikael
parents: 9062
diff changeset
2241 // Map reserved/uncommitted pages PROT_NONE so we fail early if we
f32b6c267d2e 8012015: Use PROT_NONE when reserving memory
mikael
parents: 9062
diff changeset
2242 // touch an uncommitted page. Otherwise, the read/write might
f32b6c267d2e 8012015: Use PROT_NONE when reserving memory
mikael
parents: 9062
diff changeset
2243 // succeed if we have enough swap space to back the physical page.
f32b6c267d2e 8012015: Use PROT_NONE when reserving memory
mikael
parents: 9062
diff changeset
2244 addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2245 flags, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2246
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2247 if (addr != MAP_FAILED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2248 // anon_mmap() should only get called during VM initialization,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2249 // don't need lock (actually we can skip locking even it can be called
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2250 // from multiple threads, because _highest_vm_reserved_address is just a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2251 // hint about the upper limit of non-stack memory regions.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2252 if ((address)addr + bytes > _highest_vm_reserved_address) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2253 _highest_vm_reserved_address = (address)addr + bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2254 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2255 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2256
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2257 return addr == MAP_FAILED ? NULL : addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2258 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2259
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2260 // Don't update _highest_vm_reserved_address, because there might be memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2261 // regions above addr + size. If so, releasing a memory region only creates
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2262 // a hole in the address space, it doesn't help prevent heap-stack collision.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2263 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2264 static int anon_munmap(char * addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2265 return ::munmap(addr, size) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2266 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2267
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2268 char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2269 size_t alignment_hint) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2270 return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2271 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2272
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2273 bool os::pd_release_memory(char* addr, size_t size) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2274 return anon_munmap(addr, size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2275 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2276
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2277 static bool bsd_mprotect(char* addr, size_t size, int prot) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2278 // Bsd wants the mprotect address argument to be page aligned.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2279 char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2280
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2281 // According to SUSv3, mprotect() should only be used with mappings
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2282 // established by mmap(), and mmap() always maps whole pages. Unaligned
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2283 // 'addr' likely indicates problem in the VM (e.g. trying to change
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2284 // protection of malloc'ed or statically allocated memory). Check the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2285 // caller if you hit this assert.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2286 assert(addr == bottom, "sanity check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2287
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2288 size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2289 return ::mprotect(bottom, size, prot) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2290 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2291
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2292 // Set protections specified
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2293 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2294 bool is_committed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2295 unsigned int p = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2296 switch (prot) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2297 case MEM_PROT_NONE: p = PROT_NONE; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2298 case MEM_PROT_READ: p = PROT_READ; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2299 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2300 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2301 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2302 ShouldNotReachHere();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2303 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2304 // is_committed is unused.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2305 return bsd_mprotect(addr, bytes, p);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2306 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2307
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2308 bool os::guard_memory(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2309 return bsd_mprotect(addr, size, PROT_NONE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2310 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2311
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2312 bool os::unguard_memory(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2313 return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2314 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2315
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2316 bool os::Bsd::hugetlbfs_sanity_check(bool warn, size_t page_size) {
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
2317 return false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2318 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2319
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2320 // Large page support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2321
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2322 static size_t _large_page_size = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2323
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2324 void os::large_page_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2325 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2326
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2327
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
2328 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
2329 fatal("This code is not used or maintained.");
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
2330
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2331 // "exec" is passed in but not used. Creating the shared image for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2332 // the code cache doesn't have an SHM_X executable permission to check.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2333 assert(UseLargePages && UseSHM, "only for SHM large pages");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2334
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2335 key_t key = IPC_PRIVATE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2336 char *addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2337
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2338 bool warn_on_failure = UseLargePages &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2339 (!FLAG_IS_DEFAULT(UseLargePages) ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2340 !FLAG_IS_DEFAULT(LargePageSizeInBytes)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2341 );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2342 char msg[128];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2343
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2344 // Create a large shared memory region to attach to based on size.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2345 // Currently, size is the total size of the heap
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2346 int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2347 if (shmid == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2348 // Possible reasons for shmget failure:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2349 // 1. shmmax is too small for Java heap.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2350 // > check shmmax value: cat /proc/sys/kernel/shmmax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2351 // > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2352 // 2. not enough large page memory.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2353 // > check available large pages: cat /proc/meminfo
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2354 // > increase amount of large pages:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2355 // echo new_value > /proc/sys/vm/nr_hugepages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2356 // Note 1: different Bsd may use different name for this property,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2357 // e.g. on Redhat AS-3 it is "hugetlb_pool".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2358 // Note 2: it's possible there's enough physical memory available but
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2359 // they are so fragmented after a long run that they can't
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2360 // coalesce into large pages. Try to reserve large pages when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2361 // the system is still "fresh".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2362 if (warn_on_failure) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2363 jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2364 warning(msg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2365 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2366 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2367 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2368
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2369 // attach to the region
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2370 addr = (char*)shmat(shmid, req_addr, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2371 int err = errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2372
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2373 // Remove shmid. If shmat() is successful, the actual shared memory segment
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2374 // will be deleted when it's detached by shmdt() or when the process
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2375 // terminates. If shmat() is not successful this will remove the shared
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2376 // segment immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2377 shmctl(shmid, IPC_RMID, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2378
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2379 if ((intptr_t)addr == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2380 if (warn_on_failure) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2381 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2382 warning(msg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2383 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2384 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2385 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2386
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2387 // The memory is committed
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2388 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2389
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2390 return addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2391 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2392
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2393 bool os::release_memory_special(char* base, size_t bytes) {
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2394 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2395 // detaching the SHM segment will also delete it, see reserve_memory_special()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2396 int rslt = shmdt(base);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2397 if (rslt == 0) {
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2398 tkr.record((address)base, bytes);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2399 return true;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2400 } else {
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2401 tkr.discard();
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2402 return false;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2403 }
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2404
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2405 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2406
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2407 size_t os::large_page_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2408 return _large_page_size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2409 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2410
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2411 // HugeTLBFS allows application to commit large page memory on demand;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2412 // with SysV SHM the entire memory region must be allocated as shared
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2413 // memory.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2414 bool os::can_commit_large_page_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2415 return UseHugeTLBFS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2416 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2417
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2418 bool os::can_execute_large_page_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2419 return UseHugeTLBFS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2420 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2421
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2422 // Reserve memory at an arbitrary address, only if that area is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2423 // available (and not reserved for something else).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2424
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2425 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2426 const int max_tries = 10;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2427 char* base[max_tries];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2428 size_t size[max_tries];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2429 const size_t gap = 0x000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2430
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2431 // Assert only that the size is a multiple of the page size, since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2432 // that's all that mmap requires, and since that's all we really know
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2433 // about at this low abstraction level. If we need higher alignment,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2434 // we can either pass an alignment to this method or verify alignment
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2435 // in one of the methods further up the call chain. See bug 5044738.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2436 assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2437
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2438 // Repeatedly allocate blocks until the block is allocated at the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2439 // right spot. Give up after max_tries. Note that reserve_memory() will
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2440 // automatically update _highest_vm_reserved_address if the call is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2441 // successful. The variable tracks the highest memory address every reserved
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2442 // by JVM. It is used to detect heap-stack collision if running with
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2443 // fixed-stack BsdThreads. Because here we may attempt to reserve more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2444 // space than needed, it could confuse the collision detecting code. To
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2445 // solve the problem, save current _highest_vm_reserved_address and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2446 // calculate the correct value before return.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2447 address old_highest = _highest_vm_reserved_address;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2448
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2449 // Bsd mmap allows caller to pass an address as hint; give it a try first,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2450 // if kernel honors the hint then we can return immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2451 char * addr = anon_mmap(requested_addr, bytes, false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2452 if (addr == requested_addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2453 return requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2454 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2455
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2456 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2457 // mmap() is successful but it fails to reserve at the requested address
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2458 anon_munmap(addr, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2459 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2460
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2461 int i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2462 for (i = 0; i < max_tries; ++i) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2463 base[i] = reserve_memory(bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2464
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2465 if (base[i] != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2466 // Is this the block we wanted?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2467 if (base[i] == requested_addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2468 size[i] = bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2469 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2470 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2471
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2472 // Does this overlap the block we wanted? Give back the overlapped
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2473 // parts and try again.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2474
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2475 size_t top_overlap = requested_addr + (bytes + gap) - base[i];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2476 if (top_overlap >= 0 && top_overlap < bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2477 unmap_memory(base[i], top_overlap);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2478 base[i] += top_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2479 size[i] = bytes - top_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2480 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2481 size_t bottom_overlap = base[i] + bytes - requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2482 if (bottom_overlap >= 0 && bottom_overlap < bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2483 unmap_memory(requested_addr, bottom_overlap);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2484 size[i] = bytes - bottom_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2485 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2486 size[i] = bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2487 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2488 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2489 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2490 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2491
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2492 // Give back the unused reserved pieces.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2493
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2494 for (int j = 0; j < i; ++j) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2495 if (base[j] != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2496 unmap_memory(base[j], size[j]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2497 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2498 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2499
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2500 if (i < max_tries) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2501 _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2502 return requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2503 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2504 _highest_vm_reserved_address = old_highest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2505 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2506 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2507 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2508
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2509 size_t os::read(int fd, void *buf, unsigned int nBytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2510 RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2511 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2512
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2513 // TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2514 // Solaris uses poll(), bsd uses park().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2515 // Poll() is likely a better choice, assuming that Thread.interrupt()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2516 // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2517 // SIGSEGV, see 4355769.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2518
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2519 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2520 assert(thread == Thread::current(), "thread consistency check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2521
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2522 ParkEvent * const slp = thread->_SleepEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2523 slp->reset() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2524 OrderAccess::fence() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2525
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2526 if (interruptible) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2527 jlong prevtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2528
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2529 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2530 if (os::is_interrupted(thread, true)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2531 return OS_INTRPT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2532 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2533
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2534 jlong newtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2535
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2536 if (newtime - prevtime < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2537 // time moving backwards, should only happen if no monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2538 // not a guarantee() because JVM should not abort on kernel/glibc bugs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2539 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2540 } else {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4082
diff changeset
2541 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2542 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2543
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2544 if(millis <= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2545 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2546 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2547
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2548 prevtime = newtime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2549
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2550 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2551 assert(thread->is_Java_thread(), "sanity check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2552 JavaThread *jt = (JavaThread *) thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2553 ThreadBlockInVM tbivm(jt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2554 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2555
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2556 jt->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2557 // cleared by handle_special_suspend_equivalent_condition() or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2558 // java_suspend_self() via check_and_wait_while_suspended()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2559
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2560 slp->park(millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2561
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2562 // were we externally suspended while we were waiting?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2563 jt->check_and_wait_while_suspended();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2564 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2565 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2566 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2567 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2568 jlong prevtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2569
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2570 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2571 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2572 // the 1st iteration ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2573 jlong newtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2574
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2575 if (newtime - prevtime < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2576 // time moving backwards, should only happen if no monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2577 // not a guarantee() because JVM should not abort on kernel/glibc bugs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2578 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2579 } else {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4082
diff changeset
2580 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2581 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2582
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2583 if(millis <= 0) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2584
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2585 prevtime = newtime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2586 slp->park(millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2587 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2588 return OS_OK ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2589 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2590 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2591
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2592 int os::naked_sleep() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2593 // %% make the sleep time an integer flag. for now use 1 millisec.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2594 return os::sleep(Thread::current(), 1, false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2595 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2596
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2597 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2598 void os::infinite_sleep() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2599 while (true) { // sleep forever ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2600 ::sleep(100); // ... 100 seconds at a time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2601 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2602 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2603
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2604 // Used to convert frequent JVM_Yield() to nops
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2605 bool os::dont_yield() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2606 return DontYieldALot;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2607 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2608
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2609 void os::yield() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2610 sched_yield();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2611 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2612
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2613 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2614
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2615 void os::yield_all(int attempts) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2616 // Yields to all threads, including threads with lower priorities
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2617 // Threads on Bsd are all with same priority. The Solaris style
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2618 // os::yield_all() with nanosleep(1ms) is not necessary.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2619 sched_yield();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2620 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2621
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2622 // Called from the tight loops to possibly influence time-sharing heuristics
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2623 void os::loop_breaker(int attempts) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2624 os::yield_all(attempts);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2625 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2626
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2627 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2628 // thread priority support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2629
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2630 // Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2631 // only supports dynamic priority, static priority must be zero. For real-time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2632 // applications, Bsd supports SCHED_RR which allows static priority (1-99).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2633 // However, for large multi-threaded applications, SCHED_RR is not only slower
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2634 // than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2635 // of 5 runs - Sep 2005).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2636 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2637 // The following code actually changes the niceness of kernel-thread/LWP. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2638 // has an assumption that setpriority() only modifies one kernel-thread/LWP,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2639 // not the entire user process, and user level threads are 1:1 mapped to kernel
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2640 // threads. It has always been the case, but could change in the future. For
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2641 // this reason, the code should not be used as default (ThreadPriorityPolicy=0).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2642 // It is only used when ThreadPriorityPolicy=1 and requires root privilege.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2643
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
2644 #if !defined(__APPLE__)
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2645 int os::java_to_os_priority[CriticalPriority + 1] = {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2646 19, // 0 Entry should never be used
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2647
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2648 0, // 1 MinPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2649 3, // 2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2650 6, // 3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2651
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2652 10, // 4
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2653 15, // 5 NormPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2654 18, // 6
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2655
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2656 21, // 7
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2657 25, // 8
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2658 28, // 9 NearMaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2659
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2660 31, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2661
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2662 31 // 11 CriticalPriority
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2663 };
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
2664 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2665 /* Using Mach high-level priority assignments */
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2666 int os::java_to_os_priority[CriticalPriority + 1] = {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2667 0, // 0 Entry should never be used (MINPRI_USER)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2668
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2669 27, // 1 MinPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2670 28, // 2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2671 29, // 3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2672
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2673 30, // 4
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2674 31, // 5 NormPriority (BASEPRI_DEFAULT)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2675 32, // 6
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2676
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2677 33, // 7
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2678 34, // 8
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2679 35, // 9 NearMaxPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2680
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2681 36, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2682
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2683 36 // 11 CriticalPriority
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2684 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2685 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2686
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2687 static int prio_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2688 if (ThreadPriorityPolicy == 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2689 // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2690 // if effective uid is not root. Perhaps, a more elegant way of doing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2691 // this is to test CAP_SYS_NICE capability, but that will require libcap.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2692 if (geteuid() != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2693 if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2694 warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2695 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2696 ThreadPriorityPolicy = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2697 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2698 }
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2699 if (UseCriticalJavaThreadPriority) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2700 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2701 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2702 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2703 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2704
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2705 OSReturn os::set_native_priority(Thread* thread, int newpri) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2706 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2707
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2708 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2709 // OpenBSD pthread_setprio starves low priority threads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2710 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2711 #elif defined(__FreeBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2712 int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2713 #elif defined(__APPLE__) || defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2714 struct sched_param sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2715 int policy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2716 pthread_t self = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2717
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2718 if (pthread_getschedparam(self, &policy, &sp) != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2719 return OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2720
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2721 sp.sched_priority = newpri;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2722 if (pthread_setschedparam(self, policy, &sp) != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2723 return OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2724
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2725 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2726 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2727 int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2728 return (ret == 0) ? OS_OK : OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2729 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2730 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2731
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2732 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2733 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2734 *priority_ptr = java_to_os_priority[NormPriority];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2735 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2736 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2737
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2738 errno = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2739 #if defined(__OpenBSD__) || defined(__FreeBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2740 *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2741 #elif defined(__APPLE__) || defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2742 int policy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2743 struct sched_param sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2744
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2745 pthread_getschedparam(pthread_self(), &policy, &sp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2746 *priority_ptr = sp.sched_priority;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2747 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2748 *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2749 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2750 return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2751 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2752
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2753 // Hint to the underlying OS that a task switch would not be good.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2754 // Void return because it's a hint and can fail.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2755 void os::hint_no_preempt() {}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2756
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2757 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2758 // suspend/resume support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2759
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2760 // the low-level signal-based suspend/resume support is a remnant from the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2761 // old VM-suspension that used to be for java-suspension, safepoints etc,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2762 // within hotspot. Now there is a single use-case for this:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2763 // - calling get_thread_pc() on the VMThread by the flat-profiler task
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2764 // that runs in the watcher thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2765 // The remaining code is greatly simplified from the more general suspension
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2766 // code that used to be used.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2767 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2768 // The protocol is quite simple:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2769 // - suspend:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2770 // - sends a signal to the target thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2771 // - polls the suspend state of the osthread using a yield loop
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2772 // - target thread signal handler (SR_handler) sets suspend state
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2773 // and blocks in sigsuspend until continued
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2774 // - resume:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2775 // - sets target osthread state to continue
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2776 // - sends signal to end the sigsuspend loop in the SR_handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2777 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2778 // Note that the SR_lock plays no role in this suspend/resume protocol.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2779 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2780
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2781 static void resume_clear_context(OSThread *osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2782 osthread->set_ucontext(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2783 osthread->set_siginfo(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2784 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2785
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2786 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2787 osthread->set_ucontext(context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2788 osthread->set_siginfo(siginfo);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2789 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2790
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2791 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2792 // Handler function invoked when a thread's execution is suspended or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2793 // resumed. We have to be careful that only async-safe functions are
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2794 // called here (Note: most pthread functions are not async safe and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2795 // should be avoided.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2796 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2797 // Note: sigwait() is a more natural fit than sigsuspend() from an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2798 // interface point of view, but sigwait() prevents the signal hander
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2799 // from being run. libpthread would get very confused by not having
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2800 // its signal handlers run and prevents sigwait()'s use with the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2801 // mutex granting granting signal.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2802 //
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2803 // Currently only ever called on the VMThread or JavaThread
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2804 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2805 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2806 // Save and restore errno to avoid confusing native code with EINTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2807 // after sigsuspend.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2808 int old_errno = errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2809
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2810 Thread* thread = Thread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2811 OSThread* osthread = thread->osthread();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2812 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2813
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2814 os::SuspendResume::State current = osthread->sr.state();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2815 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2816 suspend_save_context(osthread, siginfo, context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2817
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2818 // attempt to switch the state, we assume we had a SUSPEND_REQUEST
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2819 os::SuspendResume::State state = osthread->sr.suspended();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2820 if (state == os::SuspendResume::SR_SUSPENDED) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2821 sigset_t suspend_set; // signals for sigsuspend()
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2822
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2823 // get current set of blocked signals and unblock resume signal
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2824 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2825 sigdelset(&suspend_set, SR_signum);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2826
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2827 sr_semaphore.signal();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2828 // wait here until we are resumed
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2829 while (1) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2830 sigsuspend(&suspend_set);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2831
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2832 os::SuspendResume::State result = osthread->sr.running();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2833 if (result == os::SuspendResume::SR_RUNNING) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2834 sr_semaphore.signal();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2835 break;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2836 } else if (result != os::SuspendResume::SR_SUSPENDED) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2837 ShouldNotReachHere();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2838 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2839 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2840
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2841 } else if (state == os::SuspendResume::SR_RUNNING) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2842 // request was cancelled, continue
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2843 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2844 ShouldNotReachHere();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2845 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2846
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2847 resume_clear_context(osthread);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2848 } else if (current == os::SuspendResume::SR_RUNNING) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2849 // request was cancelled, continue
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2850 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2851 // ignore
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2852 } else {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2853 // ignore
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2854 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2855
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2856 errno = old_errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2857 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2858
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2859
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2860 static int SR_initialize() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2861 struct sigaction act;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2862 char *s;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2863 /* Get signal number to use for suspend/resume */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2864 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2865 int sig = ::strtol(s, 0, 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2866 if (sig > 0 || sig < NSIG) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2867 SR_signum = sig;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2868 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2869 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2870
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2871 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2872 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2873
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2874 sigemptyset(&SR_sigset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2875 sigaddset(&SR_sigset, SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2876
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2877 /* Set up signal handler for suspend/resume */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2878 act.sa_flags = SA_RESTART|SA_SIGINFO;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2879 act.sa_handler = (void (*)(int)) SR_handler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2880
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2881 // SR_signum is blocked by default.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2882 // 4528190 - We also need to block pthread restart signal (32 on all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2883 // supported Bsd platforms). Note that BsdThreads need to block
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2884 // this signal for all threads to work properly. So we don't have
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2885 // to use hard-coded signal number when setting up the mask.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2886 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2887
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2888 if (sigaction(SR_signum, &act, 0) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2889 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2890 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2891
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2892 // Save signal flag
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2893 os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2894 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2895 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2896
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2897 static int sr_notify(OSThread* osthread) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2898 int status = pthread_kill(osthread->pthread_id(), SR_signum);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2899 assert_status(status == 0, status, "pthread_kill");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2900 return status;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2901 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2902
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2903 // "Randomly" selected value for how long we want to spin
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2904 // before bailing out on suspending a thread, also how often
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2905 // we send a signal to a thread we want to resume
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2906 static const int RANDOMLY_LARGE_INTEGER = 1000000;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2907 static const int RANDOMLY_LARGE_INTEGER2 = 100;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2908
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2909 // returns true on success and false on error - really an error is fatal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2910 // but this seems the normal response to library errors
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2911 static bool do_suspend(OSThread* osthread) {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2912 assert(osthread->sr.is_running(), "thread should be running");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2913 assert(!sr_semaphore.trywait(), "semaphore has invalid state");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2914
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2915 // mark as suspended and send signal
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2916 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2917 // failed to switch, state wasn't running?
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2918 ShouldNotReachHere();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2919 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2920 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2921
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2922 if (sr_notify(osthread) != 0) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2923 ShouldNotReachHere();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2924 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2925
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2926 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2927 while (true) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2928 if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2929 break;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2930 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2931 // timeout
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2932 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2933 if (cancelled == os::SuspendResume::SR_RUNNING) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2934 return false;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2935 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2936 // make sure that we consume the signal on the semaphore as well
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2937 sr_semaphore.wait();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2938 break;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2939 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2940 ShouldNotReachHere();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2941 return false;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2942 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2943 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2944 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2945
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2946 guarantee(osthread->sr.is_suspended(), "Must be suspended");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2947 return true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2948 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2949
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2950 static void do_resume(OSThread* osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2951 assert(osthread->sr.is_suspended(), "thread should be suspended");
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2952 assert(!sr_semaphore.trywait(), "invalid semaphore state");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2953
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2954 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2955 // failed to switch to WAKEUP_REQUEST
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2956 ShouldNotReachHere();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2957 return;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2958 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2959
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2960 while (true) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2961 if (sr_notify(osthread) == 0) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2962 if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2963 if (osthread->sr.is_running()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2964 return;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2965 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2966 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2967 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2968 ShouldNotReachHere();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2969 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2970 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2971
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
2972 guarantee(osthread->sr.is_running(), "Must be running!");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2973 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2974
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2975 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2976 // interrupt support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2977
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2978 void os::interrupt(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2979 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2980 "possibility of dangling Thread pointer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2981
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2982 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2983
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2984 if (!osthread->interrupted()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2985 osthread->set_interrupted(true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2986 // More than one thread can get here with the same value of osthread,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2987 // resulting in multiple notifications. We do, however, want the store
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2988 // to interrupted() to be visible to other threads before we execute unpark().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2989 OrderAccess::fence();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2990 ParkEvent * const slp = thread->_SleepEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2991 if (slp != NULL) slp->unpark() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2992 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2993
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2994 // For JSR166. Unpark even if interrupt status already was set
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2995 if (thread->is_Java_thread())
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2996 ((JavaThread*)thread)->parker()->unpark();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2997
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2998 ParkEvent * ev = thread->_ParkEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2999 if (ev != NULL) ev->unpark() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3001 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3002
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3003 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3004 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3005 "possibility of dangling Thread pointer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3006
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3007 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3008
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3009 bool interrupted = osthread->interrupted();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3010
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3011 if (interrupted && clear_interrupted) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3012 osthread->set_interrupted(false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3013 // consider thread->_SleepEvent->reset() ... optional optimization
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3014 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3015
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3016 return interrupted;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3017 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3018
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3019 ///////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3020 // signal handling (except suspend/resume)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3021
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3022 // This routine may be used by user applications as a "hook" to catch signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3023 // The user-defined signal handler must pass unrecognized signals to this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3024 // routine, and if it returns true (non-zero), then the signal handler must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3025 // return immediately. If the flag "abort_if_unrecognized" is true, then this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3026 // routine will never retun false (zero), but instead will execute a VM panic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3027 // routine kill the process.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3028 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3029 // If this routine returns false, it is OK to call it again. This allows
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3030 // the user-defined signal handler to perform checks either before or after
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3031 // the VM performs its own checks. Naturally, the user code would be making
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3032 // a serious error if it tried to handle an exception (such as a null check
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3033 // or breakpoint) that the VM was generating for its own correct operation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3034 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3035 // This routine may recognize any of the following kinds of signals:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3036 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3037 // It should be consulted by handlers for any of those signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3038 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3039 // The caller of this routine must pass in the three arguments supplied
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3040 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3041 // field of the structure passed to sigaction(). This routine assumes that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3042 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3043 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3044 // Note that the VM will print warnings if it detects conflicting signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3045 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3046 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3047 extern "C" JNIEXPORT int
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3048 JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3049 void* ucontext, int abort_if_unrecognized);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3050
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3051 void signalHandler(int sig, siginfo_t* info, void* uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3052 assert(info != NULL && uc != NULL, "it must be old kernel");
8067
5cd2fac2ae70 6749267: Signal handler should save/restore errno
hseigel
parents: 8023
diff changeset
3053 int orig_errno = errno; // Preserve errno value over signal handler.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3054 JVM_handle_bsd_signal(sig, info, uc, true);
8067
5cd2fac2ae70 6749267: Signal handler should save/restore errno
hseigel
parents: 8023
diff changeset
3055 errno = orig_errno;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3056 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3057
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3058
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3059 // This boolean allows users to forward their own non-matching signals
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3060 // to JVM_handle_bsd_signal, harmlessly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3061 bool os::Bsd::signal_handlers_are_installed = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3062
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3063 // For signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3064 struct sigaction os::Bsd::sigact[MAXSIGNUM];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3065 unsigned int os::Bsd::sigs = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3066 bool os::Bsd::libjsig_is_loaded = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3067 typedef struct sigaction *(*get_signal_t)(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3068 get_signal_t os::Bsd::get_signal_action = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3069
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3070 struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3071 struct sigaction *actp = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3072
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3073 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3074 // Retrieve the old signal handler from libjsig
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3075 actp = (*get_signal_action)(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3076 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3077 if (actp == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3078 // Retrieve the preinstalled signal handler from jvm
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3079 actp = get_preinstalled_handler(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3080 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3081
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3082 return actp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3083 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3084
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3085 static bool call_chained_handler(struct sigaction *actp, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3086 siginfo_t *siginfo, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3087 // Call the old signal handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3088 if (actp->sa_handler == SIG_DFL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3089 // It's more reasonable to let jvm treat it as an unexpected exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3090 // instead of taking the default action.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3091 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3092 } else if (actp->sa_handler != SIG_IGN) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3093 if ((actp->sa_flags & SA_NODEFER) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3094 // automaticlly block the signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3095 sigaddset(&(actp->sa_mask), sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3096 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3097
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3098 sa_handler_t hand;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3099 sa_sigaction_t sa;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3100 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3101 // retrieve the chained handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3102 if (siginfo_flag_set) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3103 sa = actp->sa_sigaction;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3104 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3105 hand = actp->sa_handler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3106 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3107
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3108 if ((actp->sa_flags & SA_RESETHAND) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3109 actp->sa_handler = SIG_DFL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3110 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3111
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3112 // try to honor the signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3113 sigset_t oset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3114 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3115
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3116 // call into the chained handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3117 if (siginfo_flag_set) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3118 (*sa)(sig, siginfo, context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3119 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3120 (*hand)(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3121 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3122
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3123 // restore the signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3124 pthread_sigmask(SIG_SETMASK, &oset, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3125 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3126 // Tell jvm's signal handler the signal is taken care of.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3127 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3128 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3129
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3130 bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3131 bool chained = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3132 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3133 if (UseSignalChaining) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3134 struct sigaction *actp = get_chained_signal_action(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3135 if (actp != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3136 chained = call_chained_handler(actp, sig, siginfo, context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3137 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3138 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3139 return chained;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3140 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3141
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3142 struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3143 if ((( (unsigned int)1 << sig ) & sigs) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3144 return &sigact[sig];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3145 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3146 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3147 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3148
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3149 void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3150 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3151 sigact[sig] = oldAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3152 sigs |= (unsigned int)1 << sig;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3153 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3154
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3155 // for diagnostic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3156 int os::Bsd::sigflags[MAXSIGNUM];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3157
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3158 int os::Bsd::get_our_sigflags(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3159 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3160 return sigflags[sig];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3161 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3162
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3163 void os::Bsd::set_our_sigflags(int sig, int flags) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3164 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3165 sigflags[sig] = flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3166 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3167
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3168 void os::Bsd::set_signal_handler(int sig, bool set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3169 // Check for overwrite.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3170 struct sigaction oldAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3171 sigaction(sig, (struct sigaction*)NULL, &oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3172
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3173 void* oldhand = oldAct.sa_sigaction
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3174 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3175 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3176 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3177 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3178 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3179 if (AllowUserSignalHandlers || !set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3180 // Do not overwrite; user takes responsibility to forward to us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3181 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3182 } else if (UseSignalChaining) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3183 // save the old handler in jvm
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3184 save_preinstalled_handler(sig, oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3185 // libjsig also interposes the sigaction() call below and saves the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3186 // old sigaction on it own.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3187 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3188 fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3189 "%#lx for signal %d.", (long)oldhand, sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3190 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3191 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3192
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3193 struct sigaction sigAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3194 sigfillset(&(sigAct.sa_mask));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3195 sigAct.sa_handler = SIG_DFL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3196 if (!set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3197 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3198 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3199 sigAct.sa_sigaction = signalHandler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3200 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3201 }
10386
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3202 #if __APPLE__
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3203 // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3204 // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages"
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3205 // if the signal handler declares it will handle it on alternate stack.
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3206 // Notice we only declare we will handle it on alt stack, but we are not
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3207 // actually going to use real alt stack - this is just a workaround.
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3208 // Please see ux_exception.c, method catch_mach_exception_raise for details
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3209 // link http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/bsd/uxkern/ux_exception.c
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3210 if (sig == SIGSEGV) {
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3211 sigAct.sa_flags |= SA_ONSTACK;
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3212 }
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3213 #endif
6bf8b8bb7c19 8009302: Mac OS X: JVM crash on infinite recursion on Appkit Thread
hseigel
parents: 10208
diff changeset
3214
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3215 // Save flags, which are set by ours
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3216 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3217 sigflags[sig] = sigAct.sa_flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3218
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3219 int ret = sigaction(sig, &sigAct, &oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3220 assert(ret == 0, "check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3221
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3222 void* oldhand2 = oldAct.sa_sigaction
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3223 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3224 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3225 assert(oldhand2 == oldhand, "no concurrent signal handler installation");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3226 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3227
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3228 // install signal handlers for signals that HotSpot needs to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3229 // handle in order to support Java-level exception handling.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3230
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3231 void os::Bsd::install_signal_handlers() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3232 if (!signal_handlers_are_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3233 signal_handlers_are_installed = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3234
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3235 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3236 typedef void (*signal_setting_t)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3237 signal_setting_t begin_signal_setting = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3238 signal_setting_t end_signal_setting = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3239 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3240 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3241 if (begin_signal_setting != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3242 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3243 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3244 get_signal_action = CAST_TO_FN_PTR(get_signal_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3245 dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3246 libjsig_is_loaded = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3247 assert(UseSignalChaining, "should enable signal-chaining");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3248 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3249 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3250 // Tell libjsig jvm is setting signal handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3251 (*begin_signal_setting)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3252 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3253
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3254 set_signal_handler(SIGSEGV, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3255 set_signal_handler(SIGPIPE, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3256 set_signal_handler(SIGBUS, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3257 set_signal_handler(SIGILL, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3258 set_signal_handler(SIGFPE, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3259 set_signal_handler(SIGXFSZ, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3260
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3261 #if defined(__APPLE__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3262 // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3263 // signals caught and handled by the JVM. To work around this, we reset the mach task
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3264 // signal handler that's placed on our process by CrashReporter. This disables
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3265 // CrashReporter-based reporting.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3266 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3267 // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3268 // on caught fatal signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3269 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3270 // Additionally, gdb installs both standard BSD signal handlers, and mach exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3271 // handlers. By replacing the existing task exception handler, we disable gdb's mach
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3272 // exception handling, while leaving the standard BSD signal handlers functional.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3273 kern_return_t kr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3274 kr = task_set_exception_ports(mach_task_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3275 EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3276 MACH_PORT_NULL,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3277 EXCEPTION_STATE_IDENTITY,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3278 MACHINE_THREAD_STATE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3279
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3280 assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3281 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3282
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3283 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3284 // Tell libjsig jvm finishes setting signal handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3285 (*end_signal_setting)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3286 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3287
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3288 // We don't activate signal checker if libjsig is in place, we trust ourselves
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3289 // and if UserSignalHandler is installed all bets are off
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3290 if (CheckJNICalls) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3291 if (libjsig_is_loaded) {
12096
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3292 if (PrintJNIResolving) {
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3293 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3294 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3295 check_signals = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3296 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3297 if (AllowUserSignalHandlers) {
12096
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3298 if (PrintJNIResolving) {
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3299 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
3a57fa7a4cd0 7121403: [TESTBUG] runtime/7051189/Xchecksig.sh fails on 64bit solaris
hseigel
parents: 12095
diff changeset
3300 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3301 check_signals = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3302 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3303 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3304 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3305 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3306
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3307
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3308 /////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3309 // glibc on Bsd platform uses non-documented flag
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3310 // to indicate, that some special sort of signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3311 // trampoline is used.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3312 // We will never set this flag, and we should
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3313 // ignore this flag in our diagnostic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3314 #ifdef SIGNIFICANT_SIGNAL_MASK
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3315 #undef SIGNIFICANT_SIGNAL_MASK
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3316 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3317 #define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3318
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3319 static const char* get_signal_handler_name(address handler,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3320 char* buf, int buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3321 int offset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3322 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3323 if (found) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3324 // skip directory names
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3325 const char *p1, *p2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3326 p1 = buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3327 size_t len = strlen(os::file_separator());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3328 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3329 jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3330 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3331 jio_snprintf(buf, buflen, PTR_FORMAT, handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3332 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3333 return buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3334 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3335
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3336 static void print_signal_handler(outputStream* st, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3337 char* buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3338 struct sigaction sa;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3339
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3340 sigaction(sig, NULL, &sa);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3341
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3342 // See comment for SIGNIFICANT_SIGNAL_MASK define
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3343 sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3344
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3345 st->print("%s: ", os::exception_name(sig, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3346
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3347 address handler = (sa.sa_flags & SA_SIGINFO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3348 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3349 : CAST_FROM_FN_PTR(address, sa.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3350
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3351 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3352 st->print("SIG_DFL");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3353 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3354 st->print("SIG_IGN");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3355 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3356 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3357 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3358
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3359 st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3360
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3361 address rh = VMError::get_resetted_sighandler(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3362 // May be, handler was resetted by VMError?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3363 if(rh != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3364 handler = rh;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3365 sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3366 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3367
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3368 st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3369
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3370 // Check: is it our handler?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3371 if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3372 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3373 // It is our signal handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3374 // check for flags, reset system-used one!
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3375 if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3376 st->print(
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3377 ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3378 os::Bsd::get_our_sigflags(sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3379 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3380 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3381 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3382 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3383
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3384
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3385 #define DO_SIGNAL_CHECK(sig) \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3386 if (!sigismember(&check_signal_done, sig)) \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3387 os::Bsd::check_signal_handler(sig)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3388
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3389 // This method is a periodic task to check for misbehaving JNI applications
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3390 // under CheckJNI, we can add any periodic checks here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3391
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3392 void os::run_periodic_checks() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3393
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3394 if (check_signals == false) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3395
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3396 // SEGV and BUS if overridden could potentially prevent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3397 // generation of hs*.log in the event of a crash, debugging
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3398 // such a case can be very challenging, so we absolutely
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3399 // check the following for a good measure:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3400 DO_SIGNAL_CHECK(SIGSEGV);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3401 DO_SIGNAL_CHECK(SIGILL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3402 DO_SIGNAL_CHECK(SIGFPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3403 DO_SIGNAL_CHECK(SIGBUS);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3404 DO_SIGNAL_CHECK(SIGPIPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3405 DO_SIGNAL_CHECK(SIGXFSZ);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3406
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3407
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3408 // ReduceSignalUsage allows the user to override these handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3409 // see comments at the very top and jvm_solaris.h
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3410 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3411 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3412 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3413 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3414 DO_SIGNAL_CHECK(BREAK_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3415 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3416
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3417 DO_SIGNAL_CHECK(SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3418 DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3419 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3420
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3421 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3422
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3423 static os_sigaction_t os_sigaction = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3424
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3425 void os::Bsd::check_signal_handler(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3426 char buf[O_BUFLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3427 address jvmHandler = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3428
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3429
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3430 struct sigaction act;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3431 if (os_sigaction == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3432 // only trust the default sigaction, in case it has been interposed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3433 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3434 if (os_sigaction == NULL) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3435 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3436
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3437 os_sigaction(sig, (struct sigaction*)NULL, &act);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3438
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3439
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3440 act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3441
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3442 address thisHandler = (act.sa_flags & SA_SIGINFO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3443 ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3444 : CAST_FROM_FN_PTR(address, act.sa_handler) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3445
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3446
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3447 switch(sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3448 case SIGSEGV:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3449 case SIGBUS:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3450 case SIGFPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3451 case SIGPIPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3452 case SIGILL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3453 case SIGXFSZ:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3454 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3455 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3456
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3457 case SHUTDOWN1_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3458 case SHUTDOWN2_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3459 case SHUTDOWN3_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3460 case BREAK_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3461 jvmHandler = (address)user_handler();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3462 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3463
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3464 case INTERRUPT_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3465 jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3466 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3467
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3468 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3469 if (sig == SR_signum) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3470 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3471 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3472 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3473 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3474 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3475 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3476
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3477 if (thisHandler != jvmHandler) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3478 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3479 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3480 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3481 // No need to check this sig any longer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3482 sigaddset(&check_signal_done, sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3483 } else if(os::Bsd::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Bsd::get_our_sigflags(sig)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3484 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3485 tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3486 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3487 // No need to check this sig any longer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3488 sigaddset(&check_signal_done, sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3489 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3490
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3491 // Dump all the signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3492 if (sigismember(&check_signal_done, sig)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3493 print_signal_handlers(tty, buf, O_BUFLEN);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3494 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3495 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3496
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3497 extern void report_error(char* file_name, int line_no, char* title, char* format, ...);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3498
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3499 extern bool signal_name(int signo, char* buf, size_t len);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3500
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3501 const char* os::exception_name(int exception_code, char* buf, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3502 if (0 < exception_code && exception_code <= SIGRTMAX) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3503 // signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3504 if (!signal_name(exception_code, buf, size)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3505 jio_snprintf(buf, size, "SIG%d", exception_code);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3506 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3507 return buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3508 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3509 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3510 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3511 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3512
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3513 // this is called _before_ the most of global arguments have been parsed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3514 void os::init(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3515 char dummy; /* used to get a guess on initial stack address */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3516 // first_hrtime = gethrtime();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3517
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3518 // With BsdThreads the JavaMain thread pid (primordial thread)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3519 // is different than the pid of the java launcher thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3520 // So, on Bsd, the launcher thread pid is passed to the VM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3521 // via the sun.java.launcher.pid property.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3522 // Use this property instead of getpid() if it was correctly passed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3523 // See bug 6351349.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3524 pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3525
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3526 _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3527
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3528 clock_tics_per_sec = CLK_TCK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3529
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3530 init_random(1234567);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3531
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3532 ThreadCritical::initialize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3533
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3534 Bsd::set_page_size(getpagesize());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3535 if (Bsd::page_size() == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3536 fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3537 strerror(errno)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3538 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3539 init_page_sizes((size_t) Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3540
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3541 Bsd::initialize_system_info();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3542
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3543 // main_thread points to the aboriginal thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3544 Bsd::_main_thread = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3545
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3546 Bsd::clock_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3547 initial_time_count = os::elapsed_counter();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3548
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3549 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3550 // XXXDARWIN
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3551 // Work around the unaligned VM callbacks in hotspot's
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3552 // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3553 // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3554 // alignment when doing symbol lookup. To work around this, we force early
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3555 // binding of all symbols now, thus binding when alignment is known-good.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3556 _dyld_bind_fully_image_containing_address((const void *) &os::init);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3557 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3558 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3559
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3560 // To install functions for atexit system call
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3561 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3562 static void perfMemory_exit_helper() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3563 perfMemory_exit();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3564 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3565 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3566
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3567 // this is called _after_ the global arguments have been parsed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3568 jint os::init_2(void)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3569 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3570 // Allocate a single page and mark it as readable for safepoint polling
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3571 address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3572 guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3573
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3574 os::set_polling_page( polling_page );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3575
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3576 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3577 if(Verbose && PrintMiscellaneous)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3578 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3579 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3580
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3581 if (!UseMembar) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3582 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3583 guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3584 os::set_memory_serialize_page( mem_serialize_page );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3585
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3586 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3587 if(Verbose && PrintMiscellaneous)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3588 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3589 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3590 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3591
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3592 // initialize suspend/resume support - must do this before signal_sets_init()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3593 if (SR_initialize() != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3594 perror("SR_initialize failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3595 return JNI_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3596 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3597
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3598 Bsd::signal_sets_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3599 Bsd::install_signal_handlers();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3600
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3601 // Check minimum allowable stack size for thread creation and to initialize
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3602 // the java system classes, including StackOverflowError - depends on page
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3603 // size. Add a page for compiler2 recursion in main thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3604 // Add in 2*BytesPerWord times page size to account for VM stack during
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3605 // class initialization depending on 32 or 64 bit VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3606 os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3607 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3608 2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3609
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3610 size_t threadStackSizeInBytes = ThreadStackSize * K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3611 if (threadStackSizeInBytes != 0 &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3612 threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3613 tty->print_cr("\nThe stack size specified is too small, "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3614 "Specify at least %dk",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3615 os::Bsd::min_stack_allowed/ K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3616 return JNI_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3617 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3618
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3619 // Make the stack size a multiple of the page size so that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3620 // the yellow/red zones can be guarded.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3621 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3622 vm_page_size()));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3623
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3624 if (MaxFDLimit) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3625 // set the number of file descriptors to max. print out error
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3626 // if getrlimit/setrlimit fails but continue regardless.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3627 struct rlimit nbr_files;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3628 int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3629 if (status != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3630 if (PrintMiscellaneous && (Verbose || WizardMode))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3631 perror("os::init_2 getrlimit failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3632 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3633 nbr_files.rlim_cur = nbr_files.rlim_max;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3634
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3635 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3636 // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3637 // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3638 // be used instead
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3639 nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3640 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3641
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3642 status = setrlimit(RLIMIT_NOFILE, &nbr_files);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3643 if (status != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3644 if (PrintMiscellaneous && (Verbose || WizardMode))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3645 perror("os::init_2 setrlimit failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3646 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3647 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3648 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3649
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3650 // at-exit methods are called in the reverse order of their registration.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3651 // atexit functions are called on return from main or as a result of a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3652 // call to exit(3C). There can be only 32 of these functions registered
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3653 // and atexit() does not set errno.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3654
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3655 if (PerfAllowAtExitRegistration) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3656 // only register atexit functions if PerfAllowAtExitRegistration is set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3657 // atexit functions can be delayed until process exit time, which
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3658 // can be problematic for embedded VM situations. Embedded VMs should
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3659 // call DestroyJavaVM() to assure that VM resources are released.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3660
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3661 // note: perfMemory_exit_helper atexit function may be removed in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3662 // the future if the appropriate cleanup code can be added to the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3663 // VM_Exit VMOperation's doit method.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3664 if (atexit(perfMemory_exit_helper) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3665 warning("os::init2 atexit(perfMemory_exit_helper) failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3666 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3667 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3668
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3669 // initialize thread priority policy
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3670 prio_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3671
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3672 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3673 // dynamically link to objective c gc registration
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3674 void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3675 if (handleLibObjc != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3676 objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3677 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3678 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3679
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3680 return JNI_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3681 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3682
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3683 // this is called at the end of vm_initialization
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3684 void os::init_3(void) { }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3685
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3686 // Mark the polling page as unreadable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3687 void os::make_polling_page_unreadable(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3688 if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3689 fatal("Could not disable polling page");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3690 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3691
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3692 // Mark the polling page as readable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3693 void os::make_polling_page_readable(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3694 if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3695 fatal("Could not enable polling page");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3696 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3697 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3698
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3699 int os::active_processor_count() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3700 return _processor_count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3701 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3702
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3703 void os::set_native_thread_name(const char *name) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3704 #if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3705 // This is only supported in Snow Leopard and beyond
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3706 if (name != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3707 // Add a "Java: " prefix to the name
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3708 char buf[MAXTHREADNAMESIZE];
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3709 snprintf(buf, sizeof(buf), "Java: %s", name);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3710 pthread_setname_np(buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3711 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3712 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3713 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3714
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3715 bool os::distribute_processes(uint length, uint* distribution) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3716 // Not yet implemented.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3717 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3718 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3719
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3720 bool os::bind_to_processor(uint processor_id) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3721 // Not yet implemented.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3722 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3723 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3724
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3725 void os::SuspendedThreadTask::internal_do_task() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3726 if (do_suspend(_thread->osthread())) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3727 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3728 do_task(context);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3729 do_resume(_thread->osthread());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3730 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3731 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3732
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3733 ///
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3734 class PcFetcher : public os::SuspendedThreadTask {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3735 public:
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3736 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3737 ExtendedPC result();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3738 protected:
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3739 void do_task(const os::SuspendedThreadTaskContext& context);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3740 private:
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3741 ExtendedPC _epc;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3742 };
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3743
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3744 ExtendedPC PcFetcher::result() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3745 guarantee(is_done(), "task is not done yet.");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3746 return _epc;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3747 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3748
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3749 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3750 Thread* thread = context.thread();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3751 OSThread* osthread = thread->osthread();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3752 if (osthread->ucontext() != NULL) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3753 _epc = os::Bsd::ucontext_get_pc((ucontext_t *) context.ucontext());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3754 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3755 // NULL context is unexpected, double-check this is the VMThread
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3756 guarantee(thread->is_VM_thread(), "can only be called for VMThread");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3757 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3758 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3759
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3760 // Suspends the target using the signal mechanism and then grabs the PC before
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3761 // resuming the target. Used by the flat-profiler only
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3762 ExtendedPC os::get_thread_pc(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3763 // Make sure that it is called by the watcher for the VMThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3764 assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3765 assert(thread->is_VM_thread(), "Can only be called for VMThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3766
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3767 PcFetcher fetcher(thread);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3768 fetcher.run();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
3769 return fetcher.result();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3770 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3771
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3772 int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3773 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3774 return pthread_cond_timedwait(_cond, _mutex, _abstime);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3775 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3776
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3777 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3778 // debug support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3779
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3780 bool os::find(address addr, outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3781 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3782 memset(&dlinfo, 0, sizeof(dlinfo));
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3783 if (dladdr(addr, &dlinfo) != 0) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3784 st->print(PTR_FORMAT ": ", addr);
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3785 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3786 st->print("%s+%#x", dlinfo.dli_sname,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3787 addr - (intptr_t)dlinfo.dli_saddr);
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3788 } else if (dlinfo.dli_fbase != NULL) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3789 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3790 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3791 st->print("<absolute address>");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3792 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3793 if (dlinfo.dli_fname != NULL) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3794 st->print(" in %s", dlinfo.dli_fname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3795 }
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3796 if (dlinfo.dli_fbase != NULL) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3797 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3798 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3799 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3800
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3801 if (Verbose) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3802 // decode some bytes around the PC
9060
cc32ccaaf47f 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 9059
diff changeset
3803 address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
cc32ccaaf47f 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 9059
diff changeset
3804 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3805 address lowest = (address) dlinfo.dli_sname;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3806 if (!lowest) lowest = (address) dlinfo.dli_fbase;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3807 if (begin < lowest) begin = lowest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3808 Dl_info dlinfo2;
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
3809 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3810 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3811 end = (address) dlinfo2.dli_saddr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3812 Disassembler::decode(begin, end, st);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3813 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3814 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3815 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3816 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3817 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3818
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3819 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3820 // misc
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3821
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3822 // This does not do anything on Bsd. This is basically a hook for being
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3823 // able to use structured exception handling (thread-local exception filters)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3824 // on, e.g., Win32.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3825 void
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3826 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3827 JavaCallArguments* args, Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3828 f(value, method, args, thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3829 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3830
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3831 void os::print_statistics() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3832 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3833
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3834 int os::message_box(const char* title, const char* message) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3835 int i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3836 fdStream err(defaultStream::error_fd());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3837 for (i = 0; i < 78; i++) err.print_raw("=");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3838 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3839 err.print_raw_cr(title);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3840 for (i = 0; i < 78; i++) err.print_raw("-");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3841 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3842 err.print_raw_cr(message);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3843 for (i = 0; i < 78; i++) err.print_raw("=");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3844 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3845
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3846 char buf[16];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3847 // Prevent process from exiting upon "read error" without consuming all CPU
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3848 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3849
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3850 return buf[0] == 'y' || buf[0] == 'Y';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3851 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3852
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3853 int os::stat(const char *path, struct stat *sbuf) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3854 char pathbuf[MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3855 if (strlen(path) > MAX_PATH - 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3856 errno = ENAMETOOLONG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3857 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3858 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3859 os::native_path(strcpy(pathbuf, path));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3860 return ::stat(pathbuf, sbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3861 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3862
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3863 bool os::check_heap(bool force) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3864 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3865 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3866
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3867 int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3868 return ::vsnprintf(buf, count, format, args);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3869 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3870
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3871 // Is a (classpath) directory empty?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3872 bool os::dir_is_empty(const char* path) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3873 DIR *dir = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3874 struct dirent *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3875
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3876 dir = opendir(path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3877 if (dir == NULL) return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3878
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3879 /* Scan the directory */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3880 bool result = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3881 char buf[sizeof(struct dirent) + MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3882 while (result && (ptr = ::readdir(dir)) != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3883 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3884 result = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3885 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3886 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3887 closedir(dir);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3888 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3889 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3890
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3891 // This code originates from JDK's sysOpen and open64_w
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3892 // from src/solaris/hpi/src/system_md.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3893
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3894 #ifndef O_DELETE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3895 #define O_DELETE 0x10000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3896 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3897
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3898 // Open a file. Unlink the file immediately after open returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3899 // if the specified oflag has the O_DELETE flag set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3900 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3901
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3902 int os::open(const char *path, int oflag, int mode) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3903
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3904 if (strlen(path) > MAX_PATH - 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3905 errno = ENAMETOOLONG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3906 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3907 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3908 int fd;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3909 int o_delete = (oflag & O_DELETE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3910 oflag = oflag & ~O_DELETE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3911
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3912 fd = ::open(path, oflag, mode);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3913 if (fd == -1) return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3914
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3915 //If the open succeeded, the file might still be a directory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3916 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3917 struct stat buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3918 int ret = ::fstat(fd, &buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3919 int st_mode = buf.st_mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3920
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3921 if (ret != -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3922 if ((st_mode & S_IFMT) == S_IFDIR) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3923 errno = EISDIR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3924 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3925 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3926 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3927 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3928 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3929 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3930 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3931 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3932
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3933 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3934 * All file descriptors that are opened in the JVM and not
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3935 * specifically destined for a subprocess should have the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3936 * close-on-exec flag set. If we don't set it, then careless 3rd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3937 * party native code might fork and exec without closing all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3938 * appropriate file descriptors (e.g. as we do in closeDescriptors in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3939 * UNIXProcess.c), and this in turn might:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3940 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3941 * - cause end-of-file to fail to be detected on some file
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3942 * descriptors, resulting in mysterious hangs, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3943 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3944 * - might cause an fopen in the subprocess to fail on a system
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3945 * suffering from bug 1085341.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3946 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3947 * (Yes, the default setting of the close-on-exec flag is a Unix
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3948 * design flaw)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3949 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3950 * See:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3951 * 1085341: 32-bit stdio routines should support file descriptors >255
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3952 * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3953 * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3954 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3955 #ifdef FD_CLOEXEC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3956 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3957 int flags = ::fcntl(fd, F_GETFD);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3958 if (flags != -1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3959 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3960 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3961 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3962
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3963 if (o_delete != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3964 ::unlink(path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3965 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3966 return fd;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3967 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3968
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3969
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3970 // create binary file, rewriting existing file if required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3971 int os::create_binary_file(const char* path, bool rewrite_existing) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3972 int oflags = O_WRONLY | O_CREAT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3973 if (!rewrite_existing) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3974 oflags |= O_EXCL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3975 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3976 return ::open(path, oflags, S_IREAD | S_IWRITE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3977 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3978
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3979 // return current position of file pointer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3980 jlong os::current_file_offset(int fd) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3981 return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3982 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3983
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3984 // move file pointer to the specified offset
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3985 jlong os::seek_to_file_offset(int fd, jlong offset) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3986 return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3987 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3988
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3989 // This code originates from JDK's sysAvailable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3990 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3991
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3992 int os::available(int fd, jlong *bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3993 jlong cur, end;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3994 int mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3995 struct stat buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3996
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3997 if (::fstat(fd, &buf) >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3998 mode = buf.st_mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3999 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4000 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4001 * XXX: is the following call interruptible? If so, this might
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4002 * need to go through the INTERRUPT_IO() wrapper as for other
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4003 * blocking, interruptible calls in this file.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4004 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4005 int n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4006 if (::ioctl(fd, FIONREAD, &n) >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4007 *bytes = n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4008 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4009 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4010 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4011 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4012 if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4013 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4014 } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4015 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4016 } else if (::lseek(fd, cur, SEEK_SET) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4017 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4018 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4019 *bytes = end - cur;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4020 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4021 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4022
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4023 int os::socket_available(int fd, jint *pbytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4024 if (fd < 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4025 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4026
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4027 int ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4028
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4029 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4030
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4031 //%% note ioctl can return 0 when successful, JVM_SocketAvailable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4032 // is expected to return 0 on failure and 1 on success to the jdk.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4033
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4034 return (ret == OS_ERR) ? 0 : 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4035 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4036
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4037 // Map a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
4038 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4039 char *addr, size_t bytes, bool read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4040 bool allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4041 int prot;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4042 int flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4043
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4044 if (read_only) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4045 prot = PROT_READ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4046 flags = MAP_SHARED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4047 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4048 prot = PROT_READ | PROT_WRITE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4049 flags = MAP_PRIVATE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4050 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4051
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4052 if (allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4053 prot |= PROT_EXEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4054 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4055
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4056 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4057 flags |= MAP_FIXED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4058 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4059
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4060 char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4061 fd, file_offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4062 if (mapped_address == MAP_FAILED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4063 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4064 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4065 return mapped_address;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4066 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4067
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4068
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4069 // Remap a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
4070 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4071 char *addr, size_t bytes, bool read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4072 bool allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4073 // same as map_memory() on this OS
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4074 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4075 allow_exec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4076 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4077
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4078
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4079 // Unmap a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
4080 bool os::pd_unmap_memory(char* addr, size_t bytes) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4081 return munmap(addr, bytes) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4082 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4083
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4084 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4085 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4086 // of a thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4087 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4088 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4089 // the fast estimate available on the platform.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4090
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4091 jlong os::current_thread_cpu_time() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4092 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4093 return os::thread_cpu_time(Thread::current(), true /* user + sys */);
8689
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4094 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4095 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4096 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4097 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4098 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4099
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4100 jlong os::thread_cpu_time(Thread* thread) {
8689
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4101 #ifdef __APPLE__
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4102 return os::thread_cpu_time(thread, true /* user + sys */);
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4103 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4104 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4105 return 0;
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4106 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4107 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4108
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4109 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4110 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4111 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
8689
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4112 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4113 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4114 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4115 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4116 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4118 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4119 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4120 struct thread_basic_info tinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4121 mach_msg_type_number_t tcount = THREAD_INFO_MAX;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4122 kern_return_t kr;
4961
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
4123 thread_t mach_thread;
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
4124
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
4125 mach_thread = thread->osthread()->thread_id();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4126 kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4127 if (kr != KERN_SUCCESS)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4128 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4129
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4130 if (user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4131 jlong nanos;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4132 nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4133 nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4134 return nanos;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4135 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4136 return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4137 }
8689
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4138 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4139 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
4140 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4141 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4142 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4143
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4144
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4145 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4146 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4147 info_ptr->may_skip_backward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4148 info_ptr->may_skip_forward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4149 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4150 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4151
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4152 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4153 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4154 info_ptr->may_skip_backward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4155 info_ptr->may_skip_forward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4156 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4157 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4158
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4159 bool os::is_thread_cpu_time_supported() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4160 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4161 return true;
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
4162 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4163 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4164 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4165 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4166
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4167 // System loadavg support. Returns -1 if load average cannot be obtained.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4168 // Bsd doesn't yet have a (official) notion of processor sets,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4169 // so just return the system wide load average.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4170 int os::loadavg(double loadavg[], int nelem) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4171 return ::getloadavg(loadavg, nelem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4172 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4173
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4174 void os::pause() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4175 char filename[MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4176 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4177 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4178 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4179 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4180 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4181
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4182 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4183 if (fd != -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4184 struct stat buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4185 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4186 while (::stat(filename, &buf) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4187 (void)::poll(NULL, 0, 100);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4188 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4189 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4190 jio_fprintf(stderr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4191 "Could not open pause file '%s', continuing immediately.\n", filename);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4192 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4193 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4194
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4195
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4196 // Refer to the comments in os_solaris.cpp park-unpark.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4197 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4198 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4199 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4200 // For specifics regarding the bug see GLIBC BUGID 261237 :
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4201 // http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4202 // Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4203 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4204 // is used. (The simple C test-case provided in the GLIBC bug report manifests the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4205 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4206 // and monitorenter when we're using 1-0 locking. All those operations may result in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4207 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4208 // of libpthread avoids the problem, but isn't practical.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4209 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4210 // Possible remedies:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4211 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4212 // 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4213 // This is palliative and probabilistic, however. If the thread is preempted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4214 // between the call to compute_abstime() and pthread_cond_timedwait(), more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4215 // than the minimum period may have passed, and the abstime may be stale (in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4216 // past) resultin in a hang. Using this technique reduces the odds of a hang
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4217 // but the JVM is still vulnerable, particularly on heavily loaded systems.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4218 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4219 // 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4220 // of the usual flag-condvar-mutex idiom. The write side of the pipe is set
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4221 // NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4222 // reduces to poll()+read(). This works well, but consumes 2 FDs per extant
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4223 // thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4224 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4225 // 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4226 // that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4227 // a timeout request to the chron thread and then blocking via pthread_cond_wait().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4228 // This also works well. In fact it avoids kernel-level scalability impediments
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4229 // on certain platforms that don't handle lots of active pthread_cond_timedwait()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4230 // timers in a graceful fashion.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4231 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4232 // 4. When the abstime value is in the past it appears that control returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4233 // correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4234 // Subsequent timedwait/wait calls may hang indefinitely. Given that, we
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4235 // can avoid the problem by reinitializing the condvar -- by cond_destroy()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4236 // followed by cond_init() -- after all calls to pthread_cond_timedwait().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4237 // It may be possible to avoid reinitialization by checking the return
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4238 // value from pthread_cond_timedwait(). In addition to reinitializing the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4239 // condvar we must establish the invariant that cond_signal() is only called
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4240 // within critical sections protected by the adjunct mutex. This prevents
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4241 // cond_signal() from "seeing" a condvar that's in the midst of being
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4242 // reinitialized or that is corrupt. Sadly, this invariant obviates the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4243 // desirable signal-after-unlock optimization that avoids futile context switching.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4244 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4245 // I'm also concerned that some versions of NTPL might allocate an auxilliary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4246 // structure when a condvar is used or initialized. cond_destroy() would
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4247 // release the helper structure. Our reinitialize-after-timedwait fix
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4248 // put excessive stress on malloc/free and locks protecting the c-heap.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4249 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4250 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4251 // It may be possible to refine (4) by checking the kernel and NTPL verisons
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4252 // and only enabling the work-around for vulnerable environments.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4253
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4254 // utility to compute the abstime argument to timedwait:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4255 // millis is the relative timeout time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4256 // abstime will be the absolute timeout time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4257 // TODO: replace compute_abstime() with unpackTime()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4258
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4259 static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4260 if (millis < 0) millis = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4261 struct timeval now;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4262 int status = gettimeofday(&now, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4263 assert(status == 0, "gettimeofday");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4264 jlong seconds = millis / 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4265 millis %= 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4266 if (seconds > 50000000) { // see man cond_timedwait(3T)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4267 seconds = 50000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4268 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4269 abstime->tv_sec = now.tv_sec + seconds;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4270 long usec = now.tv_usec + millis * 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4271 if (usec >= 1000000) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4272 abstime->tv_sec += 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4273 usec -= 1000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4274 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4275 abstime->tv_nsec = usec * 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4276 return abstime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4277 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4278
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4279
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4280 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4281 // Conceptually TryPark() should be equivalent to park(0).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4282
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4283 int os::PlatformEvent::TryPark() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4284 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4285 const int v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4286 guarantee ((v == 0) || (v == 1), "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4287 if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4288 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4289 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4290
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4291 void os::PlatformEvent::park() { // AKA "down()"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4292 // Invariant: Only the thread associated with the Event/PlatformEvent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4293 // may call park().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4294 // TODO: assert that _Assoc != NULL or _Assoc == Self
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4295 int v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4296 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4297 v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4298 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4299 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4300 guarantee (v >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4301 if (v == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4302 // Do this the hard way by blocking ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4303 int status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4304 assert_status(status == 0, status, "mutex_lock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4305 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4306 ++ _nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4307 while (_Event < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4308 status = pthread_cond_wait(_cond, _mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4309 // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4310 // Treat this the same as if the wait was interrupted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4311 if (status == ETIMEDOUT) { status = EINTR; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4312 assert_status(status == 0 || status == EINTR, status, "cond_wait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4313 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4314 -- _nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4315
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4316 _Event = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4317 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4318 assert_status(status == 0, status, "mutex_unlock");
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4319 // Paranoia to ensure our locked and lock-free paths interact
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4320 // correctly with each other.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4321 OrderAccess::fence();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4322 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4323 guarantee (_Event >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4324 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4325
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4326 int os::PlatformEvent::park(jlong millis) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4327 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4328
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4329 int v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4330 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4331 v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4332 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4333 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4334 guarantee (v >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4335 if (v != 0) return OS_OK ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4336
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4337 // We do this the hard way, by blocking the thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4338 // Consider enforcing a minimum timeout value.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4339 struct timespec abst;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4340 compute_abstime(&abst, millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4341
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4342 int ret = OS_TIMEOUT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4343 int status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4344 assert_status(status == 0, status, "mutex_lock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4345 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4346 ++_nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4347
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4348 // Object.wait(timo) will return because of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4349 // (a) notification
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4350 // (b) timeout
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4351 // (c) thread.interrupt
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4352 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4353 // Thread.interrupt and object.notify{All} both call Event::set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4354 // That is, we treat thread.interrupt as a special case of notification.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4355 // The underlying Solaris implementation, cond_timedwait, admits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4356 // spurious/premature wakeups, but the JLS/JVM spec prevents the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4357 // JVM from making those visible to Java code. As such, we must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4358 // filter out spurious wakeups. We assume all ETIME returns are valid.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4359 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4360 // TODO: properly differentiate simultaneous notify+interrupt.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4361 // In that case, we should propagate the notify to another waiter.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4362
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4363 while (_Event < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4364 status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4365 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4366 pthread_cond_destroy (_cond);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4367 pthread_cond_init (_cond, NULL) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4368 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4369 assert_status(status == 0 || status == EINTR ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4370 status == ETIMEDOUT,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4371 status, "cond_timedwait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4372 if (!FilterSpuriousWakeups) break ; // previous semantics
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4373 if (status == ETIMEDOUT) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4374 // We consume and ignore EINTR and spurious wakeups.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4375 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4376 --_nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4377 if (_Event >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4378 ret = OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4379 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4380 _Event = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4381 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4382 assert_status(status == 0, status, "mutex_unlock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4383 assert (_nParked == 0, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4384 // Paranoia to ensure our locked and lock-free paths interact
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4385 // correctly with each other.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4386 OrderAccess::fence();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4387 return ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4388 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4389
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4390 void os::PlatformEvent::unpark() {
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4391 // Transitions for _Event:
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4392 // 0 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4393 // 1 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4394 // -1 :=> either 0 or 1; must signal target thread
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4395 // That is, we can safely transition _Event from -1 to either
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4396 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4397 // unpark() calls.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4398 // See also: "Semaphores in Plan 9" by Mullender & Cox
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4399 //
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4400 // Note: Forcing a transition from "-1" to "1" on an unpark() means
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4401 // that it will take two back-to-back park() calls for the owning
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4402 // thread to block. This has the benefit of forcing a spurious return
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4403 // from the first park() call after an unpark() call which will help
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4404 // shake out uses of park() and unpark() without condition variables.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4405
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4406 if (Atomic::xchg(1, &_Event) >= 0) return;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4407
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4408 // Wait for the thread associated with the event to vacate
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4409 int status = pthread_mutex_lock(_mutex);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4410 assert_status(status == 0, status, "mutex_lock");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4411 int AnyWaiters = _nParked;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4412 assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4413 if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4414 AnyWaiters = 0;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4415 pthread_cond_signal(_cond);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4416 }
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4417 status = pthread_mutex_unlock(_mutex);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4418 assert_status(status == 0, status, "mutex_unlock");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4419 if (AnyWaiters != 0) {
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4420 status = pthread_cond_signal(_cond);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4421 assert_status(status == 0, status, "cond_signal");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4422 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4423
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4424 // Note that we signal() _after dropping the lock for "immortal" Events.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4425 // This is safe and avoids a common class of futile wakeups. In rare
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4426 // circumstances this can cause a thread to return prematurely from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4427 // cond_{timed}wait() but the spurious wakeup is benign and the victim will
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4428 // simply re-test the condition and re-park itself.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4429 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4430
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4431
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4432 // JSR166
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4433 // -------------------------------------------------------
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4434
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4435 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4436 * The solaris and bsd implementations of park/unpark are fairly
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4437 * conservative for now, but can be improved. They currently use a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4438 * mutex/condvar pair, plus a a count.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4439 * Park decrements count if > 0, else does a condvar wait. Unpark
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4440 * sets count to 1 and signals condvar. Only one thread ever waits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4441 * on the condvar. Contention seen when trying to park implies that someone
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4442 * is unparking you, so don't wait. And spurious returns are fine, so there
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4443 * is no need to track notifications.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4444 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4445
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4446 #define MAX_SECS 100000000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4447 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4448 * This code is common to bsd and solaris and will be moved to a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4449 * common place in dolphin.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4450 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4451 * The passed in time value is either a relative time in nanoseconds
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4452 * or an absolute time in milliseconds. Either way it has to be unpacked
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4453 * into suitable seconds and nanoseconds components and stored in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4454 * given timespec structure.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4455 * Given time is a 64-bit value and the time_t used in the timespec is only
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4456 * a signed-32-bit value (except on 64-bit Bsd) we have to watch for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4457 * overflow if times way in the future are given. Further on Solaris versions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4458 * prior to 10 there is a restriction (see cond_timedwait) that the specified
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4459 * number of seconds, in abstime, is less than current_time + 100,000,000.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4460 * As it will be 28 years before "now + 100000000" will overflow we can
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4461 * ignore overflow and just impose a hard-limit on seconds using the value
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4462 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4463 * years from "now".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4464 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4465
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4466 static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4467 assert (time > 0, "convertTime");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4468
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4469 struct timeval now;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4470 int status = gettimeofday(&now, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4471 assert(status == 0, "gettimeofday");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4472
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4473 time_t max_secs = now.tv_sec + MAX_SECS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4474
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4475 if (isAbsolute) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4476 jlong secs = time / 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4477 if (secs > max_secs) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4478 absTime->tv_sec = max_secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4479 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4480 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4481 absTime->tv_sec = secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4482 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4483 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4484 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4485 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4486 jlong secs = time / NANOSECS_PER_SEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4487 if (secs >= MAX_SECS) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4488 absTime->tv_sec = max_secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4489 absTime->tv_nsec = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4490 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4491 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4492 absTime->tv_sec = now.tv_sec + secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4493 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4494 if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4495 absTime->tv_nsec -= NANOSECS_PER_SEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4496 ++absTime->tv_sec; // note: this must be <= max_secs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4497 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4498 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4499 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4500 assert(absTime->tv_sec >= 0, "tv_sec < 0");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4501 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4502 assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4503 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4504 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4505
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4506 void Parker::park(bool isAbsolute, jlong time) {
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4507 // Ideally we'd do something useful while spinning, such
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4508 // as calling unpackTime().
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4509
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4510 // Optional fast-path check:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4511 // Return immediately if a permit is available.
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4512 // We depend on Atomic::xchg() having full barrier semantics
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4513 // since we are doing a lock-free update to _counter.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4514 if (Atomic::xchg(0, &_counter) > 0) return;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4515
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4516 Thread* thread = Thread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4517 assert(thread->is_Java_thread(), "Must be JavaThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4518 JavaThread *jt = (JavaThread *)thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4519
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4520 // Optional optimization -- avoid state transitions if there's an interrupt pending.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4521 // Check interrupt before trying to wait
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4522 if (Thread::is_interrupted(thread, false)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4523 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4524 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4525
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4526 // Next, demultiplex/decode time arguments
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4527 struct timespec absTime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4528 if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4529 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4530 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4531 if (time > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4532 unpackTime(&absTime, isAbsolute, time);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4533 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4534
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4535
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4536 // Enter safepoint region
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4537 // Beware of deadlocks such as 6317397.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4538 // The per-thread Parker:: mutex is a classic leaf-lock.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4539 // In particular a thread must never block on the Threads_lock while
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4540 // holding the Parker:: mutex. If safepoints are pending both the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4541 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4542 ThreadBlockInVM tbivm(jt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4543
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4544 // Don't wait if cannot get lock since interference arises from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4545 // unblocking. Also. check interrupt before trying wait
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4546 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4547 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4548 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4549
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4550 int status ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4551 if (_counter > 0) { // no wait needed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4552 _counter = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4553 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4554 assert (status == 0, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4555 // Paranoia to ensure our locked and lock-free paths interact
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4556 // correctly with each other and Java-level accesses.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4557 OrderAccess::fence();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4558 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4559 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4560
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4561 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4562 // Don't catch signals while blocked; let the running threads have the signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4563 // (This allows a debugger to break into the running thread.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4564 sigset_t oldsigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4565 sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4566 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4567 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4568
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4569 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4570 jt->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4571 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4572
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4573 if (time == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4574 status = pthread_cond_wait (_cond, _mutex) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4575 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4576 status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4577 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4578 pthread_cond_destroy (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4579 pthread_cond_init (_cond, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4580 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4581 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4582 assert_status(status == 0 || status == EINTR ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4583 status == ETIMEDOUT,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4584 status, "cond_timedwait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4585
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4586 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4587 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4588 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4589
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4590 _counter = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4591 status = pthread_mutex_unlock(_mutex) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4592 assert_status(status == 0, status, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4593 // Paranoia to ensure our locked and lock-free paths interact
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4594 // correctly with each other and Java-level accesses.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4595 OrderAccess::fence();
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4596
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4597 // If externally suspended while waiting, re-suspend
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4598 if (jt->handle_special_suspend_equivalent_condition()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4599 jt->java_suspend_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4600 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4601 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4602
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4603 void Parker::unpark() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4604 int s, status ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4605 status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4606 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4607 s = _counter;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4608 _counter = 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4609 if (s < 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4610 if (WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4611 status = pthread_cond_signal (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4612 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4613 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4614 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4615 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4616 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4617 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4618 status = pthread_cond_signal (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4619 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4620 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4621 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4622 pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4623 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4624 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4625 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4626
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4627
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4628 /* Darwin has no "environ" in a dynamic library. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4629 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4630 #include <crt_externs.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4631 #define environ (*_NSGetEnviron())
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4632 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4633 extern char** environ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4634 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4635
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4636 // Run the specified command in a separate process. Return its exit value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4637 // or -1 on failure (e.g. can't fork a new process).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4638 // Unlike system(), this function can be called from signal handler. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4639 // doesn't block SIGINT et al.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4640 int os::fork_and_exec(char* cmd) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4641 const char * argv[4] = {"sh", "-c", cmd, NULL};
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4642
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4643 // fork() in BsdThreads/NPTL is not async-safe. It needs to run
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4644 // pthread_atfork handlers and reset pthread library. All we need is a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4645 // separate process to execve. Make a direct syscall to fork process.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4646 // On IA64 there's no fork syscall, we have to use fork() and hope for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4647 // the best...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4648 pid_t pid = fork();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4649
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4650 if (pid < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4651 // fork failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4652 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4653
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4654 } else if (pid == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4655 // child process
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4656
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4657 // execve() in BsdThreads will call pthread_kill_other_threads_np()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4658 // first to kill every thread on the thread list. Because this list is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4659 // not reset by fork() (see notes above), execve() will instead kill
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4660 // every thread in the parent process. We know this is the only thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4661 // in the new process, so make a system call directly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4662 // IA64 should use normal execve() from glibc to match the glibc fork()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4663 // above.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4664 execve("/bin/sh", (char* const*)argv, environ);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4665
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4666 // execve failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4667 _exit(-1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4668
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4669 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4670 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4671 // care about the actual exit code, for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4672
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4673 int status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4674
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4675 // Wait for the child process to exit. This returns immediately if
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4676 // the child has already exited. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4677 while (waitpid(pid, &status, 0) < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4678 switch (errno) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4679 case ECHILD: return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4680 case EINTR: break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4681 default: return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4682 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4683 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4684
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4685 if (WIFEXITED(status)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4686 // The child exited normally; get its exit code.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4687 return WEXITSTATUS(status);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4688 } else if (WIFSIGNALED(status)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4689 // The child exited because of a signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4690 // The best value to return is 0x80 + signal number,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4691 // because that is what all Unix shells do, and because
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4692 // it allows callers to distinguish between process exit and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4693 // process death by signal.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4694 return 0x80 + WTERMSIG(status);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4695 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4696 // Unknown exit code; pass it through
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4697 return status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4698 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4699 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4700 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4701
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4702 // is_headless_jre()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4703 //
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4704 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4705 // in order to report if we are running in a headless jre
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4706 //
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4707 // Since JDK8 xawt/libmawt.so was moved into the same directory
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4708 // as libawt.so, and renamed libawt_xawt.so
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4709 //
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4710 bool os::is_headless_jre() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4711 struct stat statbuf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4712 char buf[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4713 char libmawtpath[MAXPATHLEN];
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4714 const char *xawtstr = "/xawt/libmawt" JNI_LIB_SUFFIX;
5921
fdf4deca44ec 7152206: anti-delta the fix for 7152031
dcubed
parents: 5920
diff changeset
4715 const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4716 char *p;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4717
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4718 // Get path to libjvm.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4719 os::jvm_path(buf, sizeof(buf));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4720
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4721 // Get rid of libjvm.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4722 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4723 if (p == NULL) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4724 else *p = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4725
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4726 // Get rid of client or server
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4727 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4728 if (p == NULL) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4729 else *p = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4730
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4731 // check xawt/libmawt.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4732 strcpy(libmawtpath, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4733 strcat(libmawtpath, xawtstr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4734 if (::stat(libmawtpath, &statbuf) == 0) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4735
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4736 // check libawt_xawt.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4737 strcpy(libmawtpath, buf);
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4738 strcat(libmawtpath, new_xawtstr);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4739 if (::stat(libmawtpath, &statbuf) == 0) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4740
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4741 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4742 }
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4743
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4744 // Get the default path to the core file
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4745 // Returns the length of the string
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4746 int os::get_core_path(char* buffer, size_t bufferSize) {
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4747 int n = jio_snprintf(buffer, bufferSize, "/cores");
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4748
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4749 // Truncate if theoretical string was longer than bufferSize
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4750 n = MIN2(n, (int)bufferSize);
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4751
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4752 return n;
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4753 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10400
diff changeset
4754
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
4755 #ifndef PRODUCT
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
4756 void TestReserveMemorySpecial_test() {
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
4757 // No tests available for this platform
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
4758 }
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12096
diff changeset
4759 #endif