annotate src/os/bsd/vm/os_bsd.cpp @ 8854:754c24457b20

7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method. Reviewed-by: jmasa, tamao
author tschatzl
date Wed, 27 Mar 2013 19:21:18 +0100
parents 252ad8d5f22b
children b9a918201d47 8be1318fbe77
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 static int SR_finalize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 julong os::available_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 return Bsd::available_memory();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 julong os::Bsd::available_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 // XXXBSD: this is just a stopgap implementation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 return physical_memory() >> 2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 julong os::physical_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 return Bsd::physical_memory();
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 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171 // environment support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 bool os::getenv(const char* name, char* buf, int len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 const char* val = ::getenv(name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 if (val != NULL && strlen(val) < (size_t)len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 strcpy(buf, val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 if (len > 0) buf[0] = 0; // return a null string
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 return false;
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 // Return true if user is running as root.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 bool os::have_special_privileges() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 static bool init = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 static bool privileges = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189 if (!init) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 privileges = (getuid() != geteuid()) || (getgid() != getegid());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 init = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 return privileges;
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 // Cpu architecture string
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 #if defined(ZERO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 static char cpu_arch[] = ZERO_LIBARCH;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 #elif defined(IA64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 static char cpu_arch[] = "ia64";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 #elif defined(IA32)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 static char cpu_arch[] = "i386";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 #elif defined(AMD64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 static char cpu_arch[] = "amd64";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 #elif defined(ARM)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 static char cpu_arch[] = "arm";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209 #elif defined(PPC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 static char cpu_arch[] = "ppc";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 #elif defined(SPARC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 # ifdef _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 static char cpu_arch[] = "sparcv9";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 static char cpu_arch[] = "sparc";
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218 #error Add appropriate cpu_arch setting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
220
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
221 // Compiler variant
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
222 #ifdef COMPILER2
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
223 #define COMPILER_VARIANT "server"
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
224 #else
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
225 #define COMPILER_VARIANT "client"
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
226 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
228
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229 void os::Bsd::initialize_system_info() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 int mib[2];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 size_t len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232 int cpu_val;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
233 julong mem_val;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 /* get processors count via hw.ncpus sysctl */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 mib[0] = CTL_HW;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 mib[1] = HW_NCPU;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 len = sizeof(cpu_val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 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
240 assert(len == sizeof(cpu_val), "unexpected data size");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 set_processor_count(cpu_val);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244 set_processor_count(1); // fallback
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
247 /* 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
248 * since it returns a 64 bit value)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 mib[0] = CTL_HW;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
251 mib[1] = HW_MEMSIZE;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 len = sizeof(mem_val);
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
253 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
254 assert(len == sizeof(mem_val), "unexpected data size");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
255 _physical_memory = mem_val;
7626
c07c102cbad7 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 7456
diff changeset
256 } else {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 _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
258 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 // limit _physical_memory memory view on OpenBSD since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263 // datasize rlimit restricts us anyway.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 struct rlimit limits;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 getrlimit(RLIMIT_DATA, &limits);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
271 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
272 static const char *get_home() {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
273 const char *home_dir = ::getenv("HOME");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
274 if ((home_dir == NULL) || (*home_dir == '\0')) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
275 struct passwd *passwd_info = getpwuid(geteuid());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
276 if (passwd_info != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
277 home_dir = passwd_info->pw_dir;
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
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
281 return home_dir;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
282 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
283 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
284
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285 void os::init_system_properties_values() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 // char arch[12];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287 // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289 // The next steps are taken in the product version:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
290 //
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
291 // Obtain the JAVA_HOME value from the location of libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
292 // This library should be located at:
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
293 // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
295 // 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
296 // assume libjvm.so is installed in a JDK and we use this path.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298 // Otherwise exit with message: "Could not create the Java virtual machine."
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300 // The following extra steps are taken in the debugging version:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302 // If "/jre/lib/" does NOT appear at the right place in the path
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303 // instead of exit check for $JAVA_HOME environment variable.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
305 // 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
306 // 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
307 // it looks like libjvm.so is installed there
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
308 // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 // Otherwise exit.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
311 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
312 // Important note: if the location of libjvm.so changes this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313 // code needs to be changed accordingly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
315 // The next few definitions allow the code to be verbatim:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
316 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
317 #define getenv(n) ::getenv(n)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 * See ld(1):
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321 * The linker uses the following search paths to locate required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322 * shared libraries:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
323 * 1: ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
324 * ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
325 * 7: The default directories, normally /lib and /usr/lib.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
326 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
327 #ifndef DEFAULT_LIBPATH
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
328 #define DEFAULT_LIBPATH "/lib:/usr/lib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
329 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
330
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
331 #define EXTENSIONS_DIR "/lib/ext"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
332 #define ENDORSED_DIR "/lib/endorsed"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
333 #define REG_DIR "/usr/java/packages"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
334
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
335 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
336 #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
337 #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
338 const char *user_home_dir = get_home();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
339 // 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
340 int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
341 sizeof(SYS_EXTENSIONS_DIRS);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
342 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
343
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
344 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
345 /* sysclasspath, java_home, dll_dir */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
346 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
347 char *home_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
348 char *dll_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
349 char *pslash;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
350 char buf[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
351 os::jvm_path(buf, sizeof(buf));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
352
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
353 // Found the full path to libjvm.so.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
354 // Now cut the path to <java_home>/jre if we can.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
355 *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
356 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
357 if (pslash != NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
358 *pslash = '\0'; /* get rid of /{client|server|hotspot} */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
359 dll_path = malloc(strlen(buf) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
360 if (dll_path == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
361 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
362 strcpy(dll_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
363 Arguments::set_dll_dir(dll_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
364
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
365 if (pslash != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
366 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
367 if (pslash != NULL) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
368 *pslash = '\0'; /* get rid of /<arch> (/lib on macosx) */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
369 #ifndef __APPLE__
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
370 pslash = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
371 if (pslash != NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
372 *pslash = '\0'; /* get rid of /lib */
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
373 #endif
3960
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
377 home_path = malloc(strlen(buf) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
378 if (home_path == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
379 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
380 strcpy(home_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
381 Arguments::set_java_home(home_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
382
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
383 if (!set_boot_path('/', ':'))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
384 return;
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 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
388 * Where to look for native libraries
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
389 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
390 * Note: Due to a legacy implementation, most of the library path
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
391 * is set in the launcher. This was to accomodate linking restrictions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
392 * on legacy Bsd implementations (which are no longer supported).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
393 * Eventually, all the library path setting will be done here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
394 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
395 * However, to prevent the proliferation of improperly built native
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
396 * libraries, the new path component /usr/java/packages is added here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
397 * Eventually, all the library path setting will be done here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
398 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
399 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
400 char *ld_library_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
401
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
402 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
403 * Construct the invariant part of ld_library_path. Note that the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
404 * space for the colon and the trailing null are provided by the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
405 * nulls included by the sizeof operator (so actually we allocate
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
406 * a byte more than necessary).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
407 */
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
408 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
409 ld_library_path = (char *) malloc(system_ext_size);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
410 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
411 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
412 ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
413 strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
414 sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
415 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
416
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
417 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
418 * Get the user setting of LD_LIBRARY_PATH, and prepended it. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
419 * should always exist (until the legacy problem cited above is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
420 * addressed).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
421 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
422 #ifdef __APPLE__
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
423 // 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
424 char *l = getenv("JAVA_LIBRARY_PATH");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
425 if (l != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
426 char *t = ld_library_path;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
427 /* That's +1 for the colon and +1 for the trailing '\0' */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
428 ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
429 sprintf(ld_library_path, "%s:%s", l, t);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
430 free(t);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
431 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
432
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
433 char *v = getenv("DYLD_LIBRARY_PATH");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
434 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
435 char *v = getenv("LD_LIBRARY_PATH");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
436 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
437 if (v != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
438 char *t = ld_library_path;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
439 /* That's +1 for the colon and +1 for the trailing '\0' */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
440 ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
441 sprintf(ld_library_path, "%s:%s", v, t);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
442 free(t);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
443 }
4960
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
444
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
445 #ifdef __APPLE__
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
446 // 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
447 // 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
448 // 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
449 // 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
450 // "." 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
451 // 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
452 // 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
453 // JAVA_LIBRARY_PATH environment variable.
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
454 {
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
455 char *t = ld_library_path;
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
456 // that's +3 for appending ":." and the trailing '\0'
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
457 ld_library_path = (char *) malloc(strlen(t) + 3);
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
458 sprintf(ld_library_path, "%s:%s", t, ".");
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
459 free(t);
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
460 }
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
461 #endif
86ce3208eb18 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 4854
diff changeset
462
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
463 Arguments::set_library_path(ld_library_path);
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 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
467 * Extensions directories.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
468 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
469 * Note that the space for the colon and the trailing null are provided
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
470 * by the nulls included by the sizeof operator (so actually one byte more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
471 * than necessary is allocated).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
472 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
473 {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
474 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
475 char *buf = malloc(strlen(Arguments::get_java_home()) +
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
476 sizeof(EXTENSIONS_DIR) + system_ext_size);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
477 sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
478 SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
479 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
480 char *buf = malloc(strlen(Arguments::get_java_home()) +
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
481 sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
482 sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
483 Arguments::get_java_home());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
484 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
485
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
486 Arguments::set_ext_dirs(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
487 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
488
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
489 /* Endorsed standards default directory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
490 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
491 char * buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
492 buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
493 sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
494 Arguments::set_endorsed_dirs(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
495 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
496 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
497
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
498 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
499 #undef SYS_EXTENSIONS_DIR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
500 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
501 #undef malloc
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
502 #undef getenv
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
503 #undef EXTENSIONS_DIR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
504 #undef ENDORSED_DIR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
505
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
506 // Done
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
507 return;
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 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
511 // breakpoint support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
512
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
513 void os::breakpoint() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
514 BREAKPOINT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
515 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
516
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
517 extern "C" void breakpoint() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
518 // use debugger to set breakpoint here
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 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
522 // signal support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
523
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
524 debug_only(static bool signal_sets_initialized = false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
525 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
526
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
527 bool os::Bsd::is_sig_ignored(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
528 struct sigaction oact;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
529 sigaction(sig, (struct sigaction*)NULL, &oact);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
530 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
531 : CAST_FROM_FN_PTR(void*, oact.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
532 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
533 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
534 else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
535 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
536 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
537
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
538 void os::Bsd::signal_sets_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
539 // Should also have an assertion stating we are still single-threaded.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
540 assert(!signal_sets_initialized, "Already initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
541 // Fill in signals that are necessarily unblocked for all threads in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
542 // the VM. Currently, we unblock the following signals:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
543 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
544 // by -Xrs (=ReduceSignalUsage));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
545 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
546 // other threads. The "ReduceSignalUsage" boolean tells us not to alter
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
547 // the dispositions or masks wrt these signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
548 // Programs embedding the VM that want to use the above signals for their
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
549 // own purposes must, at this time, use the "-Xrs" option to prevent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
550 // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
551 // (See bug 4345157, and other related bugs).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
552 // In reality, though, unblocking these signals is really a nop, since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
553 // these signals are not blocked by default.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
554 sigemptyset(&unblocked_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
555 sigemptyset(&allowdebug_blocked_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
556 sigaddset(&unblocked_sigs, SIGILL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
557 sigaddset(&unblocked_sigs, SIGSEGV);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
558 sigaddset(&unblocked_sigs, SIGBUS);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
559 sigaddset(&unblocked_sigs, SIGFPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
560 sigaddset(&unblocked_sigs, SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
561
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
562 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
563 if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
564 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
565 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
566 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
567 if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
568 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
569 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
570 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
571 if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
572 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
573 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
574 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
575 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
576 // Fill in signals that are blocked by all but the VM thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
577 sigemptyset(&vm_sigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
578 if (!ReduceSignalUsage)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
579 sigaddset(&vm_sigs, BREAK_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
580 debug_only(signal_sets_initialized = true);
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
584 // These are signals that are unblocked while a thread is running Java.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
585 // (For some reason, they get blocked by default.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
586 sigset_t* os::Bsd::unblocked_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
587 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
588 return &unblocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
589 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
590
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
591 // These are the signals that are blocked while a (non-VM) thread is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
592 // running Java. Only the VM thread handles these signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
593 sigset_t* os::Bsd::vm_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
594 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
595 return &vm_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
596 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
597
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
598 // These are signals that are blocked during cond_wait to allow debugger in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
599 sigset_t* os::Bsd::allowdebug_blocked_signals() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
600 assert(signal_sets_initialized, "Not initialized");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
601 return &allowdebug_blocked_sigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
602 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
603
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
604 void os::Bsd::hotspot_sigmask(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
605
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
606 //Save caller's signal mask before setting VM signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
607 sigset_t caller_sigmask;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
608 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
609
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
610 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
611 osthread->set_caller_sigmask(caller_sigmask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
612
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
613 pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
614
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
615 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
616 if (thread->is_VM_thread()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
617 // Only the VM thread handles BREAK_SIGNAL ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
618 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
619 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
620 // ... all other threads block BREAK_SIGNAL
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
621 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
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 //////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
628 // create new thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
629
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
630 static address highest_vm_reserved_address();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
631
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
632 // check if it's safe to start a new thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
633 static bool _thread_safety_check(Thread* thread) {
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
634 return true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
635 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
636
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
637 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
638 // library handle for calling objc_registerThreadWithCollector()
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
639 // without static linking to the libobjc library
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
640 #define OBJC_LIB "/usr/lib/libobjc.dylib"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
641 #define OBJC_GCREGISTER "objc_registerThreadWithCollector"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
642 typedef void (*objc_registerThreadWithCollector_t)();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
643 extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
644 objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
645 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
646
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
647 #ifdef __APPLE__
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
648 static uint64_t locate_unique_thread_id() {
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
649 // 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
650 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
651 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
652
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
653 thread_info(::mach_thread_self(), THREAD_IDENTIFIER_INFO,
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
654 (thread_info_t) &m_ident_info, &count);
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
655 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
656 }
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
657 #endif
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
658
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
659 // Thread start routine for all newly created threads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
660 static void *java_start(Thread *thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
661 // Try to randomize the cache line index of hot stack frames.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
662 // This helps when threads of the same stack traces evict each other's
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
663 // cache lines. The threads can be either from the same JVM instance, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
664 // from different JVM instances. The benefit is especially true for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
665 // processors with hyperthreading technology.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
666 static int counter = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
667 int pid = os::current_process_id();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
668 alloca(((pid ^ counter++) & 7) * 128);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
669
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
670 ThreadLocalStorage::set_thread(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
671
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
672 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
673 Monitor* sync = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
674
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
675 // non floating stack BsdThreads needs extra check, see above
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
676 if (!_thread_safety_check(thread)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
677 // notify parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
678 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
679 osthread->set_state(ZOMBIE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
680 sync->notify_all();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
681 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
682 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
683
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
684 #ifdef __APPLE__
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
685 // thread_id is mach thread on macos
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
686 osthread->set_thread_id(::mach_thread_self());
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
687 osthread->set_unique_thread_id(locate_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
688 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
689 // thread_id is pthread_id on BSD
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
690 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
691 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
692 // initialize signal mask for this thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
693 os::Bsd::hotspot_sigmask(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
694
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
695 // initialize floating point control register
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
696 os::Bsd::init_thread_fpu_state();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
697
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
698 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
699 // register thread with objc gc
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
700 if (objc_registerThreadWithCollectorFunction != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
701 objc_registerThreadWithCollectorFunction();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
702 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
703 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
704
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
705 // handshaking with parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
706 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
707 MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
708
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
709 // notify parent thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
710 osthread->set_state(INITIALIZED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
711 sync->notify_all();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
712
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
713 // wait until os::start_thread()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
714 while (osthread->get_state() == INITIALIZED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
715 sync->wait(Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
716 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
717 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
718
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
719 // call one more level start routine
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
720 thread->run();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
721
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
722 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
723 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
724
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
725 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
726 assert(thread->osthread() == NULL, "caller responsible");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
727
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
728 // Allocate the OSThread object
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
729 OSThread* osthread = new OSThread(NULL, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
730 if (osthread == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
731 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
732 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
733
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
734 // set the correct thread state
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
735 osthread->set_thread_type(thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
736
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
737 // Initial state is ALLOCATED but not INITIALIZED
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
738 osthread->set_state(ALLOCATED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
739
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
740 thread->set_osthread(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
741
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
742 // init thread attributes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
743 pthread_attr_t attr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
744 pthread_attr_init(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
745 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
746
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
747 // stack size
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
748 if (os::Bsd::supports_variable_stack_size()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
749 // calculate stack size if it's not specified by caller
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
750 if (stack_size == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
751 stack_size = os::Bsd::default_stack_size(thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
752
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
753 switch (thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
754 case os::java_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
755 // Java threads use ThreadStackSize which default value can be
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
756 // changed with the flag -Xss
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
757 assert (JavaThread::stack_size_at_create() > 0, "this should be set");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
758 stack_size = JavaThread::stack_size_at_create();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
759 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
760 case os::compiler_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
761 if (CompilerThreadStackSize > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
762 stack_size = (size_t)(CompilerThreadStackSize * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
763 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
764 } // else fall through:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
765 // use VMThreadStackSize if CompilerThreadStackSize is not defined
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
766 case os::vm_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
767 case os::pgc_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
768 case os::cgc_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
769 case os::watcher_thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
770 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
771 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
772 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
773 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
774
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
775 stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
776 pthread_attr_setstacksize(&attr, stack_size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
777 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
778 // let pthread_create() pick the default value.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
779 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
780
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
781 ThreadState state;
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 pthread_t tid;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
785 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
786
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
787 pthread_attr_destroy(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
788
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
789 if (ret != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
790 if (PrintMiscellaneous && (Verbose || WizardMode)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
791 perror("pthread_create()");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
792 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
793 // Need to clean up stuff we've allocated so far
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
794 thread->set_osthread(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
795 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
796 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
797 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
798
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
799 // Store pthread info into the OSThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
800 osthread->set_pthread_id(tid);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
801
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
802 // Wait until child thread is either initialized or aborted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
803 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
804 Monitor* sync_with_child = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
805 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
806 while ((state = osthread->get_state()) == ALLOCATED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
807 sync_with_child->wait(Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
808 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
809 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
810
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 // Aborted due to thread limit being reached
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
814 if (state == ZOMBIE) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
815 thread->set_osthread(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
816 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
817 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
818 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
819
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
820 // The thread is returned suspended (in state INITIALIZED),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
821 // and is started higher up in the call chain
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
822 assert(state == INITIALIZED, "race condition");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
823 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
824 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
825
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
826 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
827 // attach existing thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
828
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
829 // bootstrap the main thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
830 bool os::create_main_thread(JavaThread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
831 assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
832 return create_attached_thread(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
833 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
834
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
835 bool os::create_attached_thread(JavaThread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
836 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
837 thread->verify_not_published();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
838 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
839
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
840 // Allocate the OSThread object
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
841 OSThread* osthread = new OSThread(NULL, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
842
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
843 if (osthread == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
844 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
845 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
846
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
847 // 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
848 #ifdef __APPLE__
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
849 osthread->set_thread_id(::mach_thread_self());
8023
758935f7c23f 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 7629
diff changeset
850 osthread->set_unique_thread_id(locate_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
851 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
852 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
853 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
854 osthread->set_pthread_id(::pthread_self());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
855
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
856 // initialize floating point control register
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
857 os::Bsd::init_thread_fpu_state();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
858
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
859 // Initial thread state is RUNNABLE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
860 osthread->set_state(RUNNABLE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
861
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
862 thread->set_osthread(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
863
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
864 // initialize signal mask for this thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
865 // and save the caller's signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
866 os::Bsd::hotspot_sigmask(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
867
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
868 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
869 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
870
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
871 void os::pd_start_thread(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
872 OSThread * osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
873 assert(osthread->get_state() != INITIALIZED, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
874 Monitor* sync_with_child = osthread->startThread_lock();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
875 MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
876 sync_with_child->notify();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
877 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
878
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
879 // Free Bsd resources related to the OSThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
880 void os::free_thread(OSThread* osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
881 assert(osthread != NULL, "osthread not set");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
882
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
883 if (Thread::current()->osthread() == osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
884 // Restore caller's signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
885 sigset_t sigmask = osthread->caller_sigmask();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
886 pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
887 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
888
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
889 delete osthread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
890 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
891
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
892 //////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
893 // thread local storage
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
894
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
895 int os::allocate_thread_local_storage() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
896 pthread_key_t key;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
897 int rslt = pthread_key_create(&key, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
898 assert(rslt == 0, "cannot allocate thread local storage");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
899 return (int)key;
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 // 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
903 // on VM exit.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
904 void os::free_thread_local_storage(int index) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
905 int rslt = pthread_key_delete((pthread_key_t)index);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
906 assert(rslt == 0, "invalid index");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
907 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
908
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
909 void os::thread_local_storage_at_put(int index, void* value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
910 int rslt = pthread_setspecific((pthread_key_t)index, value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
911 assert(rslt == 0, "pthread_setspecific failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
912 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
913
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
914 extern "C" Thread* get_thread() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
915 return ThreadLocalStorage::thread();
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
919 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
920 // time support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
921
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
922 // Time since start-up in seconds to a fine granularity.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
923 // Used by VMSelfDestructTimer and the MemProfiler.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
924 double os::elapsedTime() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
925
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
926 return (double)(os::elapsed_counter()) * 0.000001;
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 jlong os::elapsed_counter() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
930 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
931 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
932 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
933 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
934
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
935 jlong os::elapsed_frequency() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
936 return (1000 * 1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
937 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
938
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
939 // XXX: For now, code this as if BSD does not support vtime.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
940 bool os::supports_vtime() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
941 bool os::enable_vtime() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
942 bool os::vtime_enabled() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
943 double os::elapsedVTime() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
944 // better than nothing, but not much
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
945 return elapsedTime();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
946 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
947
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
948 jlong os::javaTimeMillis() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
949 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
950 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
951 assert(status != -1, "bsd error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
952 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
953 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
954
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
955 #ifndef CLOCK_MONOTONIC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
956 #define CLOCK_MONOTONIC (1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
957 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
958
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
959 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
960 void os::Bsd::clock_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
961 // XXXDARWIN: Investigate replacement monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
962 }
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
963 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
964 void os::Bsd::clock_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
965 struct timespec res;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
966 struct timespec tp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
967 if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
968 ::clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
969 // yes, monotonic clock is supported
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
970 _clock_gettime = ::clock_gettime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
971 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
972 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
973 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
974
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
975
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
976 jlong os::javaTimeNanos() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
977 if (Bsd::supports_monotonic_clock()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
978 struct timespec tp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
979 int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
980 assert(status == 0, "gettime error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
981 jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
982 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
983 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
984 timeval time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
985 int status = gettimeofday(&time, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
986 assert(status != -1, "bsd error");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
987 jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
988 return 1000 * usecs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
989 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
990 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
991
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
992 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
993 if (Bsd::supports_monotonic_clock()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
994 info_ptr->max_value = ALL_64_BITS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
995
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
996 // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
997 info_ptr->may_skip_backward = false; // not subject to resetting or drifting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
998 info_ptr->may_skip_forward = false; // not subject to resetting or drifting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
999 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1000 // gettimeofday - based on time in seconds since the Epoch thus does not wrap
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1001 info_ptr->max_value = ALL_64_BITS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1002
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1003 // gettimeofday is a real time clock so it skips
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1004 info_ptr->may_skip_backward = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1005 info_ptr->may_skip_forward = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1006 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1007
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1008 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1009 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1010
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1011 // Return the real, user, and system times in seconds from an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1012 // arbitrary fixed point in the past.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1013 bool os::getTimesSecs(double* process_real_time,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1014 double* process_user_time,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1015 double* process_system_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1016 struct tms ticks;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1017 clock_t real_ticks = times(&ticks);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1018
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1019 if (real_ticks == (clock_t) (-1)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1020 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1021 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1022 double ticks_per_second = (double) clock_tics_per_sec;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1023 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1024 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1025 *process_real_time = ((double) real_ticks) / ticks_per_second;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1026
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1027 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1028 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1029 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1030
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1031
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1032 char * os::local_time_string(char *buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1033 struct tm t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1034 time_t long_time;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1035 time(&long_time);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1036 localtime_r(&long_time, &t);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1037 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1038 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1039 t.tm_hour, t.tm_min, t.tm_sec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1040 return buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1041 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1042
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1043 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1044 return localtime_r(clock, res);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1045 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1046
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1047 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1048 // runtime exit support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1049
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1050 // Note: os::shutdown() might be called very early during initialization, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1051 // called from signal handler. Before adding something to os::shutdown(), make
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1052 // sure it is async-safe and can handle partially initialized VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1053 void os::shutdown() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1054
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1055 // allow PerfMemory to attempt cleanup of any persistent resources
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1056 perfMemory_exit();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1057
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1058 // needs to remove object in file system
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1059 AttachListener::abort();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1060
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1061 // flush buffered output, finish log files
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1062 ostream_abort();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1063
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1064 // Check for abort hook
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1065 abort_hook_t abort_hook = Arguments::abort_hook();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1066 if (abort_hook != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1067 abort_hook();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1068 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1069
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1070 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1071
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1072 // Note: os::abort() might be called very early during initialization, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1073 // called from signal handler. Before adding something to os::abort(), make
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1074 // sure it is async-safe and can handle partially initialized VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1075 void os::abort(bool dump_core) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1076 os::shutdown();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1077 if (dump_core) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1078 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1079 fdStream out(defaultStream::output_fd());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1080 out.print_raw("Current thread is ");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1081 char buf[16];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1082 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1083 out.print_raw_cr(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1084 out.print_raw_cr("Dumping core ...");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1085 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1086 ::abort(); // dump core
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1087 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1088
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1089 ::exit(1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1090 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1091
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1092 // Die immediately, no exit hook, no abort hook, no cleanup.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1093 void os::die() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1094 // _exit() on BsdThreads only kills current thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1095 ::abort();
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 // unused on bsd for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1099 void os::set_error_file(const char *logfile) {}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1100
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1101
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1102 // This method is a copy of JDK's sysGetLastErrorString
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1103 // from src/solaris/hpi/src/system_md.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1104
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1105 size_t os::lasterror(char *buf, size_t len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1106
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1107 if (errno == 0) return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1108
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1109 const char *s = ::strerror(errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1110 size_t n = ::strlen(s);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1111 if (n >= len) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1112 n = len - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1113 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1114 ::strncpy(buf, s, n);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1115 buf[n] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1116 return n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1117 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1118
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
1119 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
1120 #ifdef __APPLE__
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
1121 return (intx)::mach_thread_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
1122 #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
1123 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
1124 #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
1125 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1126 int os::current_process_id() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1127
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1128 // Under the old bsd thread library, bsd gives each thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1129 // its own process id. Because of this each thread will return
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1130 // a different pid if this method were to return the result
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1131 // of getpid(2). Bsd provides no api that returns the pid
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1132 // of the launcher thread for the vm. This implementation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1133 // returns a unique pid, the pid of the launcher thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1134 // that starts the vm 'process'.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1135
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1136 // Under the NPTL, getpid() returns the same pid as the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1137 // launcher thread rather than a unique pid per thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1138 // Use gettid() if you want the old pre NPTL behaviour.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1139
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1140 // if you are looking for the result of a call to getpid() that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1141 // returns a unique pid for the calling thread, then look at the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1142 // OSThread::thread_id() method in osThread_bsd.hpp file
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1143
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1144 return (int)(_initial_pid ? _initial_pid : getpid());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1145 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1146
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1147 // DLL functions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1148
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1149 #define JNI_LIB_PREFIX "lib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1150 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1151 #define JNI_LIB_SUFFIX ".dylib"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1152 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1153 #define JNI_LIB_SUFFIX ".so"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1154 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1155
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1156 const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1157
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1158 // This must be hard coded because it's the system's temporary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1159 // directory not the java application's temp directory, ala java.io.tmpdir.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1160 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1161 // macosx has a secure per-user temporary directory
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1162 char temp_path_storage[PATH_MAX];
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1163 const char* os::get_temp_directory() {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1164 static char *temp_path = NULL;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1165 if (temp_path == NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1166 int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1167 if (pathSize == 0 || pathSize > PATH_MAX) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1168 strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1169 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1170 temp_path = temp_path_storage;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1171 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1172 return temp_path;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1173 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1174 #else /* __APPLE__ */
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1175 const char* os::get_temp_directory() { return "/tmp"; }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1176 #endif /* __APPLE__ */
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1177
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1178 static bool file_exists(const char* filename) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1179 struct stat statbuf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1180 if (filename == NULL || strlen(filename) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1181 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1182 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1183 return os::stat(filename, &statbuf) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1184 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1185
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1186 bool os::dll_build_name(char* buffer, size_t buflen,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1187 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
1188 bool retval = false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1189 // Copied from libhpi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1190 const size_t pnamelen = pname ? strlen(pname) : 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1191
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1192 // Return error on buffer overflow.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1193 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
1194 return retval;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1195 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1196
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1197 if (pnamelen == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1198 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
1199 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1200 } else if (strchr(pname, *os::path_separator()) != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1201 int n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1202 char** pelements = split_path(pname, &n);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1203 for (int i = 0 ; i < n ; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1204 // Really shouldn't be NULL, but check can't hurt
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1205 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1206 continue; // skip the empty path values
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1207 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1208 snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1209 pelements[i], fname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1210 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
1211 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1212 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1213 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1214 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1215 // release the storage
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1216 for (int i = 0 ; i < n ; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1217 if (pelements[i] != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1218 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1219 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1220 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1221 if (pelements != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1222 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1223 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1224 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1225 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
1226 retval = true;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1227 }
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6918
diff changeset
1228 return retval;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1229 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1230
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1231 const char* os::get_current_directory(char *buf, int buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1232 return getcwd(buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1233 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1234
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1235 // check if addr is inside libjvm.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1236 bool os::address_is_in_vm(address addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1237 static address libjvm_base_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1238 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1239
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1240 if (libjvm_base_addr == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1241 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1242 libjvm_base_addr = (address)dlinfo.dli_fbase;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1243 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1244 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1245
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1246 if (dladdr((void *)addr, &dlinfo)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1247 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1248 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1249
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1250 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1251 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1252
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1253
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1254 #define MACH_MAXSYMLEN 256
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1255
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1256 bool os::dll_address_to_function_name(address addr, char *buf,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1257 int buflen, int *offset) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1258 Dl_info dlinfo;
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1259 char localbuf[MACH_MAXSYMLEN];
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1260
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1261 // dladdr will find names of dynamic functions only, but does
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1262 // it set dli_fbase with mach_header address when it "fails" ?
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1263 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1264 if (buf != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1265 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1266 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1267 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1268 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1269 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1270 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1271 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1272 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
4805
db18ca98d237 7131050: fix for "7071311 Decoder enhancement" does not build on MacOS X
zgu
parents: 4734
diff changeset
1273 buf, buflen, offset, dlinfo.dli_fname)) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1274 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1275 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1276 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1277
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1278 // Handle non-dymanic manually:
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1279 if (dlinfo.dli_fbase != NULL &&
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1280 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1281 if(!Decoder::demangle(localbuf, buf, buflen)) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1282 jio_snprintf(buf, buflen, "%s", localbuf);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1283 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1284 return true;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6200
diff changeset
1285 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1286 if (buf != NULL) buf[0] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1287 if (offset != NULL) *offset = -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1288 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1289 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1290
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1291 // ported from solaris version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1292 bool os::dll_address_to_library_name(address addr, char* buf,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1293 int buflen, int* offset) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1294 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1295
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1296 if (dladdr((void*)addr, &dlinfo)){
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1297 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1298 if (offset) *offset = addr - (address)dlinfo.dli_fbase;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1299 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1300 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1301 if (buf) buf[0] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1302 if (offset) *offset = -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1303 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1304 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1305 }
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1306
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1307 // Loads .dll/.so and
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
1308 // 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
1309 // same architecture as Hotspot is running on
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1310
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1311 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1312 void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1313 void * result= ::dlopen(filename, RTLD_LAZY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1314 if (result != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1315 // Successful loading
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1316 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1317 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1318
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1319 // Read system error message into ebuf
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1320 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1321 ebuf[ebuflen-1]='\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1322
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1323 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1324 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1325 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1326 void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1327 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1328 void * result= ::dlopen(filename, RTLD_LAZY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1329 if (result != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1330 // Successful loading
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1331 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1332 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1333
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1334 Elf32_Ehdr elf_head;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1335
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1336 // Read system error message into ebuf
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1337 // It may or may not be overwritten below
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1338 ::strncpy(ebuf, ::dlerror(), ebuflen-1);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1339 ebuf[ebuflen-1]='\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1340 int diag_msg_max_length=ebuflen-strlen(ebuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1341 char* diag_msg_buf=ebuf+strlen(ebuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1342
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1343 if (diag_msg_max_length==0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1344 // No more space in ebuf for additional diagnostics message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1345 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1346 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1347
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1348
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1349 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1350
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1351 if (file_descriptor < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1352 // Can't open library, report dlerror() message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1353 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1354 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1355
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1356 bool failed_to_read_elf_head=
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1357 (sizeof(elf_head)!=
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1358 (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1359
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1360 ::close(file_descriptor);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1361 if (failed_to_read_elf_head) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1362 // file i/o error - report dlerror() msg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1363 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1364 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1365
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1366 typedef struct {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1367 Elf32_Half code; // Actual value as defined in elf.h
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1368 Elf32_Half compat_class; // Compatibility of archs at VM's sense
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1369 char elf_class; // 32 or 64 bit
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1370 char endianess; // MSB or LSB
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1371 char* name; // String representation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1372 } arch_t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1373
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1374 #ifndef EM_486
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1375 #define EM_486 6 /* Intel 80486 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1376 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1377
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1378 #ifndef EM_MIPS_RS3_LE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1379 #define EM_MIPS_RS3_LE 10 /* MIPS */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1380 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1381
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1382 #ifndef EM_PPC64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1383 #define EM_PPC64 21 /* PowerPC64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1384 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1385
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1386 #ifndef EM_S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1387 #define EM_S390 22 /* IBM System/390 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1388 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1389
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1390 #ifndef EM_IA_64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1391 #define EM_IA_64 50 /* HP/Intel IA-64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1392 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1393
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1394 #ifndef EM_X86_64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1395 #define EM_X86_64 62 /* AMD x86-64 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1396 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1397
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1398 static const arch_t arch_array[]={
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1399 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1400 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1401 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1402 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1403 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1404 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1405 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1406 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1407 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1408 {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1409 {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1410 {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1411 {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1412 {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1413 {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1414 {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1415 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1416
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1417 #if (defined IA32)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1418 static Elf32_Half running_arch_code=EM_386;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1419 #elif (defined AMD64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1420 static Elf32_Half running_arch_code=EM_X86_64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1421 #elif (defined IA64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1422 static Elf32_Half running_arch_code=EM_IA_64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1423 #elif (defined __sparc) && (defined _LP64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1424 static Elf32_Half running_arch_code=EM_SPARCV9;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1425 #elif (defined __sparc) && (!defined _LP64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1426 static Elf32_Half running_arch_code=EM_SPARC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1427 #elif (defined __powerpc64__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1428 static Elf32_Half running_arch_code=EM_PPC64;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1429 #elif (defined __powerpc__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1430 static Elf32_Half running_arch_code=EM_PPC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1431 #elif (defined ARM)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1432 static Elf32_Half running_arch_code=EM_ARM;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1433 #elif (defined S390)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1434 static Elf32_Half running_arch_code=EM_S390;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1435 #elif (defined ALPHA)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1436 static Elf32_Half running_arch_code=EM_ALPHA;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1437 #elif (defined MIPSEL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1438 static Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1439 #elif (defined PARISC)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1440 static Elf32_Half running_arch_code=EM_PARISC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1441 #elif (defined MIPS)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1442 static Elf32_Half running_arch_code=EM_MIPS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1443 #elif (defined M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1444 static Elf32_Half running_arch_code=EM_68K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1445 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1446 #error Method os::dll_load requires that one of following is defined:\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1447 IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1448 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1449
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1450 // Identify compatability class for VM's architecture and library's architecture
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1451 // Obtain string descriptions for architectures
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1452
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1453 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
1454 int running_arch_index=-1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1455
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1456 for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1457 if (running_arch_code == arch_array[i].code) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1458 running_arch_index = i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1459 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1460 if (lib_arch.code == arch_array[i].code) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1461 lib_arch.compat_class = arch_array[i].compat_class;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1462 lib_arch.name = arch_array[i].name;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1463 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1464 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1465
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1466 assert(running_arch_index != -1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1467 "Didn't find running architecture code (running_arch_code) in arch_array");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1468 if (running_arch_index == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1469 // Even though running architecture detection failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1470 // we may still continue with reporting dlerror() message
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1471 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1472 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1473
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1474 if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1475 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1476 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1477 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1478
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1479 #ifndef S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1480 if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1481 ::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
1482 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1483 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1484 #endif // !S390
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1485
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1486 if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1487 if ( lib_arch.name!=NULL ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1488 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1489 " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1490 lib_arch.name, arch_array[running_arch_index].name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1491 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1492 ::snprintf(diag_msg_buf, diag_msg_max_length-1,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1493 " (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
1494 lib_arch.code,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1495 arch_array[running_arch_index].name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1496 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1497 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1498
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1499 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1500 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1501 #endif /* !__APPLE__ */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1502
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1503 // XXX: Do we need a lock around this as per Linux?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1504 void* os::dll_lookup(void* handle, const char* name) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1505 return dlsym(handle, name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1506 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1507
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1508
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1509 static bool _print_ascii_file(const char* filename, outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1510 int fd = ::open(filename, O_RDONLY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1511 if (fd == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1512 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1513 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1514
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1515 char buf[32];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1516 int bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1517 while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1518 st->print_raw(buf, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1519 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1520
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1521 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1522
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1523 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1524 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1525
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1526 void os::print_dll_info(outputStream *st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1527 st->print_cr("Dynamic libraries:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1528 #ifdef RTLD_DI_LINKMAP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1529 Dl_info dli;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1530 void *handle;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1531 Link_map *map;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1532 Link_map *p;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1533
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1534 if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1535 st->print_cr("Error: Cannot print dynamic libraries.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1536 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1537 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1538 handle = dlopen(dli.dli_fname, RTLD_LAZY);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1539 if (handle == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1540 st->print_cr("Error: Cannot print dynamic libraries.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1541 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1542 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1543 dlinfo(handle, RTLD_DI_LINKMAP, &map);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1544 if (map == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1545 st->print_cr("Error: Cannot print dynamic libraries.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1546 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1547 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1548
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1549 while (map->l_prev != NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1550 map = map->l_prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1551
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1552 while (map != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1553 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1554 map = map->l_next;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1555 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1556
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1557 dlclose(handle);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1558 #elif defined(__APPLE__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1559 uint32_t count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1560 uint32_t i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1561
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1562 count = _dyld_image_count();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1563 for (i = 1; i < count; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1564 const char *name = _dyld_get_image_name(i);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1565 intptr_t slide = _dyld_get_image_vmaddr_slide(i);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1566 st->print_cr(PTR_FORMAT " \t%s", slide, name);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1567 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1568 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1569 st->print_cr("Error: Cannot print dynamic libraries.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1570 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1571 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1572
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1573 void os::print_os_info_brief(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1574 st->print("Bsd");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1575
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1576 os::Posix::print_uname_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1577 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1578
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1579 void os::print_os_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1580 st->print("OS:");
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1581 st->print("Bsd");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1582
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1583 os::Posix::print_uname_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1584
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1585 os::Posix::print_rlimit_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1586
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 5921
diff changeset
1587 os::Posix::print_load_average(st);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1588 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1589
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1590 void os::pd_print_cpu_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1591 // Nothing to do for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1592 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1593
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1594 void os::print_memory_info(outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1595
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1596 st->print("Memory:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1597 st->print(" %dk page", os::vm_page_size()>>10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1598
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1599 st->print(", physical " UINT64_FORMAT "k",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1600 os::physical_memory() >> 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1601 st->print("(" UINT64_FORMAT "k free)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1602 os::available_memory() >> 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1603 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1604
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1605 // meminfo
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1606 st->print("\n/proc/meminfo:\n");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1607 _print_ascii_file("/proc/meminfo", st);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1608 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1609 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1610
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1611 // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1612 // but they're the same for all the bsd arch that we support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1613 // 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
1614 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1615 "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1616 "ILL_COPROC", "ILL_BADSTK" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1617
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1618 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1619 "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1620 "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1621
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1622 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1623
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1624 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1625
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1626 void os::print_siginfo(outputStream* st, void* siginfo) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1627 st->print("siginfo:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1628
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1629 const int buflen = 100;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1630 char buf[buflen];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1631 siginfo_t *si = (siginfo_t*)siginfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1632 st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1633 if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1634 st->print("si_errno=%s", buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1635 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1636 st->print("si_errno=%d", si->si_errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1637 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1638 const int c = si->si_code;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1639 assert(c > 0, "unexpected si_code");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1640 switch (si->si_signo) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1641 case SIGILL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1642 st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1643 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1644 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1645 case SIGFPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1646 st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1647 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1648 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1649 case SIGSEGV:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1650 st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1651 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1652 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1653 case SIGBUS:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1654 st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1655 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1656 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1657 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1658 st->print(", si_code=%d", si->si_code);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1659 // no si_addr
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1660 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1661
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1662 if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1663 UseSharedSpaces) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1664 FileMapInfo* mapinfo = FileMapInfo::current_info();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1665 if (mapinfo->is_in_shared_space(si->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1666 st->print("\n\nError accessing class data sharing archive." \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1667 " Mapped file inaccessible during execution, " \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1668 " possible disk/network problem.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1669 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1670 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1671 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1672 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1673
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1674
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1675 static void print_signal_handler(outputStream* st, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1676 char* buf, size_t buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1677
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1678 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1679 st->print_cr("Signal Handlers:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1680 print_signal_handler(st, SIGSEGV, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1681 print_signal_handler(st, SIGBUS , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1682 print_signal_handler(st, SIGFPE , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1683 print_signal_handler(st, SIGPIPE, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1684 print_signal_handler(st, SIGXFSZ, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1685 print_signal_handler(st, SIGILL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1686 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1687 print_signal_handler(st, SR_signum, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1688 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1689 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1690 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1691 print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1692 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1693
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1694 static char saved_jvm_path[MAXPATHLEN] = {0};
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1695
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1696 // Find the full path to the current module, libjvm
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1697 void os::jvm_path(char *buf, jint buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1698 // Error checking.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1699 if (buflen < MAXPATHLEN) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1700 assert(false, "must use a large-enough buffer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1701 buf[0] = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1702 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1703 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1704 // Lazy resolve the path to current module.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1705 if (saved_jvm_path[0] != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1706 strcpy(buf, saved_jvm_path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1707 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1708 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1709
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1710 char dli_fname[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1711 bool ret = dll_address_to_library_name(
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1712 CAST_FROM_FN_PTR(address, os::jvm_path),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1713 dli_fname, sizeof(dli_fname), NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1714 assert(ret != 0, "cannot locate libjvm");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1715 char *rp = realpath(dli_fname, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1716 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1717 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1718
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1719 if (Arguments::created_by_gamma_launcher()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1720 // Support for the gamma launcher. Typical value for buf is
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1721 // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm". If "/jre/lib/" appears at
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1722 // 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
1723 // 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
1724 // construct a path to the JVM being overridden.
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1725
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1726 const char *p = buf + strlen(buf) - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1727 for (int count = 0; p > buf && count < 5; ++count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1728 for (--p; p > buf && *p != '/'; --p)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1729 /* empty */ ;
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 if (strncmp(p, "/jre/lib/", 9) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1733 // Look for JAVA_HOME in the environment.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1734 char* java_home_var = ::getenv("JAVA_HOME");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1735 if (java_home_var != NULL && java_home_var[0] != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1736 char* jrelib_p;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1737 int len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1738
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1739 // Check the current module name "libjvm"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1740 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1741 assert(strstr(p, "/libjvm") == p, "invalid library name");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1742
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1743 rp = realpath(java_home_var, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1744 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1745 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1746
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1747 // determine if this is a legacy image or modules image
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1748 // modules image doesn't have "jre" subdirectory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1749 len = strlen(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1750 jrelib_p = buf + len;
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1751
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1752 // Add the appropriate library subdir
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1753 snprintf(jrelib_p, buflen-len, "/jre/lib");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1754 if (0 != access(buf, F_OK)) {
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1755 snprintf(jrelib_p, buflen-len, "/lib");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1756 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1757
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1758 // Add the appropriate client or server subdir
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1759 len = strlen(buf);
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1760 jrelib_p = buf + len;
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1761 snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1762 if (0 != access(buf, F_OK)) {
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1763 snprintf(jrelib_p, buflen-len, "");
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1764 }
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1765
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1766 // 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
1767 // to complete the path to JVM being overridden. Otherwise fallback
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1768 // to the path to the current library.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1769 if (0 == access(buf, F_OK)) {
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1770 // Use current module name "libjvm"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1771 len = strlen(buf);
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1772 snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1773 } else {
4846
e8a4934564b2 7125793: MAC: test_gamma should always work
phh
parents: 4805
diff changeset
1774 // Fall back to path of current library
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1775 rp = realpath(dli_fname, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1776 if (rp == NULL)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1777 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1778 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1779 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1780 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1781 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1782
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1783 strcpy(saved_jvm_path, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1784 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1785
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1786 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1787 // no prefix required, not even "_"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1788 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1789
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1790 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1791 // no suffix required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1792 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1793
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1794 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1795 // sun.misc.Signal support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1796
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1797 static volatile jint sigint_count = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1798
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1799 static void
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1800 UserHandler(int sig, void *siginfo, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1801 // 4511530 - sem_post is serialized and handled by the manager thread. When
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1802 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1803 // don't want to flood the manager thread with sem_post requests.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1804 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1805 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1806
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1807 // Ctrl-C is pressed during error reporting, likely because the error
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1808 // handler fails to abort. Let VM die immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1809 if (sig == SIGINT && is_error_reported()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1810 os::die();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1811 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1812
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1813 os::signal_notify(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1814 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1815
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1816 void* os::user_handler() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1817 return CAST_FROM_FN_PTR(void*, UserHandler);
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 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1821 typedef void (*sa_handler_t)(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1822 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1823 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1824
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1825 void* os::signal(int signal_number, void* handler) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1826 struct sigaction sigAct, oldSigAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1827
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1828 sigfillset(&(sigAct.sa_mask));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1829 sigAct.sa_flags = SA_RESTART|SA_SIGINFO;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1830 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1831
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1832 if (sigaction(signal_number, &sigAct, &oldSigAct)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1833 // -1 means registration failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1834 return (void *)-1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1835 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1836
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1837 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1838 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1839
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1840 void os::signal_raise(int signal_number) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1841 ::raise(signal_number);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1842 }
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 * The following code is moved from os.cpp for making this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1846 * code platform specific, which it is by its very nature.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1847 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1848
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1849 // Will be modified when max signal is changed to be dynamic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1850 int os::sigexitnum_pd() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1851 return NSIG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1852 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1853
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1854 // a counter for each possible signal value
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1855 static volatile jint pending_signals[NSIG+1] = { 0 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1856
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1857 // Bsd(POSIX) specific hand shaking semaphore.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1858 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1859 static semaphore_t sig_sem;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1860 #define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1861 #define SEM_WAIT(sem) semaphore_wait(sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1862 #define SEM_POST(sem) semaphore_signal(sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1863 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1864 static sem_t sig_sem;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1865 #define SEM_INIT(sem, value) sem_init(&sem, 0, value)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1866 #define SEM_WAIT(sem) sem_wait(&sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1867 #define SEM_POST(sem) sem_post(&sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1868 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1869
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1870 void os::signal_init_pd() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1871 // Initialize signal structures
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1872 ::memset((void*)pending_signals, 0, sizeof(pending_signals));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1873
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1874 // Initialize signal semaphore
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1875 ::SEM_INIT(sig_sem, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1876 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1877
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1878 void os::signal_notify(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1879 Atomic::inc(&pending_signals[sig]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1880 ::SEM_POST(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1881 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1882
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1883 static int check_pending_signals(bool wait) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1884 Atomic::store(0, &sigint_count);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1885 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1886 for (int i = 0; i < NSIG + 1; i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1887 jint n = pending_signals[i];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1888 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1889 return i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1890 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1891 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1892 if (!wait) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1893 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1894 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1895 JavaThread *thread = JavaThread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1896 ThreadBlockInVM tbivm(thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1897
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1898 bool threadIsSuspended;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1899 do {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1900 thread->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1901 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1902 ::SEM_WAIT(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1903
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1904 // were we externally suspended while we were waiting?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1905 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1906 if (threadIsSuspended) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1907 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1908 // The semaphore has been incremented, but while we were waiting
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1909 // another thread suspended us. We don't want to continue running
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1910 // while suspended because that would surprise the thread that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1911 // suspended us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1912 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1913 ::SEM_POST(sig_sem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1914
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1915 thread->java_suspend_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1916 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1917 } while (threadIsSuspended);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1918 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1919 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1920
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1921 int os::signal_lookup() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1922 return check_pending_signals(false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1923 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1924
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1925 int os::signal_wait() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1926 return check_pending_signals(true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1927 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1928
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1929 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1930 // Virtual Memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1931
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1932 int os::vm_page_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1933 // Seems redundant as all get out
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1934 assert(os::Bsd::page_size() != -1, "must call os::init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1935 return os::Bsd::page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1936 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1937
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1938 // Solaris allocates memory by pages.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1939 int os::vm_allocation_granularity() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1940 assert(os::Bsd::page_size() != -1, "must call os::init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1941 return os::Bsd::page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1942 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1943
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1944 // Rationale behind this function:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1945 // current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1946 // mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1947 // samples for JITted code. Here we create private executable mapping over the code cache
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1948 // 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
1949 // info for the reporting script by storing timestamp and location of symbol
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1950 void bsd_wrap_code(char* base, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1951 static volatile jint cnt = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1952
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1953 if (!UseOprofile) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1954 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1955 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1956
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1957 char buf[PATH_MAX + 1];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1958 int num = Atomic::add(1, &cnt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1959
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1960 snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1961 os::get_temp_directory(), os::current_process_id(), num);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1962 unlink(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1963
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1964 int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1965
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1966 if (fd != -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1967 off_t rv = ::lseek(fd, size-2, SEEK_SET);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1968 if (rv != (off_t)-1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1969 if (::write(fd, "", 1) == 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1970 mmap(base, size,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1971 PROT_READ|PROT_WRITE|PROT_EXEC,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1972 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1973 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1974 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1975 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1976 unlink(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1977 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1978 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1979
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1980 // NOTE: Bsd kernel does not really reserve the pages for us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1981 // All it does is to check if there are enough free pages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1982 // left at the time of mmap(). This could be a potential
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1983 // problem.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1984 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1985 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1986 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1987 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1988 return ::mprotect(addr, size, prot) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1989 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1990 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1991 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1992 return res != (uintptr_t) MAP_FAILED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1993 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1994 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1995
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1996
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
1997 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
1998 bool exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1999 return commit_memory(addr, size, exec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2000 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2001
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2002 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
2003 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2004
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2005 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
2006 ::madvise(addr, bytes, MADV_DONTNEED);
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 void os::numa_make_global(char *addr, size_t bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2010 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2011
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2012 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2013 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2014
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2015 bool os::numa_topology_changed() { return false; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2016
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2017 size_t os::numa_get_groups_num() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2018 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2019 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2020
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2021 int os::numa_get_group_id() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2022 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2023 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2024
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2025 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2026 if (size > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2027 ids[0] = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2028 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2029 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2030 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2031 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2032
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2033 bool os::get_page_info(char *start, page_info* info) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2034 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2035 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2036
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2037 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
2038 return end;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2039 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2040
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2041
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2042 bool os::pd_uncommit_memory(char* addr, size_t size) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2043 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2044 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2045 return ::mprotect(addr, size, PROT_NONE) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2046 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2047 uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2048 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2049 return res != (uintptr_t) MAP_FAILED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2050 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2051 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2052
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2053 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2054 return os::commit_memory(addr, size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2055 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2056
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2057 // If this is a growable mapping, remove the guard pages entirely by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2058 // munmap()ping them. If not, just call uncommit_memory().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2059 bool os::remove_stack_guard_pages(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2060 return os::uncommit_memory(addr, size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2061 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2062
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2063 static address _highest_vm_reserved_address = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2064
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2065 // If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2066 // at 'requested_addr'. If there are existing memory mappings at the same
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2067 // location, however, they will be overwritten. If 'fixed' is false,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2068 // 'requested_addr' is only treated as a hint, the return value may or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2069 // may not start from the requested address. Unlike Bsd mmap(), this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2070 // function returns NULL to indicate failure.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2071 static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2072 char * addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2073 int flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2074
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2075 flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2076 if (fixed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2077 assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2078 flags |= MAP_FIXED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2079 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2080
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2081 // Map uncommitted pages PROT_READ and PROT_WRITE, change access
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2082 // to PROT_EXEC if executable when we commit the page.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2083 addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2084 flags, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2085
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2086 if (addr != MAP_FAILED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2087 // anon_mmap() should only get called during VM initialization,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2088 // don't need lock (actually we can skip locking even it can be called
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2089 // from multiple threads, because _highest_vm_reserved_address is just a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2090 // hint about the upper limit of non-stack memory regions.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2091 if ((address)addr + bytes > _highest_vm_reserved_address) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2092 _highest_vm_reserved_address = (address)addr + bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2093 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2094 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2095
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2096 return addr == MAP_FAILED ? NULL : addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2097 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2098
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2099 // Don't update _highest_vm_reserved_address, because there might be memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2100 // regions above addr + size. If so, releasing a memory region only creates
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2101 // a hole in the address space, it doesn't help prevent heap-stack collision.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2102 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2103 static int anon_munmap(char * addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2104 return ::munmap(addr, size) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2105 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2106
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2107 char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2108 size_t alignment_hint) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2109 return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2110 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2111
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2112 bool os::pd_release_memory(char* addr, size_t size) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2113 return anon_munmap(addr, size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2114 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2115
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2116 static address highest_vm_reserved_address() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2117 return _highest_vm_reserved_address;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2118 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2119
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2120 static bool bsd_mprotect(char* addr, size_t size, int prot) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2121 // Bsd wants the mprotect address argument to be page aligned.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2122 char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2123
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2124 // According to SUSv3, mprotect() should only be used with mappings
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2125 // established by mmap(), and mmap() always maps whole pages. Unaligned
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2126 // 'addr' likely indicates problem in the VM (e.g. trying to change
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2127 // protection of malloc'ed or statically allocated memory). Check the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2128 // caller if you hit this assert.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2129 assert(addr == bottom, "sanity check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2130
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2131 size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2132 return ::mprotect(bottom, size, prot) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2133 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2134
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2135 // Set protections specified
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2136 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2137 bool is_committed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2138 unsigned int p = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2139 switch (prot) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2140 case MEM_PROT_NONE: p = PROT_NONE; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2141 case MEM_PROT_READ: p = PROT_READ; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2142 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2143 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2144 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2145 ShouldNotReachHere();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2146 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2147 // is_committed is unused.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2148 return bsd_mprotect(addr, bytes, p);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2149 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2150
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2151 bool os::guard_memory(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2152 return bsd_mprotect(addr, size, PROT_NONE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2153 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2154
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2155 bool os::unguard_memory(char* addr, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2156 return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2157 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2158
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2159 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
2160 return false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2161 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2162
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2163 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2164 * Set the coredump_filter bits to include largepages in core dump (bit 6)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2165 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2166 * From the coredump_filter documentation:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2167 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2168 * - (bit 0) anonymous private memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2169 * - (bit 1) anonymous shared memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2170 * - (bit 2) file-backed private memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2171 * - (bit 3) file-backed shared memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2172 * - (bit 4) ELF header pages in file-backed private memory areas (it is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2173 * effective only if the bit 2 is cleared)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2174 * - (bit 5) hugetlb private memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2175 * - (bit 6) hugetlb shared memory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2176 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2177 static void set_coredump_filter(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2178 FILE *f;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2179 long cdm;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2180
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2181 if ((f = fopen("/proc/self/coredump_filter", "r+")) == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2182 return;
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 if (fscanf(f, "%lx", &cdm) != 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2186 fclose(f);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2187 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2188 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2189
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2190 rewind(f);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2191
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2192 if ((cdm & LARGEPAGES_BIT) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2193 cdm |= LARGEPAGES_BIT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2194 fprintf(f, "%#lx", cdm);
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 fclose(f);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2198 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2199
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2200 // Large page support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2201
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2202 static size_t _large_page_size = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2203
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2204 void os::large_page_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2205 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2206
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2207
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2208 char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2209 // "exec" is passed in but not used. Creating the shared image for
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2210 // the code cache doesn't have an SHM_X executable permission to check.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2211 assert(UseLargePages && UseSHM, "only for SHM large pages");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2212
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2213 key_t key = IPC_PRIVATE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2214 char *addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2215
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2216 bool warn_on_failure = UseLargePages &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2217 (!FLAG_IS_DEFAULT(UseLargePages) ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2218 !FLAG_IS_DEFAULT(LargePageSizeInBytes)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2219 );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2220 char msg[128];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2221
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2222 // Create a large shared memory region to attach to based on size.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2223 // Currently, size is the total size of the heap
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2224 int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2225 if (shmid == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2226 // Possible reasons for shmget failure:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2227 // 1. shmmax is too small for Java heap.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2228 // > check shmmax value: cat /proc/sys/kernel/shmmax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2229 // > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2230 // 2. not enough large page memory.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2231 // > check available large pages: cat /proc/meminfo
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2232 // > increase amount of large pages:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2233 // echo new_value > /proc/sys/vm/nr_hugepages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2234 // Note 1: different Bsd may use different name for this property,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2235 // e.g. on Redhat AS-3 it is "hugetlb_pool".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2236 // Note 2: it's possible there's enough physical memory available but
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2237 // they are so fragmented after a long run that they can't
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2238 // coalesce into large pages. Try to reserve large pages when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2239 // the system is still "fresh".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2240 if (warn_on_failure) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2241 jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2242 warning(msg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2243 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2244 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2245 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2246
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2247 // attach to the region
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2248 addr = (char*)shmat(shmid, req_addr, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2249 int err = errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2250
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2251 // Remove shmid. If shmat() is successful, the actual shared memory segment
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2252 // will be deleted when it's detached by shmdt() or when the process
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2253 // terminates. If shmat() is not successful this will remove the shared
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2254 // segment immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2255 shmctl(shmid, IPC_RMID, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2256
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2257 if ((intptr_t)addr == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2258 if (warn_on_failure) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2259 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2260 warning(msg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2261 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2262 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2263 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2264
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2265 // The memory is committed
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2266 address pc = CALLER_PC;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2267 MemTracker::record_virtual_memory_reserve((address)addr, bytes, pc);
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2268 MemTracker::record_virtual_memory_commit((address)addr, bytes, pc);
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2269
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2270 return addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2271 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2272
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2273 bool os::release_memory_special(char* base, size_t bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2274 // detaching the SHM segment will also delete it, see reserve_memory_special()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2275 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
2276 if (rslt == 0) {
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2277 MemTracker::record_virtual_memory_uncommit((address)base, bytes);
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2278 MemTracker::record_virtual_memory_release((address)base, bytes);
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2279 return true;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2280 } else {
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2281 return false;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2282 }
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8675
diff changeset
2283
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2284 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2285
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2286 size_t os::large_page_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2287 return _large_page_size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2288 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2289
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2290 // HugeTLBFS allows application to commit large page memory on demand;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2291 // with SysV SHM the entire memory region must be allocated as shared
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2292 // memory.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2293 bool os::can_commit_large_page_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2294 return UseHugeTLBFS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2295 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2296
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2297 bool os::can_execute_large_page_memory() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2298 return UseHugeTLBFS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2299 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2300
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2301 // Reserve memory at an arbitrary address, only if that area is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2302 // available (and not reserved for something else).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2303
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
2304 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2305 const int max_tries = 10;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2306 char* base[max_tries];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2307 size_t size[max_tries];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2308 const size_t gap = 0x000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2309
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2310 // Assert only that the size is a multiple of the page size, since
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2311 // that's all that mmap requires, and since that's all we really know
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2312 // about at this low abstraction level. If we need higher alignment,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2313 // we can either pass an alignment to this method or verify alignment
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2314 // in one of the methods further up the call chain. See bug 5044738.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2315 assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2316
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2317 // Repeatedly allocate blocks until the block is allocated at the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2318 // right spot. Give up after max_tries. Note that reserve_memory() will
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2319 // automatically update _highest_vm_reserved_address if the call is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2320 // successful. The variable tracks the highest memory address every reserved
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2321 // by JVM. It is used to detect heap-stack collision if running with
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2322 // fixed-stack BsdThreads. Because here we may attempt to reserve more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2323 // space than needed, it could confuse the collision detecting code. To
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2324 // solve the problem, save current _highest_vm_reserved_address and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2325 // calculate the correct value before return.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2326 address old_highest = _highest_vm_reserved_address;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2327
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2328 // 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
2329 // if kernel honors the hint then we can return immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2330 char * addr = anon_mmap(requested_addr, bytes, false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2331 if (addr == requested_addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2332 return requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2333 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2334
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2335 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2336 // mmap() is successful but it fails to reserve at the requested address
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2337 anon_munmap(addr, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2338 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2339
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2340 int i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2341 for (i = 0; i < max_tries; ++i) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2342 base[i] = reserve_memory(bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2343
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2344 if (base[i] != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2345 // Is this the block we wanted?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2346 if (base[i] == requested_addr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2347 size[i] = bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2348 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2349 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2350
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2351 // Does this overlap the block we wanted? Give back the overlapped
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2352 // parts and try again.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2353
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2354 size_t top_overlap = requested_addr + (bytes + gap) - base[i];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2355 if (top_overlap >= 0 && top_overlap < bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2356 unmap_memory(base[i], top_overlap);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2357 base[i] += top_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2358 size[i] = bytes - top_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2359 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2360 size_t bottom_overlap = base[i] + bytes - requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2361 if (bottom_overlap >= 0 && bottom_overlap < bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2362 unmap_memory(requested_addr, bottom_overlap);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2363 size[i] = bytes - bottom_overlap;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2364 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2365 size[i] = bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2366 }
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 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2370
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2371 // Give back the unused reserved pieces.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2372
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2373 for (int j = 0; j < i; ++j) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2374 if (base[j] != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2375 unmap_memory(base[j], size[j]);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2376 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2377 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2378
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2379 if (i < max_tries) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2380 _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2381 return requested_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2382 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2383 _highest_vm_reserved_address = old_highest;
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 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2387
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2388 size_t os::read(int fd, void *buf, unsigned int nBytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2389 RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2390 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2391
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2392 // TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2393 // Solaris uses poll(), bsd uses park().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2394 // Poll() is likely a better choice, assuming that Thread.interrupt()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2395 // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2396 // SIGSEGV, see 4355769.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2397
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2398 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2399 assert(thread == Thread::current(), "thread consistency check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2400
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2401 ParkEvent * const slp = thread->_SleepEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2402 slp->reset() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2403 OrderAccess::fence() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2404
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2405 if (interruptible) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2406 jlong prevtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2407
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2408 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2409 if (os::is_interrupted(thread, true)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2410 return OS_INTRPT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2411 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2412
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2413 jlong newtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2414
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2415 if (newtime - prevtime < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2416 // time moving backwards, should only happen if no monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2417 // not a guarantee() because JVM should not abort on kernel/glibc bugs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2418 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2419 } else {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4082
diff changeset
2420 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2421 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2422
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2423 if(millis <= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2424 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2425 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2426
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2427 prevtime = newtime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2428
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2429 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2430 assert(thread->is_Java_thread(), "sanity check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2431 JavaThread *jt = (JavaThread *) thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2432 ThreadBlockInVM tbivm(jt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2433 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2434
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2435 jt->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2436 // cleared by handle_special_suspend_equivalent_condition() or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2437 // java_suspend_self() via check_and_wait_while_suspended()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2438
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2439 slp->park(millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2440
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2441 // were we externally suspended while we were waiting?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2442 jt->check_and_wait_while_suspended();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2443 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2444 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2445 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2446 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2447 jlong prevtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2448
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2449 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2450 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2451 // the 1st iteration ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2452 jlong newtime = javaTimeNanos();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2453
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2454 if (newtime - prevtime < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2455 // time moving backwards, should only happen if no monotonic clock
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2456 // not a guarantee() because JVM should not abort on kernel/glibc bugs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2457 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2458 } else {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4082
diff changeset
2459 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2460 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2461
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2462 if(millis <= 0) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2463
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2464 prevtime = newtime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2465 slp->park(millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2466 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2467 return OS_OK ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2468 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2469 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2470
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2471 int os::naked_sleep() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2472 // %% make the sleep time an integer flag. for now use 1 millisec.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2473 return os::sleep(Thread::current(), 1, false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2474 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2475
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2476 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2477 void os::infinite_sleep() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2478 while (true) { // sleep forever ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2479 ::sleep(100); // ... 100 seconds at a time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2480 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2481 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2482
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2483 // Used to convert frequent JVM_Yield() to nops
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2484 bool os::dont_yield() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2485 return DontYieldALot;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2486 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2487
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2488 void os::yield() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2489 sched_yield();
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 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2493
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2494 void os::yield_all(int attempts) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2495 // Yields to all threads, including threads with lower priorities
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2496 // Threads on Bsd are all with same priority. The Solaris style
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2497 // os::yield_all() with nanosleep(1ms) is not necessary.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2498 sched_yield();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2499 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2500
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2501 // Called from the tight loops to possibly influence time-sharing heuristics
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2502 void os::loop_breaker(int attempts) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2503 os::yield_all(attempts);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2504 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2505
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2506 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2507 // thread priority support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2508
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2509 // Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2510 // only supports dynamic priority, static priority must be zero. For real-time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2511 // applications, Bsd supports SCHED_RR which allows static priority (1-99).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2512 // However, for large multi-threaded applications, SCHED_RR is not only slower
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2513 // than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2514 // of 5 runs - Sep 2005).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2515 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2516 // The following code actually changes the niceness of kernel-thread/LWP. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2517 // has an assumption that setpriority() only modifies one kernel-thread/LWP,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2518 // 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
2519 // threads. It has always been the case, but could change in the future. For
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2520 // this reason, the code should not be used as default (ThreadPriorityPolicy=0).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2521 // It is only used when ThreadPriorityPolicy=1 and requires root privilege.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2522
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
2523 #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
2524 int os::java_to_os_priority[CriticalPriority + 1] = {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2525 19, // 0 Entry should never be used
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2526
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2527 0, // 1 MinPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2528 3, // 2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2529 6, // 3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2530
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2531 10, // 4
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2532 15, // 5 NormPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2533 18, // 6
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2534
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2535 21, // 7
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2536 25, // 8
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2537 28, // 9 NearMaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2538
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2539 31, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2540
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2541 31 // 11 CriticalPriority
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2542 };
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
2543 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2544 /* 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
2545 int os::java_to_os_priority[CriticalPriority + 1] = {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2546 0, // 0 Entry should never be used (MINPRI_USER)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2547
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2548 27, // 1 MinPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2549 28, // 2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2550 29, // 3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2551
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2552 30, // 4
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2553 31, // 5 NormPriority (BASEPRI_DEFAULT)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2554 32, // 6
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2555
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2556 33, // 7
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2557 34, // 8
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2558 35, // 9 NearMaxPriority
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2559
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2560 36, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2561
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2562 36 // 11 CriticalPriority
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2563 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2564 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2565
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2566 static int prio_init() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2567 if (ThreadPriorityPolicy == 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2568 // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2569 // if effective uid is not root. Perhaps, a more elegant way of doing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2570 // this is to test CAP_SYS_NICE capability, but that will require libcap.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2571 if (geteuid() != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2572 if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2573 warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2574 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2575 ThreadPriorityPolicy = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2576 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2577 }
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2578 if (UseCriticalJavaThreadPriority) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4846
diff changeset
2579 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
2580 }
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2581 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2582 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2583
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2584 OSReturn os::set_native_priority(Thread* thread, int newpri) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2585 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2586
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2587 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2588 // OpenBSD pthread_setprio starves low priority threads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2589 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2590 #elif defined(__FreeBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2591 int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2592 #elif defined(__APPLE__) || defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2593 struct sched_param sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2594 int policy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2595 pthread_t self = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2596
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2597 if (pthread_getschedparam(self, &policy, &sp) != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2598 return OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2599
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2600 sp.sched_priority = newpri;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2601 if (pthread_setschedparam(self, policy, &sp) != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2602 return OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2603
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2604 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2605 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2606 int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2607 return (ret == 0) ? OS_OK : OS_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2608 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2609 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2610
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2611 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2612 if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2613 *priority_ptr = java_to_os_priority[NormPriority];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2614 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2615 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2616
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2617 errno = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2618 #if defined(__OpenBSD__) || defined(__FreeBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2619 *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2620 #elif defined(__APPLE__) || defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2621 int policy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2622 struct sched_param sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2623
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2624 pthread_getschedparam(pthread_self(), &policy, &sp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2625 *priority_ptr = sp.sched_priority;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2626 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2627 *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2628 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2629 return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2630 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2631
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2632 // Hint to the underlying OS that a task switch would not be good.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2633 // Void return because it's a hint and can fail.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2634 void os::hint_no_preempt() {}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2635
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2636 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2637 // suspend/resume support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2638
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2639 // the low-level signal-based suspend/resume support is a remnant from the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2640 // old VM-suspension that used to be for java-suspension, safepoints etc,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2641 // within hotspot. Now there is a single use-case for this:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2642 // - calling get_thread_pc() on the VMThread by the flat-profiler task
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2643 // that runs in the watcher thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2644 // The remaining code is greatly simplified from the more general suspension
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2645 // code that used to be used.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2646 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2647 // The protocol is quite simple:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2648 // - suspend:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2649 // - sends a signal to the target thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2650 // - polls the suspend state of the osthread using a yield loop
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2651 // - target thread signal handler (SR_handler) sets suspend state
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2652 // and blocks in sigsuspend until continued
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2653 // - resume:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2654 // - sets target osthread state to continue
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2655 // - sends signal to end the sigsuspend loop in the SR_handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2656 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2657 // Note that the SR_lock plays no role in this suspend/resume protocol.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2658 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2659
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2660 static void resume_clear_context(OSThread *osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2661 osthread->set_ucontext(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2662 osthread->set_siginfo(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2663
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2664 // notify the suspend action is completed, we have now resumed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2665 osthread->sr.clear_suspended();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2666 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2667
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2668 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2669 osthread->set_ucontext(context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2670 osthread->set_siginfo(siginfo);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2671 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2672
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2673 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2674 // Handler function invoked when a thread's execution is suspended or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2675 // resumed. We have to be careful that only async-safe functions are
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2676 // called here (Note: most pthread functions are not async safe and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2677 // should be avoided.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2678 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2679 // Note: sigwait() is a more natural fit than sigsuspend() from an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2680 // interface point of view, but sigwait() prevents the signal hander
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2681 // from being run. libpthread would get very confused by not having
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2682 // its signal handlers run and prevents sigwait()'s use with the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2683 // mutex granting granting signal.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2684 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2685 // Currently only ever called on the VMThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2686 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2687 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2688 // Save and restore errno to avoid confusing native code with EINTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2689 // after sigsuspend.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2690 int old_errno = errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2691
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2692 Thread* thread = Thread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2693 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2694 assert(thread->is_VM_thread(), "Must be VMThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2695 // read current suspend action
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2696 int action = osthread->sr.suspend_action();
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2697 if (action == os::Bsd::SuspendResume::SR_SUSPEND) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2698 suspend_save_context(osthread, siginfo, context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2699
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2700 // Notify the suspend action is about to be completed. do_suspend()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2701 // waits until SR_SUSPENDED is set and then returns. We will wait
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2702 // here for a resume signal and that completes the suspend-other
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2703 // action. do_suspend/do_resume is always called as a pair from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2704 // the same thread - so there are no races
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2705
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2706 // notify the caller
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2707 osthread->sr.set_suspended();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2708
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2709 sigset_t suspend_set; // signals for sigsuspend()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2710
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2711 // get current set of blocked signals and unblock resume signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2712 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2713 sigdelset(&suspend_set, SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2714
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2715 // wait here until we are resumed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2716 do {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2717 sigsuspend(&suspend_set);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2718 // ignore all returns until we get a resume signal
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2719 } while (osthread->sr.suspend_action() != os::Bsd::SuspendResume::SR_CONTINUE);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2720
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2721 resume_clear_context(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2722
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2723 } else {
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2724 assert(action == os::Bsd::SuspendResume::SR_CONTINUE, "unexpected sr action");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2725 // nothing special to do - just leave the handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2726 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2727
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2728 errno = old_errno;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2729 }
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 static int SR_initialize() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2733 struct sigaction act;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2734 char *s;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2735 /* Get signal number to use for suspend/resume */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2736 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2737 int sig = ::strtol(s, 0, 10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2738 if (sig > 0 || sig < NSIG) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2739 SR_signum = sig;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2740 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2741 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2742
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2743 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2744 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2745
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2746 sigemptyset(&SR_sigset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2747 sigaddset(&SR_sigset, SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2748
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2749 /* Set up signal handler for suspend/resume */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2750 act.sa_flags = SA_RESTART|SA_SIGINFO;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2751 act.sa_handler = (void (*)(int)) SR_handler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2752
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2753 // SR_signum is blocked by default.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2754 // 4528190 - We also need to block pthread restart signal (32 on all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2755 // supported Bsd platforms). Note that BsdThreads need to block
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2756 // this signal for all threads to work properly. So we don't have
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2757 // to use hard-coded signal number when setting up the mask.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2758 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2759
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2760 if (sigaction(SR_signum, &act, 0) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2761 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2762 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2763
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2764 // Save signal flag
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2765 os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2766 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2767 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2768
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2769 static int SR_finalize() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2770 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2771 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2772
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2773
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2774 // returns true on success and false on error - really an error is fatal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2775 // but this seems the normal response to library errors
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2776 static bool do_suspend(OSThread* osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2777 // mark as suspended and send signal
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2778 osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_SUSPEND);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2779 int status = pthread_kill(osthread->pthread_id(), SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2780 assert_status(status == 0, status, "pthread_kill");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2781
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2782 // check status and wait until notified of suspension
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2783 if (status == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2784 for (int i = 0; !osthread->sr.is_suspended(); i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2785 os::yield_all(i);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2786 }
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2787 osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2788 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2789 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2790 else {
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2791 osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2792 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2793 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2794 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2795
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2796 static void do_resume(OSThread* osthread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2797 assert(osthread->sr.is_suspended(), "thread should be suspended");
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2798 osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_CONTINUE);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2799
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2800 int status = pthread_kill(osthread->pthread_id(), SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2801 assert_status(status == 0, status, "pthread_kill");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2802 // check status and wait unit notified of resumption
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2803 if (status == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2804 for (int i = 0; osthread->sr.is_suspended(); i++) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2805 os::yield_all(i);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2806 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2807 }
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 8067
diff changeset
2808 osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2809 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2810
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2811 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2812 // interrupt support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2813
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2814 void os::interrupt(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2815 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2816 "possibility of dangling Thread pointer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2817
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2818 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2819
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2820 if (!osthread->interrupted()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2821 osthread->set_interrupted(true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2822 // More than one thread can get here with the same value of osthread,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2823 // resulting in multiple notifications. We do, however, want the store
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2824 // to interrupted() to be visible to other threads before we execute unpark().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2825 OrderAccess::fence();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2826 ParkEvent * const slp = thread->_SleepEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2827 if (slp != NULL) slp->unpark() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2828 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2829
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2830 // For JSR166. Unpark even if interrupt status already was set
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2831 if (thread->is_Java_thread())
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2832 ((JavaThread*)thread)->parker()->unpark();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2833
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2834 ParkEvent * ev = thread->_ParkEvent ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2835 if (ev != NULL) ev->unpark() ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2836
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2837 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2838
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2839 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2840 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2841 "possibility of dangling Thread pointer");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2842
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2843 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2844
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2845 bool interrupted = osthread->interrupted();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2846
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2847 if (interrupted && clear_interrupted) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2848 osthread->set_interrupted(false);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2849 // consider thread->_SleepEvent->reset() ... optional optimization
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2850 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2851
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2852 return interrupted;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2853 }
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 // signal handling (except suspend/resume)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2857
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2858 // This routine may be used by user applications as a "hook" to catch signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2859 // The user-defined signal handler must pass unrecognized signals to this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2860 // routine, and if it returns true (non-zero), then the signal handler must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2861 // return immediately. If the flag "abort_if_unrecognized" is true, then this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2862 // routine will never retun false (zero), but instead will execute a VM panic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2863 // routine kill the process.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2864 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2865 // If this routine returns false, it is OK to call it again. This allows
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2866 // the user-defined signal handler to perform checks either before or after
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2867 // the VM performs its own checks. Naturally, the user code would be making
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2868 // 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
2869 // or breakpoint) that the VM was generating for its own correct operation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2870 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2871 // This routine may recognize any of the following kinds of signals:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2872 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2873 // It should be consulted by handlers for any of those signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2874 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2875 // The caller of this routine must pass in the three arguments supplied
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2876 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2877 // field of the structure passed to sigaction(). This routine assumes that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2878 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2879 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2880 // Note that the VM will print warnings if it detects conflicting signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2881 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2882 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2883 extern "C" JNIEXPORT int
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2884 JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2885 void* ucontext, int abort_if_unrecognized);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2886
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2887 void signalHandler(int sig, siginfo_t* info, void* uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2888 assert(info != NULL && uc != NULL, "it must be old kernel");
8067
5cd2fac2ae70 6749267: Signal handler should save/restore errno
hseigel
parents: 8023
diff changeset
2889 int orig_errno = errno; // Preserve errno value over signal handler.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2890 JVM_handle_bsd_signal(sig, info, uc, true);
8067
5cd2fac2ae70 6749267: Signal handler should save/restore errno
hseigel
parents: 8023
diff changeset
2891 errno = orig_errno;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2892 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2893
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2894
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2895 // This boolean allows users to forward their own non-matching signals
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2896 // to JVM_handle_bsd_signal, harmlessly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2897 bool os::Bsd::signal_handlers_are_installed = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2898
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2899 // For signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2900 struct sigaction os::Bsd::sigact[MAXSIGNUM];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2901 unsigned int os::Bsd::sigs = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2902 bool os::Bsd::libjsig_is_loaded = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2903 typedef struct sigaction *(*get_signal_t)(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2904 get_signal_t os::Bsd::get_signal_action = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2905
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2906 struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2907 struct sigaction *actp = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2908
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2909 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2910 // Retrieve the old signal handler from libjsig
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2911 actp = (*get_signal_action)(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2912 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2913 if (actp == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2914 // Retrieve the preinstalled signal handler from jvm
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2915 actp = get_preinstalled_handler(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2916 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2917
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2918 return actp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2919 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2920
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2921 static bool call_chained_handler(struct sigaction *actp, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2922 siginfo_t *siginfo, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2923 // Call the old signal handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2924 if (actp->sa_handler == SIG_DFL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2925 // It's more reasonable to let jvm treat it as an unexpected exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2926 // instead of taking the default action.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2927 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2928 } else if (actp->sa_handler != SIG_IGN) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2929 if ((actp->sa_flags & SA_NODEFER) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2930 // automaticlly block the signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2931 sigaddset(&(actp->sa_mask), sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2932 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2933
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2934 sa_handler_t hand;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2935 sa_sigaction_t sa;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2936 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2937 // retrieve the chained handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2938 if (siginfo_flag_set) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2939 sa = actp->sa_sigaction;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2940 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2941 hand = actp->sa_handler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2942 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2943
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2944 if ((actp->sa_flags & SA_RESETHAND) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2945 actp->sa_handler = SIG_DFL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2946 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2947
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2948 // try to honor the signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2949 sigset_t oset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2950 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2951
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2952 // call into the chained handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2953 if (siginfo_flag_set) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2954 (*sa)(sig, siginfo, context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2955 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2956 (*hand)(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2957 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2958
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2959 // restore the signal mask
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2960 pthread_sigmask(SIG_SETMASK, &oset, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2961 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2962 // Tell jvm's signal handler the signal is taken care of.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2963 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2964 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2965
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2966 bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2967 bool chained = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2968 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2969 if (UseSignalChaining) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2970 struct sigaction *actp = get_chained_signal_action(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2971 if (actp != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2972 chained = call_chained_handler(actp, sig, siginfo, context);
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 return chained;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2976 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2977
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2978 struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2979 if ((( (unsigned int)1 << sig ) & sigs) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2980 return &sigact[sig];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2981 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2982 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2983 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2984
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2985 void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2986 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2987 sigact[sig] = oldAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2988 sigs |= (unsigned int)1 << sig;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2989 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2990
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2991 // for diagnostic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2992 int os::Bsd::sigflags[MAXSIGNUM];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2993
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2994 int os::Bsd::get_our_sigflags(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2995 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2996 return sigflags[sig];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2997 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2998
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2999 void os::Bsd::set_our_sigflags(int sig, int flags) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3000 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3001 sigflags[sig] = flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3002 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3003
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3004 void os::Bsd::set_signal_handler(int sig, bool set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3005 // Check for overwrite.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3006 struct sigaction oldAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3007 sigaction(sig, (struct sigaction*)NULL, &oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3008
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3009 void* oldhand = oldAct.sa_sigaction
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3010 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3011 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3012 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3013 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3014 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3015 if (AllowUserSignalHandlers || !set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3016 // Do not overwrite; user takes responsibility to forward to us.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3017 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3018 } else if (UseSignalChaining) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3019 // save the old handler in jvm
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3020 save_preinstalled_handler(sig, oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3021 // libjsig also interposes the sigaction() call below and saves the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3022 // old sigaction on it own.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3023 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3024 fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3025 "%#lx for signal %d.", (long)oldhand, sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3026 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3027 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3028
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3029 struct sigaction sigAct;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3030 sigfillset(&(sigAct.sa_mask));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3031 sigAct.sa_handler = SIG_DFL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3032 if (!set_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3033 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3034 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3035 sigAct.sa_sigaction = signalHandler;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3036 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3037 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3038 // Save flags, which are set by ours
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3039 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3040 sigflags[sig] = sigAct.sa_flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3041
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3042 int ret = sigaction(sig, &sigAct, &oldAct);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3043 assert(ret == 0, "check");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3044
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3045 void* oldhand2 = oldAct.sa_sigaction
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3046 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3047 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3048 assert(oldhand2 == oldhand, "no concurrent signal handler installation");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3049 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3050
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3051 // install signal handlers for signals that HotSpot needs to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3052 // handle in order to support Java-level exception handling.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3053
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3054 void os::Bsd::install_signal_handlers() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3055 if (!signal_handlers_are_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3056 signal_handlers_are_installed = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3057
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3058 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3059 typedef void (*signal_setting_t)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3060 signal_setting_t begin_signal_setting = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3061 signal_setting_t end_signal_setting = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3062 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3063 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3064 if (begin_signal_setting != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3065 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3066 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3067 get_signal_action = CAST_TO_FN_PTR(get_signal_t,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3068 dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3069 libjsig_is_loaded = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3070 assert(UseSignalChaining, "should enable signal-chaining");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3071 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3072 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3073 // Tell libjsig jvm is setting signal handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3074 (*begin_signal_setting)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3075 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3076
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3077 set_signal_handler(SIGSEGV, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3078 set_signal_handler(SIGPIPE, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3079 set_signal_handler(SIGBUS, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3080 set_signal_handler(SIGILL, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3081 set_signal_handler(SIGFPE, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3082 set_signal_handler(SIGXFSZ, true);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3083
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3084 #if defined(__APPLE__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3085 // 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
3086 // 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
3087 // signal handler that's placed on our process by CrashReporter. This disables
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3088 // CrashReporter-based reporting.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3089 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3090 // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3091 // on caught fatal signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3092 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3093 // Additionally, gdb installs both standard BSD signal handlers, and mach exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3094 // handlers. By replacing the existing task exception handler, we disable gdb's mach
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3095 // exception handling, while leaving the standard BSD signal handlers functional.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3096 kern_return_t kr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3097 kr = task_set_exception_ports(mach_task_self(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3098 EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3099 MACH_PORT_NULL,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3100 EXCEPTION_STATE_IDENTITY,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3101 MACHINE_THREAD_STATE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3102
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3103 assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3104 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3105
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3106 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3107 // Tell libjsig jvm finishes setting signal handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3108 (*end_signal_setting)();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3109 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3110
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3111 // We don't activate signal checker if libjsig is in place, we trust ourselves
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3112 // and if UserSignalHandler is installed all bets are off
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3113 if (CheckJNICalls) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3114 if (libjsig_is_loaded) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3115 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3116 check_signals = false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3117 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3118 if (AllowUserSignalHandlers) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3119 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3120 check_signals = false;
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 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3124 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3125
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3126
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3127 /////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3128 // glibc on Bsd platform uses non-documented flag
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3129 // to indicate, that some special sort of signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3130 // trampoline is used.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3131 // We will never set this flag, and we should
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3132 // ignore this flag in our diagnostic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3133 #ifdef SIGNIFICANT_SIGNAL_MASK
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3134 #undef SIGNIFICANT_SIGNAL_MASK
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3135 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3136 #define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3137
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3138 static const char* get_signal_handler_name(address handler,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3139 char* buf, int buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3140 int offset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3141 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3142 if (found) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3143 // skip directory names
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3144 const char *p1, *p2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3145 p1 = buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3146 size_t len = strlen(os::file_separator());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3147 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3148 jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3149 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3150 jio_snprintf(buf, buflen, PTR_FORMAT, handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3151 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3152 return buf;
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 static void print_signal_handler(outputStream* st, int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3156 char* buf, size_t buflen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3157 struct sigaction sa;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3158
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3159 sigaction(sig, NULL, &sa);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3160
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3161 // See comment for SIGNIFICANT_SIGNAL_MASK define
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3162 sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3163
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3164 st->print("%s: ", os::exception_name(sig, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3165
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3166 address handler = (sa.sa_flags & SA_SIGINFO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3167 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3168 : CAST_FROM_FN_PTR(address, sa.sa_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3169
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3170 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3171 st->print("SIG_DFL");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3172 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3173 st->print("SIG_IGN");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3174 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3175 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3176 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3177
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3178 st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3179
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3180 address rh = VMError::get_resetted_sighandler(sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3181 // May be, handler was resetted by VMError?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3182 if(rh != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3183 handler = rh;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3184 sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3185 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3186
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3187 st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3188
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3189 // Check: is it our handler?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3190 if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3191 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3192 // It is our signal handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3193 // check for flags, reset system-used one!
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3194 if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3195 st->print(
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3196 ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3197 os::Bsd::get_our_sigflags(sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3198 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3199 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3200 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3201 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3202
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3203
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3204 #define DO_SIGNAL_CHECK(sig) \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3205 if (!sigismember(&check_signal_done, sig)) \
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3206 os::Bsd::check_signal_handler(sig)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3207
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3208 // This method is a periodic task to check for misbehaving JNI applications
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3209 // under CheckJNI, we can add any periodic checks here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3210
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3211 void os::run_periodic_checks() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3212
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3213 if (check_signals == false) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3214
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3215 // SEGV and BUS if overridden could potentially prevent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3216 // generation of hs*.log in the event of a crash, debugging
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3217 // such a case can be very challenging, so we absolutely
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3218 // check the following for a good measure:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3219 DO_SIGNAL_CHECK(SIGSEGV);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3220 DO_SIGNAL_CHECK(SIGILL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3221 DO_SIGNAL_CHECK(SIGFPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3222 DO_SIGNAL_CHECK(SIGBUS);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3223 DO_SIGNAL_CHECK(SIGPIPE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3224 DO_SIGNAL_CHECK(SIGXFSZ);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3225
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3226
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3227 // ReduceSignalUsage allows the user to override these handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3228 // see comments at the very top and jvm_solaris.h
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3229 if (!ReduceSignalUsage) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3230 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3231 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3232 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3233 DO_SIGNAL_CHECK(BREAK_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3234 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3235
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3236 DO_SIGNAL_CHECK(SR_signum);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3237 DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3238 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3239
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3240 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3241
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3242 static os_sigaction_t os_sigaction = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3243
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3244 void os::Bsd::check_signal_handler(int sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3245 char buf[O_BUFLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3246 address jvmHandler = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3247
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3248
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3249 struct sigaction act;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3250 if (os_sigaction == NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3251 // only trust the default sigaction, in case it has been interposed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3252 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3253 if (os_sigaction == NULL) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3254 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3255
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3256 os_sigaction(sig, (struct sigaction*)NULL, &act);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3257
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3258
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3259 act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3260
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3261 address thisHandler = (act.sa_flags & SA_SIGINFO)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3262 ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3263 : CAST_FROM_FN_PTR(address, act.sa_handler) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3264
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3265
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3266 switch(sig) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3267 case SIGSEGV:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3268 case SIGBUS:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3269 case SIGFPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3270 case SIGPIPE:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3271 case SIGILL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3272 case SIGXFSZ:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3273 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3274 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3275
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3276 case SHUTDOWN1_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3277 case SHUTDOWN2_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3278 case SHUTDOWN3_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3279 case BREAK_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3280 jvmHandler = (address)user_handler();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3281 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3282
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3283 case INTERRUPT_SIGNAL:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3284 jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3285 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3286
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3287 default:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3288 if (sig == SR_signum) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3289 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3290 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3291 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3292 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3293 break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3294 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3295
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3296 if (thisHandler != jvmHandler) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3297 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3298 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3299 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3300 // No need to check this sig any longer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3301 sigaddset(&check_signal_done, sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3302 } 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
3303 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3304 tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3305 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3306 // No need to check this sig any longer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3307 sigaddset(&check_signal_done, sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3308 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3309
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3310 // Dump all the signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3311 if (sigismember(&check_signal_done, sig)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3312 print_signal_handlers(tty, buf, O_BUFLEN);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3313 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3314 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3315
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3316 extern void report_error(char* file_name, int line_no, char* title, char* format, ...);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3317
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3318 extern bool signal_name(int signo, char* buf, size_t len);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3319
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3320 const char* os::exception_name(int exception_code, char* buf, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3321 if (0 < exception_code && exception_code <= SIGRTMAX) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3322 // signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3323 if (!signal_name(exception_code, buf, size)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3324 jio_snprintf(buf, size, "SIG%d", exception_code);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3325 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3326 return buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3327 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3328 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3329 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3330 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3331
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3332 // this is called _before_ the most of global arguments have been parsed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3333 void os::init(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3334 char dummy; /* used to get a guess on initial stack address */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3335 // first_hrtime = gethrtime();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3336
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3337 // With BsdThreads the JavaMain thread pid (primordial thread)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3338 // is different than the pid of the java launcher thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3339 // So, on Bsd, the launcher thread pid is passed to the VM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3340 // via the sun.java.launcher.pid property.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3341 // Use this property instead of getpid() if it was correctly passed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3342 // See bug 6351349.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3343 pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3344
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3345 _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3346
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3347 clock_tics_per_sec = CLK_TCK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3348
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3349 init_random(1234567);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3350
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3351 ThreadCritical::initialize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3352
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3353 Bsd::set_page_size(getpagesize());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3354 if (Bsd::page_size() == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3355 fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3356 strerror(errno)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3357 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3358 init_page_sizes((size_t) Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3359
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3360 Bsd::initialize_system_info();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3361
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3362 // main_thread points to the aboriginal thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3363 Bsd::_main_thread = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3364
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3365 Bsd::clock_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3366 initial_time_count = os::elapsed_counter();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3367
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3368 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3369 // XXXDARWIN
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3370 // Work around the unaligned VM callbacks in hotspot's
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3371 // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3372 // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3373 // alignment when doing symbol lookup. To work around this, we force early
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3374 // binding of all symbols now, thus binding when alignment is known-good.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3375 _dyld_bind_fully_image_containing_address((const void *) &os::init);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3376 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3377 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3378
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3379 // To install functions for atexit system call
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3380 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3381 static void perfMemory_exit_helper() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3382 perfMemory_exit();
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3386 // this is called _after_ the global arguments have been parsed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3387 jint os::init_2(void)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3388 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3389 // Allocate a single page and mark it as readable for safepoint polling
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3390 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
3391 guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3392
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3393 os::set_polling_page( polling_page );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3394
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3395 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3396 if(Verbose && PrintMiscellaneous)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3397 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3398 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3399
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3400 if (!UseMembar) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3401 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3402 guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3403 os::set_memory_serialize_page( mem_serialize_page );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3404
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3405 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3406 if(Verbose && PrintMiscellaneous)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3407 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3408 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3409 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3410
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3411 os::large_page_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3412
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3413 // initialize suspend/resume support - must do this before signal_sets_init()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3414 if (SR_initialize() != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3415 perror("SR_initialize failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3416 return JNI_ERR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3417 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3418
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3419 Bsd::signal_sets_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3420 Bsd::install_signal_handlers();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3421
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3422 // Check minimum allowable stack size for thread creation and to initialize
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3423 // the java system classes, including StackOverflowError - depends on page
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3424 // size. Add a page for compiler2 recursion in main thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3425 // Add in 2*BytesPerWord times page size to account for VM stack during
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3426 // class initialization depending on 32 or 64 bit VM.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3427 os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3428 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3429 2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3430
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3431 size_t threadStackSizeInBytes = ThreadStackSize * K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3432 if (threadStackSizeInBytes != 0 &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3433 threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3434 tty->print_cr("\nThe stack size specified is too small, "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3435 "Specify at least %dk",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3436 os::Bsd::min_stack_allowed/ K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3437 return JNI_ERR;
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 // Make the stack size a multiple of the page size so that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3441 // the yellow/red zones can be guarded.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3442 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3443 vm_page_size()));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3444
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3445 if (MaxFDLimit) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3446 // set the number of file descriptors to max. print out error
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3447 // if getrlimit/setrlimit fails but continue regardless.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3448 struct rlimit nbr_files;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3449 int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3450 if (status != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3451 if (PrintMiscellaneous && (Verbose || WizardMode))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3452 perror("os::init_2 getrlimit failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3453 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3454 nbr_files.rlim_cur = nbr_files.rlim_max;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3455
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3456 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3457 // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3458 // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3459 // be used instead
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3460 nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3461 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3462
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3463 status = setrlimit(RLIMIT_NOFILE, &nbr_files);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3464 if (status != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3465 if (PrintMiscellaneous && (Verbose || WizardMode))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3466 perror("os::init_2 setrlimit failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3467 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3468 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3469 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3470
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3471 // at-exit methods are called in the reverse order of their registration.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3472 // atexit functions are called on return from main or as a result of a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3473 // call to exit(3C). There can be only 32 of these functions registered
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3474 // and atexit() does not set errno.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3475
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3476 if (PerfAllowAtExitRegistration) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3477 // only register atexit functions if PerfAllowAtExitRegistration is set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3478 // atexit functions can be delayed until process exit time, which
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3479 // can be problematic for embedded VM situations. Embedded VMs should
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3480 // call DestroyJavaVM() to assure that VM resources are released.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3481
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3482 // note: perfMemory_exit_helper atexit function may be removed in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3483 // the future if the appropriate cleanup code can be added to the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3484 // VM_Exit VMOperation's doit method.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3485 if (atexit(perfMemory_exit_helper) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3486 warning("os::init2 atexit(perfMemory_exit_helper) failed");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3487 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3488 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3489
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3490 // initialize thread priority policy
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3491 prio_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3492
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3493 #ifdef __APPLE__
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3494 // dynamically link to objective c gc registration
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3495 void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3496 if (handleLibObjc != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3497 objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3498 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3499 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3500
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3501 return JNI_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3502 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3503
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3504 // this is called at the end of vm_initialization
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3505 void os::init_3(void) { }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3506
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3507 // Mark the polling page as unreadable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3508 void os::make_polling_page_unreadable(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3509 if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3510 fatal("Could not disable polling page");
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 // Mark the polling page as readable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3514 void os::make_polling_page_readable(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3515 if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3516 fatal("Could not enable polling page");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3517 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3518 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3519
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3520 int os::active_processor_count() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3521 return _processor_count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3522 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3523
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3524 void os::set_native_thread_name(const char *name) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3525 #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
3526 // This is only supported in Snow Leopard and beyond
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3527 if (name != NULL) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3528 // Add a "Java: " prefix to the name
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3529 char buf[MAXTHREADNAMESIZE];
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3530 snprintf(buf, sizeof(buf), "Java: %s", name);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3531 pthread_setname_np(buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3532 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3533 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3534 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3535
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3536 bool os::distribute_processes(uint length, uint* distribution) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3537 // Not yet implemented.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3538 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3539 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3540
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3541 bool os::bind_to_processor(uint processor_id) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3542 // Not yet implemented.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3543 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3544 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3545
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3546 ///
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3547
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3548 // Suspends the target using the signal mechanism and then grabs the PC before
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3549 // resuming the target. Used by the flat-profiler only
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3550 ExtendedPC os::get_thread_pc(Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3551 // Make sure that it is called by the watcher for the VMThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3552 assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3553 assert(thread->is_VM_thread(), "Can only be called for VMThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3554
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3555 ExtendedPC epc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3556
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3557 OSThread* osthread = thread->osthread();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3558 if (do_suspend(osthread)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3559 if (osthread->ucontext() != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3560 epc = os::Bsd::ucontext_get_pc(osthread->ucontext());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3561 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3562 // NULL context is unexpected, double-check this is the VMThread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3563 guarantee(thread->is_VM_thread(), "can only be called for VMThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3564 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3565 do_resume(osthread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3566 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3567 // failure means pthread_kill failed for some reason - arguably this is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3568 // a fatal problem, but such problems are ignored elsewhere
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3569
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3570 return epc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3571 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3572
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3573 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
3574 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3575 return pthread_cond_timedwait(_cond, _mutex, _abstime);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3576 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3577
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3578 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3579 // debug support
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3580
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3581 static address same_page(address x, address y) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3582 int page_bits = -os::vm_page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3583 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3584 return x;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3585 else if (x > y)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3586 return (address)(intptr_t(y) | ~page_bits) + 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3587 else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3588 return (address)(intptr_t(y) & page_bits);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3589 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3590
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3591 bool os::find(address addr, outputStream* st) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3592 Dl_info dlinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3593 memset(&dlinfo, 0, sizeof(dlinfo));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3594 if (dladdr(addr, &dlinfo)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3595 st->print(PTR_FORMAT ": ", addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3596 if (dlinfo.dli_sname != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3597 st->print("%s+%#x", dlinfo.dli_sname,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3598 addr - (intptr_t)dlinfo.dli_saddr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3599 } else if (dlinfo.dli_fname) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3600 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3601 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3602 st->print("<absolute address>");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3603 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3604 if (dlinfo.dli_fname) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3605 st->print(" in %s", dlinfo.dli_fname);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3606 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3607 if (dlinfo.dli_fbase) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3608 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3609 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3610 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3611
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3612 if (Verbose) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3613 // decode some bytes around the PC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3614 address begin = same_page(addr-40, addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3615 address end = same_page(addr+40, addr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3616 address lowest = (address) dlinfo.dli_sname;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3617 if (!lowest) lowest = (address) dlinfo.dli_fbase;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3618 if (begin < lowest) begin = lowest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3619 Dl_info dlinfo2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3620 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3621 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3622 end = (address) dlinfo2.dli_saddr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3623 Disassembler::decode(begin, end, st);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3624 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3625 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3626 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3627 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3628 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3629
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3630 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3631 // misc
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3632
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3633 // This does not do anything on Bsd. This is basically a hook for being
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3634 // able to use structured exception handling (thread-local exception filters)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3635 // on, e.g., Win32.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3636 void
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3637 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3638 JavaCallArguments* args, Thread* thread) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3639 f(value, method, args, thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3640 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3641
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3642 void os::print_statistics() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3643 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3644
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3645 int os::message_box(const char* title, const char* message) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3646 int i;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3647 fdStream err(defaultStream::error_fd());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3648 for (i = 0; i < 78; i++) err.print_raw("=");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3649 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3650 err.print_raw_cr(title);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3651 for (i = 0; i < 78; i++) err.print_raw("-");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3652 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3653 err.print_raw_cr(message);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3654 for (i = 0; i < 78; i++) err.print_raw("=");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3655 err.cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3656
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3657 char buf[16];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3658 // Prevent process from exiting upon "read error" without consuming all CPU
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3659 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3660
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3661 return buf[0] == 'y' || buf[0] == 'Y';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3662 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3663
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3664 int os::stat(const char *path, struct stat *sbuf) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3665 char pathbuf[MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3666 if (strlen(path) > MAX_PATH - 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3667 errno = ENAMETOOLONG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3668 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3669 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3670 os::native_path(strcpy(pathbuf, path));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3671 return ::stat(pathbuf, sbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3672 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3673
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3674 bool os::check_heap(bool force) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3675 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3676 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3677
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3678 int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3679 return ::vsnprintf(buf, count, format, args);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3680 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3681
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3682 // Is a (classpath) directory empty?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3683 bool os::dir_is_empty(const char* path) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3684 DIR *dir = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3685 struct dirent *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3686
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3687 dir = opendir(path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3688 if (dir == NULL) return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3689
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3690 /* Scan the directory */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3691 bool result = true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3692 char buf[sizeof(struct dirent) + MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3693 while (result && (ptr = ::readdir(dir)) != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3694 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3695 result = false;
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 closedir(dir);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3699 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3700 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3701
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3702 // This code originates from JDK's sysOpen and open64_w
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3703 // from src/solaris/hpi/src/system_md.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3704
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3705 #ifndef O_DELETE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3706 #define O_DELETE 0x10000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3707 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3708
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3709 // Open a file. Unlink the file immediately after open returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3710 // if the specified oflag has the O_DELETE flag set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3711 // 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
3712
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3713 int os::open(const char *path, int oflag, int mode) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3714
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3715 if (strlen(path) > MAX_PATH - 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3716 errno = ENAMETOOLONG;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3717 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3718 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3719 int fd;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3720 int o_delete = (oflag & O_DELETE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3721 oflag = oflag & ~O_DELETE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3722
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3723 fd = ::open(path, oflag, mode);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3724 if (fd == -1) return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3725
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3726 //If the open succeeded, the file might still be a directory
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3727 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3728 struct stat buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3729 int ret = ::fstat(fd, &buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3730 int st_mode = buf.st_mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3731
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3732 if (ret != -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3733 if ((st_mode & S_IFMT) == S_IFDIR) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3734 errno = EISDIR;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3735 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3736 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3737 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3738 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3739 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3740 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3741 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3742 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3743
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3744 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3745 * All file descriptors that are opened in the JVM and not
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3746 * specifically destined for a subprocess should have the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3747 * close-on-exec flag set. If we don't set it, then careless 3rd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3748 * party native code might fork and exec without closing all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3749 * appropriate file descriptors (e.g. as we do in closeDescriptors in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3750 * UNIXProcess.c), and this in turn might:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3751 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3752 * - cause end-of-file to fail to be detected on some file
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3753 * descriptors, resulting in mysterious hangs, or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3754 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3755 * - might cause an fopen in the subprocess to fail on a system
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3756 * suffering from bug 1085341.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3757 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3758 * (Yes, the default setting of the close-on-exec flag is a Unix
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3759 * design flaw)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3760 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3761 * See:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3762 * 1085341: 32-bit stdio routines should support file descriptors >255
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3763 * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3764 * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3765 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3766 #ifdef FD_CLOEXEC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3767 {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3768 int flags = ::fcntl(fd, F_GETFD);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3769 if (flags != -1)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3770 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3771 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3772 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3773
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3774 if (o_delete != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3775 ::unlink(path);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3776 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3777 return fd;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3778 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3779
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3780
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3781 // create binary file, rewriting existing file if required
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3782 int os::create_binary_file(const char* path, bool rewrite_existing) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3783 int oflags = O_WRONLY | O_CREAT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3784 if (!rewrite_existing) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3785 oflags |= O_EXCL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3786 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3787 return ::open(path, oflags, S_IREAD | S_IWRITE);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3788 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3789
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3790 // return current position of file pointer
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3791 jlong os::current_file_offset(int fd) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3792 return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3793 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3794
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3795 // move file pointer to the specified offset
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3796 jlong os::seek_to_file_offset(int fd, jlong offset) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3797 return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3798 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3799
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3800 // This code originates from JDK's sysAvailable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3801 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3802
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3803 int os::available(int fd, jlong *bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3804 jlong cur, end;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3805 int mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3806 struct stat buf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3807
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3808 if (::fstat(fd, &buf) >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3809 mode = buf.st_mode;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3810 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3811 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3812 * XXX: is the following call interruptible? If so, this might
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3813 * need to go through the INTERRUPT_IO() wrapper as for other
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3814 * blocking, interruptible calls in this file.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3815 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3816 int n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3817 if (::ioctl(fd, FIONREAD, &n) >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3818 *bytes = n;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3819 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3820 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3821 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3822 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3823 if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3824 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3825 } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3826 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3827 } else if (::lseek(fd, cur, SEEK_SET) == -1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3828 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3829 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3830 *bytes = end - cur;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3831 return 1;
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::socket_available(int fd, jint *pbytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3835 if (fd < 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3836 return OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3837
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3838 int ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3839
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3840 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3841
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3842 //%% note ioctl can return 0 when successful, JVM_SocketAvailable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3843 // is expected to return 0 on failure and 1 on success to the jdk.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3844
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3845 return (ret == OS_ERR) ? 0 : 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3846 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3847
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3848 // Map a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
3849 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
3850 char *addr, size_t bytes, bool read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3851 bool allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3852 int prot;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3853 int flags;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3854
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3855 if (read_only) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3856 prot = PROT_READ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3857 flags = MAP_SHARED;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3858 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3859 prot = PROT_READ | PROT_WRITE;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3860 flags = MAP_PRIVATE;
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 if (allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3864 prot |= PROT_EXEC;
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 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3868 flags |= MAP_FIXED;
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 char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3872 fd, file_offset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3873 if (mapped_address == MAP_FAILED) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3874 return NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3875 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3876 return mapped_address;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3877 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3878
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3879
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3880 // Remap a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
3881 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
3882 char *addr, size_t bytes, bool read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3883 bool allow_exec) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3884 // same as map_memory() on this OS
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3885 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3886 allow_exec);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3887 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3888
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3889
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3890 // Unmap a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
3891 bool os::pd_unmap_memory(char* addr, size_t bytes) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3892 return munmap(addr, bytes) == 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3893 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3894
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3895 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3896 // 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
3897 // of a thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3898 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3899 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3900 // the fast estimate available on the platform.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3901
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3902 jlong os::current_thread_cpu_time() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3903 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3904 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
3905 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3906 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3907 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3908 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3909 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3910
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3911 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
3912 #ifdef __APPLE__
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3913 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
3914 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3915 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3916 return 0;
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3917 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3918 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3919
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3920 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3921 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3922 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
3923 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3924 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3925 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3926 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3927 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3928
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3929 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3930 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3931 struct thread_basic_info tinfo;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3932 mach_msg_type_number_t tcount = THREAD_INFO_MAX;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3933 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
3934 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
3935
0368109684cb 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 4960
diff changeset
3936 mach_thread = thread->osthread()->thread_id();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3937 kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3938 if (kr != KERN_SUCCESS)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3939 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3940
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3941 if (user_sys_cpu_time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3942 jlong nanos;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3943 nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3944 nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3945 return nanos;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3946 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3947 return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3948 }
8689
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3949 #else
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3950 Unimplemented();
bf06968a8a00 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 8067
diff changeset
3951 return 0;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3952 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3953 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3954
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3955
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3956 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3957 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
3958 info_ptr->may_skip_backward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3959 info_ptr->may_skip_forward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3960 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3961 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3962
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3963 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3964 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
3965 info_ptr->may_skip_backward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3966 info_ptr->may_skip_forward = false; // elapsed time not wall time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3967 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
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 bool os::is_thread_cpu_time_supported() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3971 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3972 return true;
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6825
diff changeset
3973 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3974 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3975 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3976 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3977
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3978 // System loadavg support. Returns -1 if load average cannot be obtained.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3979 // Bsd doesn't yet have a (official) notion of processor sets,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3980 // so just return the system wide load average.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3981 int os::loadavg(double loadavg[], int nelem) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3982 return ::getloadavg(loadavg, nelem);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3983 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3984
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3985 void os::pause() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3986 char filename[MAX_PATH];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3987 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3988 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3989 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3990 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3991 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3992
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3993 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3994 if (fd != -1) {
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 ::close(fd);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3997 while (::stat(filename, &buf) == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3998 (void)::poll(NULL, 0, 100);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3999 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4000 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4001 jio_fprintf(stderr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4002 "Could not open pause file '%s', continuing immediately.\n", filename);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4003 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4004 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4005
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4006
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4007 // Refer to the comments in os_solaris.cpp park-unpark.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4008 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4009 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4010 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4011 // For specifics regarding the bug see GLIBC BUGID 261237 :
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4012 // http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4013 // 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
4014 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4015 // 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
4016 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4017 // 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
4018 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4019 // of libpthread avoids the problem, but isn't practical.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4020 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4021 // Possible remedies:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4022 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4023 // 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4024 // This is palliative and probabilistic, however. If the thread is preempted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4025 // between the call to compute_abstime() and pthread_cond_timedwait(), more
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4026 // 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
4027 // past) resultin in a hang. Using this technique reduces the odds of a hang
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4028 // but the JVM is still vulnerable, particularly on heavily loaded systems.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4029 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4030 // 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4031 // 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
4032 // NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4033 // reduces to poll()+read(). This works well, but consumes 2 FDs per extant
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4034 // thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4035 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4036 // 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4037 // that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4038 // a timeout request to the chron thread and then blocking via pthread_cond_wait().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4039 // This also works well. In fact it avoids kernel-level scalability impediments
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4040 // on certain platforms that don't handle lots of active pthread_cond_timedwait()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4041 // timers in a graceful fashion.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4042 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4043 // 4. When the abstime value is in the past it appears that control returns
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4044 // correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4045 // Subsequent timedwait/wait calls may hang indefinitely. Given that, we
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4046 // can avoid the problem by reinitializing the condvar -- by cond_destroy()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4047 // followed by cond_init() -- after all calls to pthread_cond_timedwait().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4048 // It may be possible to avoid reinitialization by checking the return
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4049 // value from pthread_cond_timedwait(). In addition to reinitializing the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4050 // condvar we must establish the invariant that cond_signal() is only called
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4051 // within critical sections protected by the adjunct mutex. This prevents
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4052 // cond_signal() from "seeing" a condvar that's in the midst of being
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4053 // reinitialized or that is corrupt. Sadly, this invariant obviates the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4054 // desirable signal-after-unlock optimization that avoids futile context switching.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4055 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4056 // I'm also concerned that some versions of NTPL might allocate an auxilliary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4057 // structure when a condvar is used or initialized. cond_destroy() would
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4058 // release the helper structure. Our reinitialize-after-timedwait fix
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4059 // put excessive stress on malloc/free and locks protecting the c-heap.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4060 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4061 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4062 // It may be possible to refine (4) by checking the kernel and NTPL verisons
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4063 // and only enabling the work-around for vulnerable environments.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4064
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4065 // utility to compute the abstime argument to timedwait:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4066 // millis is the relative timeout time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4067 // abstime will be the absolute timeout time
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4068 // TODO: replace compute_abstime() with unpackTime()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4069
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4070 static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4071 if (millis < 0) millis = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4072 struct timeval now;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4073 int status = gettimeofday(&now, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4074 assert(status == 0, "gettimeofday");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4075 jlong seconds = millis / 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4076 millis %= 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4077 if (seconds > 50000000) { // see man cond_timedwait(3T)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4078 seconds = 50000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4079 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4080 abstime->tv_sec = now.tv_sec + seconds;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4081 long usec = now.tv_usec + millis * 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4082 if (usec >= 1000000) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4083 abstime->tv_sec += 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4084 usec -= 1000000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4085 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4086 abstime->tv_nsec = usec * 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4087 return abstime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4088 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4089
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4090
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4091 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4092 // Conceptually TryPark() should be equivalent to park(0).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4093
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4094 int os::PlatformEvent::TryPark() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4095 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4096 const int v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4097 guarantee ((v == 0) || (v == 1), "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4098 if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4099 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4100 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4101
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4102 void os::PlatformEvent::park() { // AKA "down()"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4103 // Invariant: Only the thread associated with the Event/PlatformEvent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4104 // may call park().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4105 // TODO: assert that _Assoc != NULL or _Assoc == Self
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4106 int v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4107 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4108 v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4109 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4110 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4111 guarantee (v >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4112 if (v == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4113 // Do this the hard way by blocking ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4114 int status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4115 assert_status(status == 0, status, "mutex_lock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4116 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4117 ++ _nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4118 while (_Event < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4119 status = pthread_cond_wait(_cond, _mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4120 // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4121 // Treat this the same as if the wait was interrupted
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4122 if (status == ETIMEDOUT) { status = EINTR; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4123 assert_status(status == 0 || status == EINTR, status, "cond_wait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4124 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4125 -- _nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4126
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4127 _Event = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4128 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4129 assert_status(status == 0, status, "mutex_unlock");
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4130 // 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
4131 // correctly with each other.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4132 OrderAccess::fence();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4133 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4134 guarantee (_Event >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4135 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4136
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4137 int os::PlatformEvent::park(jlong millis) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4138 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4139
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4140 int v ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4141 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4142 v = _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4143 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4144 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4145 guarantee (v >= 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4146 if (v != 0) return OS_OK ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4147
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4148 // We do this the hard way, by blocking the thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4149 // Consider enforcing a minimum timeout value.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4150 struct timespec abst;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4151 compute_abstime(&abst, millis);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4152
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4153 int ret = OS_TIMEOUT;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4154 int status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4155 assert_status(status == 0, status, "mutex_lock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4156 guarantee (_nParked == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4157 ++_nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4158
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4159 // Object.wait(timo) will return because of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4160 // (a) notification
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4161 // (b) timeout
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4162 // (c) thread.interrupt
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4163 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4164 // Thread.interrupt and object.notify{All} both call Event::set.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4165 // That is, we treat thread.interrupt as a special case of notification.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4166 // The underlying Solaris implementation, cond_timedwait, admits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4167 // spurious/premature wakeups, but the JLS/JVM spec prevents the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4168 // JVM from making those visible to Java code. As such, we must
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4169 // filter out spurious wakeups. We assume all ETIME returns are valid.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4170 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4171 // TODO: properly differentiate simultaneous notify+interrupt.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4172 // In that case, we should propagate the notify to another waiter.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4173
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4174 while (_Event < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4175 status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4176 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4177 pthread_cond_destroy (_cond);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4178 pthread_cond_init (_cond, NULL) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4179 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4180 assert_status(status == 0 || status == EINTR ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4181 status == ETIMEDOUT,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4182 status, "cond_timedwait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4183 if (!FilterSpuriousWakeups) break ; // previous semantics
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4184 if (status == ETIMEDOUT) break ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4185 // We consume and ignore EINTR and spurious wakeups.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4186 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4187 --_nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4188 if (_Event >= 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4189 ret = OS_OK;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4190 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4191 _Event = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4192 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4193 assert_status(status == 0, status, "mutex_unlock");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4194 assert (_nParked == 0, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4195 // 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
4196 // correctly with each other.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4197 OrderAccess::fence();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4198 return ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4199 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4200
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4201 void os::PlatformEvent::unpark() {
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4202 // Transitions for _Event:
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4203 // 0 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4204 // 1 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4205 // -1 :=> either 0 or 1; must signal target thread
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4206 // 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
4207 // 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
4208 // unpark() calls.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4209 // See also: "Semaphores in Plan 9" by Mullender & Cox
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4210 //
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4211 // 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
4212 // 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
4213 // 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
4214 // 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
4215 // 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
4216
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4217 if (Atomic::xchg(1, &_Event) >= 0) return;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4218
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4219 // 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
4220 int status = pthread_mutex_lock(_mutex);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4221 assert_status(status == 0, status, "mutex_lock");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4222 int AnyWaiters = _nParked;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4223 assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4224 if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4225 AnyWaiters = 0;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4226 pthread_cond_signal(_cond);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4227 }
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4228 status = pthread_mutex_unlock(_mutex);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4229 assert_status(status == 0, status, "mutex_unlock");
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4230 if (AnyWaiters != 0) {
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4231 status = pthread_cond_signal(_cond);
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4232 assert_status(status == 0, status, "cond_signal");
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4233 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4234
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4235 // Note that we signal() _after dropping the lock for "immortal" Events.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4236 // This is safe and avoids a common class of futile wakeups. In rare
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4237 // circumstances this can cause a thread to return prematurely from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4238 // cond_{timed}wait() but the spurious wakeup is benign and the victim will
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4239 // simply re-test the condition and re-park itself.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4240 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4241
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4242
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4243 // JSR166
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4244 // -------------------------------------------------------
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4245
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4246 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4247 * The solaris and bsd implementations of park/unpark are fairly
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4248 * conservative for now, but can be improved. They currently use a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4249 * mutex/condvar pair, plus a a count.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4250 * Park decrements count if > 0, else does a condvar wait. Unpark
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4251 * sets count to 1 and signals condvar. Only one thread ever waits
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4252 * on the condvar. Contention seen when trying to park implies that someone
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4253 * is unparking you, so don't wait. And spurious returns are fine, so there
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4254 * is no need to track notifications.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4255 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4256
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4257 #define MAX_SECS 100000000
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4258 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4259 * This code is common to bsd and solaris and will be moved to a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4260 * common place in dolphin.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4261 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4262 * The passed in time value is either a relative time in nanoseconds
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4263 * or an absolute time in milliseconds. Either way it has to be unpacked
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4264 * into suitable seconds and nanoseconds components and stored in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4265 * given timespec structure.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4266 * 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
4267 * 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
4268 * overflow if times way in the future are given. Further on Solaris versions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4269 * prior to 10 there is a restriction (see cond_timedwait) that the specified
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4270 * number of seconds, in abstime, is less than current_time + 100,000,000.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4271 * As it will be 28 years before "now + 100000000" will overflow we can
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4272 * ignore overflow and just impose a hard-limit on seconds using the value
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4273 * 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
4274 * years from "now".
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4275 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4276
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4277 static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4278 assert (time > 0, "convertTime");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4279
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4280 struct timeval now;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4281 int status = gettimeofday(&now, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4282 assert(status == 0, "gettimeofday");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4283
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4284 time_t max_secs = now.tv_sec + MAX_SECS;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4285
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4286 if (isAbsolute) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4287 jlong secs = time / 1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4288 if (secs > max_secs) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4289 absTime->tv_sec = max_secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4290 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4291 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4292 absTime->tv_sec = secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4293 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4294 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4295 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4296 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4297 jlong secs = time / NANOSECS_PER_SEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4298 if (secs >= MAX_SECS) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4299 absTime->tv_sec = max_secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4300 absTime->tv_nsec = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4301 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4302 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4303 absTime->tv_sec = now.tv_sec + secs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4304 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4305 if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4306 absTime->tv_nsec -= NANOSECS_PER_SEC;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4307 ++absTime->tv_sec; // note: this must be <= max_secs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4308 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4309 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4310 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4311 assert(absTime->tv_sec >= 0, "tv_sec < 0");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4312 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4313 assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4314 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4315 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4316
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4317 void Parker::park(bool isAbsolute, jlong time) {
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4318 // Ideally we'd do something useful while spinning, such
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4319 // as calling unpackTime().
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4320
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4321 // Optional fast-path check:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4322 // Return immediately if a permit is available.
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4323 // We depend on Atomic::xchg() having full barrier semantics
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4324 // 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
4325 if (Atomic::xchg(0, &_counter) > 0) return;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4326
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4327 Thread* thread = Thread::current();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4328 assert(thread->is_Java_thread(), "Must be JavaThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4329 JavaThread *jt = (JavaThread *)thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4330
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4331 // Optional optimization -- avoid state transitions if there's an interrupt pending.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4332 // Check interrupt before trying to wait
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4333 if (Thread::is_interrupted(thread, false)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4334 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4335 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4336
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4337 // Next, demultiplex/decode time arguments
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4338 struct timespec absTime;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4339 if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4340 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4341 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4342 if (time > 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4343 unpackTime(&absTime, isAbsolute, time);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4344 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4345
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4346
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4347 // Enter safepoint region
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4348 // Beware of deadlocks such as 6317397.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4349 // The per-thread Parker:: mutex is a classic leaf-lock.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4350 // In particular a thread must never block on the Threads_lock while
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4351 // holding the Parker:: mutex. If safepoints are pending both the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4352 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4353 ThreadBlockInVM tbivm(jt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4354
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4355 // Don't wait if cannot get lock since interference arises from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4356 // unblocking. Also. check interrupt before trying wait
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4357 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4358 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4359 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4360
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4361 int status ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4362 if (_counter > 0) { // no wait needed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4363 _counter = 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4364 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4365 assert (status == 0, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4366 // 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
4367 // correctly with each other and Java-level accesses.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4368 OrderAccess::fence();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4369 return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4370 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4371
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4372 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4373 // Don't catch signals while blocked; let the running threads have the signals.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4374 // (This allows a debugger to break into the running thread.)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4375 sigset_t oldsigs;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4376 sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4377 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4378 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4379
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4380 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4381 jt->set_suspend_equivalent();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4382 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4383
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4384 if (time == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4385 status = pthread_cond_wait (_cond, _mutex) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4386 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4387 status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4388 if (status != 0 && WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4389 pthread_cond_destroy (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4390 pthread_cond_init (_cond, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4391 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4392 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4393 assert_status(status == 0 || status == EINTR ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4394 status == ETIMEDOUT,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4395 status, "cond_timedwait");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4396
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4397 #ifdef ASSERT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4398 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4399 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4400
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4401 _counter = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4402 status = pthread_mutex_unlock(_mutex) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4403 assert_status(status == 0, status, "invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4404 // 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
4405 // correctly with each other and Java-level accesses.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4406 OrderAccess::fence();
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7626
diff changeset
4407
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4408 // If externally suspended while waiting, re-suspend
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4409 if (jt->handle_special_suspend_equivalent_condition()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4410 jt->java_suspend_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4411 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4412 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4413
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4414 void Parker::unpark() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4415 int s, status ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4416 status = pthread_mutex_lock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4417 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4418 s = _counter;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4419 _counter = 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4420 if (s < 1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4421 if (WorkAroundNPTLTimedWaitHang) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4422 status = pthread_cond_signal (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4423 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4424 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4425 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4426 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4427 status = pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4428 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4429 status = pthread_cond_signal (_cond) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4430 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4431 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4432 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4433 pthread_mutex_unlock(_mutex);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4434 assert (status == 0, "invariant") ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4435 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4436 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4437
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4438
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4439 /* Darwin has no "environ" in a dynamic library. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4440 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4441 #include <crt_externs.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4442 #define environ (*_NSGetEnviron())
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4443 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4444 extern char** environ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4445 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4446
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4447 // Run the specified command in a separate process. Return its exit value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4448 // or -1 on failure (e.g. can't fork a new process).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4449 // Unlike system(), this function can be called from signal handler. It
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4450 // doesn't block SIGINT et al.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4451 int os::fork_and_exec(char* cmd) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4452 const char * argv[4] = {"sh", "-c", cmd, NULL};
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4453
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4454 // fork() in BsdThreads/NPTL is not async-safe. It needs to run
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4455 // pthread_atfork handlers and reset pthread library. All we need is a
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4456 // separate process to execve. Make a direct syscall to fork process.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4457 // 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
4458 // the best...
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4459 pid_t pid = fork();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4460
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4461 if (pid < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4462 // fork failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4463 return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4464
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4465 } else if (pid == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4466 // child process
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4467
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4468 // execve() in BsdThreads will call pthread_kill_other_threads_np()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4469 // first to kill every thread on the thread list. Because this list is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4470 // not reset by fork() (see notes above), execve() will instead kill
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4471 // every thread in the parent process. We know this is the only thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4472 // in the new process, so make a system call directly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4473 // IA64 should use normal execve() from glibc to match the glibc fork()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4474 // above.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4475 execve("/bin/sh", (char* const*)argv, environ);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4476
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4477 // execve failed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4478 _exit(-1);
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 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4482 // care about the actual exit code, for now.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4483
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4484 int status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4485
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4486 // Wait for the child process to exit. This returns immediately if
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4487 // the child has already exited. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4488 while (waitpid(pid, &status, 0) < 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4489 switch (errno) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4490 case ECHILD: return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4491 case EINTR: break;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4492 default: return -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4493 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4494 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4495
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4496 if (WIFEXITED(status)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4497 // The child exited normally; get its exit code.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4498 return WEXITSTATUS(status);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4499 } else if (WIFSIGNALED(status)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4500 // The child exited because of a signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4501 // The best value to return is 0x80 + signal number,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4502 // because that is what all Unix shells do, and because
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4503 // it allows callers to distinguish between process exit and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4504 // process death by signal.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4505 return 0x80 + WTERMSIG(status);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4506 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4507 // Unknown exit code; pass it through
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4508 return status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4509 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4510 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4511 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4512
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4513 // is_headless_jre()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4514 //
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4515 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4516 // in order to report if we are running in a headless jre
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4517 //
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4518 // 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
4519 // 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
4520 //
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4521 bool os::is_headless_jre() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4522 struct stat statbuf;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4523 char buf[MAXPATHLEN];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4524 char libmawtpath[MAXPATHLEN];
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4525 const char *xawtstr = "/xawt/libmawt" JNI_LIB_SUFFIX;
5921
fdf4deca44ec 7152206: anti-delta the fix for 7152031
dcubed
parents: 5920
diff changeset
4526 const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4527 char *p;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4528
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4529 // Get path to libjvm.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4530 os::jvm_path(buf, sizeof(buf));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4531
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4532 // Get rid of libjvm.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4533 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4534 if (p == NULL) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4535 else *p = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4536
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4537 // Get rid of client or server
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4538 p = strrchr(buf, '/');
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4539 if (p == NULL) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4540 else *p = '\0';
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4541
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4542 // check xawt/libmawt.so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4543 strcpy(libmawtpath, buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4544 strcat(libmawtpath, xawtstr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4545 if (::stat(libmawtpath, &statbuf) == 0) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4546
4082
36b057451829 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 4006
diff changeset
4547 // check libawt_xawt.so
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4548 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
4549 strcat(libmawtpath, new_xawtstr);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4550 if (::stat(libmawtpath, &statbuf) == 0) return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4551
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4552 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4553 }
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4554
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4555 // Get the default path to the core file
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4556 // Returns the length of the string
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4557 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
4558 int n = jio_snprintf(buffer, bufferSize, "/cores");
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4559
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4560 // Truncate if theoretical string was longer than bufferSize
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4561 n = MIN2(n, (int)bufferSize);
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4562
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4563 return n;
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
4564 }