annotate src/os/posix/vm/os_posix.cpp @ 14478:bb9356ec5967

Merge
author hseigel
date Sun, 23 Feb 2014 13:16:03 -0500
parents 6c9332549827 8a9bb7821e28
children 4ca6dc0799b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
1 /*
14478
hseigel
parents: 14475 14460
diff changeset
2 * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
4 *
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
7 * published by the Free Software Foundation.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
8 *
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
13 * accompanied this code).
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
14 *
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
15 * You should have received a copy of the GNU General Public License version
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
18 *
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
21 * questions.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
22 *
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
23 */
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
24
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
25 #include "utilities/globalDefinitions.hpp"
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
26 #include "prims/jvm.h"
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
27 #include "runtime/frame.inline.hpp"
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
28 #include "runtime/interfaceSupport.hpp"
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
29 #include "runtime/os.hpp"
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
30 #include "utilities/vmError.hpp"
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
31
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
32 #include <signal.h>
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
33 #include <unistd.h>
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
34 #include <sys/resource.h>
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
35 #include <sys/utsname.h>
12141
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
36 #include <pthread.h>
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
37 #include <signal.h>
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
38
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
39 // Todo: provide a os::get_max_process_id() or similar. Number of processes
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
40 // may have been configured, can be read more accurately from proc fs etc.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
41 #ifndef MAX_PID
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
42 #define MAX_PID INT_MAX
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
43 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
44 #define IS_VALID_PID(p) (p > 0 && p < MAX_PID)
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
45
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
46 // Check core dump limit and report possible place where core can be found
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
47 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
48 int n;
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
49 struct rlimit rlim;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
50 bool success;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
51
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
52 n = get_core_path(buffer, bufferSize);
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
53
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
54 if (getrlimit(RLIMIT_CORE, &rlim) != 0) {
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
55 jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (may not exist)", current_process_id());
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
56 success = true;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
57 } else {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
58 switch(rlim.rlim_cur) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
59 case RLIM_INFINITY:
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
60 jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d", current_process_id());
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
61 success = true;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
62 break;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
63 case 0:
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
64 jio_snprintf(buffer, bufferSize, "Core dumps have been disabled. To enable core dumping, try \"ulimit -c unlimited\" before starting Java again");
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
65 success = false;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
66 break;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
67 default:
6200
65906dc96aa1 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 6197
diff changeset
68 jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", current_process_id(), (unsigned long)(rlim.rlim_cur >> 10));
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
69 success = true;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
70 break;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
71 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
72 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
73 VMError::report_coredump_status(buffer, success);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
74 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents:
diff changeset
75
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
76 address os::get_caller_pc(int n) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
77 #ifdef _NMT_NOINLINE_
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
78 n ++;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
79 #endif
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
80 frame fr = os::current_frame();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
81 while (n > 0 && fr.pc() &&
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
82 !os::is_first_C_frame(&fr) && fr.sender_pc()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
83 fr = os::get_sender_for_C_frame(&fr);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
84 n --;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
85 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
86 if (n == 0) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
87 return fr.pc();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
88 } else {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
89 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
90 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
91 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
92
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 2302
diff changeset
93 int os::get_last_error() {
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 2302
diff changeset
94 return errno;
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 2302
diff changeset
95 }
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 2302
diff changeset
96
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
97 bool os::is_debugger_attached() {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
98 // not implemented
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
99 return false;
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
100 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
101
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
102 void os::wait_for_keypress_at_exit(void) {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
103 // don't do anything on posix platforms
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
104 return;
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2204
diff changeset
105 }
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
106
7433
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
107 // Multiple threads can race in this code, and can remap over each other with MAP_FIXED,
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
108 // so on posix, unmap the section at the start and at the end of the chunk that we mapped
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
109 // rather than unmapping and remapping the whole chunk to get requested alignment.
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
110 char* os::reserve_memory_aligned(size_t size, size_t alignment) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
111 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0,
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
112 "Alignment must be a multiple of allocation granularity (page size)");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
113 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
114
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
115 size_t extra_size = size + alignment;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
116 assert(extra_size >= size, "overflow, size is too large to allow alignment");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
117
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
118 char* extra_base = os::reserve_memory(extra_size, NULL, alignment);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
119
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
120 if (extra_base == NULL) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
121 return NULL;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
122 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
123
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
124 // Do manual alignment
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
125 char* aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
126
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
127 // [ | | ]
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
128 // ^ extra_base
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
129 // ^ extra_base + begin_offset == aligned_base
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
130 // extra_base + begin_offset + size ^
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
131 // extra_base + extra_size ^
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
132 // |<>| == begin_offset
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
133 // end_offset == |<>|
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
134 size_t begin_offset = aligned_base - extra_base;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
135 size_t end_offset = (extra_base + extra_size) - (aligned_base + size);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
136
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
137 if (begin_offset > 0) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
138 os::release_memory(extra_base, begin_offset);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
139 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
140
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
141 if (end_offset > 0) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
142 os::release_memory(extra_base + begin_offset + size, end_offset);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
143 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
144
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
145 return aligned_base;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
146 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 6842
diff changeset
147
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
148 void os::Posix::print_load_average(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
149 st->print("load average:");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
150 double loadavg[3];
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
151 os::loadavg(loadavg, 3);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
152 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
153 st->cr();
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
154 }
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
155
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
156 void os::Posix::print_rlimit_info(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
157 st->print("rlimit:");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
158 struct rlimit rlim;
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
159
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
160 st->print(" STACK ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
161 getrlimit(RLIMIT_STACK, &rlim);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
162 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
163 else st->print("%uk", rlim.rlim_cur >> 10);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
164
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
165 st->print(", CORE ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
166 getrlimit(RLIMIT_CORE, &rlim);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
167 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
168 else st->print("%uk", rlim.rlim_cur >> 10);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
169
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
170 // Isn't there on solaris
14412
kvn
parents: 14411 12117
diff changeset
171 #if !defined(TARGET_OS_FAMILY_solaris) && !defined(TARGET_OS_FAMILY_aix)
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
172 st->print(", NPROC ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
173 getrlimit(RLIMIT_NPROC, &rlim);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
174 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
175 else st->print("%d", rlim.rlim_cur);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
176 #endif
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
177
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
178 st->print(", NOFILE ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
179 getrlimit(RLIMIT_NOFILE, &rlim);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
180 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
181 else st->print("%d", rlim.rlim_cur);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
182
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
183 st->print(", AS ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
184 getrlimit(RLIMIT_AS, &rlim);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
185 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
186 else st->print("%uk", rlim.rlim_cur >> 10);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
187 st->cr();
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
188 }
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
189
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
190 void os::Posix::print_uname_info(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
191 // kernel
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
192 st->print("uname:");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
193 struct utsname name;
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
194 uname(&name);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
195 st->print(name.sysname); st->print(" ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
196 st->print(name.release); st->print(" ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
197 st->print(name.version); st->print(" ");
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
198 st->print(name.machine);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
199 st->cr();
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
200 }
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
201
8854
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
202 bool os::has_allocatable_memory_limit(julong* limit) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
203 struct rlimit rlim;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
204 int getrlimit_res = getrlimit(RLIMIT_AS, &rlim);
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
205 // if there was an error when calling getrlimit, assume that there is no limitation
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
206 // on virtual memory.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
207 bool result;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
208 if ((getrlimit_res != 0) || (rlim.rlim_cur == RLIM_INFINITY)) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
209 result = false;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
210 } else {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
211 *limit = (julong)rlim.rlim_cur;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
212 result = true;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
213 }
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
214 #ifdef _LP64
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
215 return result;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
216 #else
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
217 // arbitrary virtual space limit for 32 bit Unices found by testing. If
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
218 // getrlimit above returned a limit, bound it with this limit. Otherwise
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
219 // directly use it.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
220 const julong max_virtual_limit = (julong)3800*M;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
221 if (result) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
222 *limit = MIN2(*limit, max_virtual_limit);
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
223 } else {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
224 *limit = max_virtual_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
225 }
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 4750
diff changeset
226
8854
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
227 // bound by actually allocatable memory. The algorithm uses two bounds, an
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
228 // upper and a lower limit. The upper limit is the current highest amount of
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
229 // memory that could not be allocated, the lower limit is the current highest
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
230 // amount of memory that could be allocated.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
231 // The algorithm iteratively refines the result by halving the difference
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
232 // between these limits, updating either the upper limit (if that value could
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
233 // not be allocated) or the lower limit (if the that value could be allocated)
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
234 // until the difference between these limits is "small".
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
235
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
236 // the minimum amount of memory we care about allocating.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
237 const julong min_allocation_size = M;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
238
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
239 julong upper_limit = *limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
240
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
241 // first check a few trivial cases
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
242 if (is_allocatable(upper_limit) || (upper_limit <= min_allocation_size)) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
243 *limit = upper_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
244 } else if (!is_allocatable(min_allocation_size)) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
245 // we found that not even min_allocation_size is allocatable. Return it
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
246 // anyway. There is no point to search for a better value any more.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
247 *limit = min_allocation_size;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
248 } else {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
249 // perform the binary search.
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
250 julong lower_limit = min_allocation_size;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
251 while ((upper_limit - lower_limit) > min_allocation_size) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
252 julong temp_limit = ((upper_limit - lower_limit) / 2) + lower_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
253 temp_limit = align_size_down_(temp_limit, min_allocation_size);
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
254 if (is_allocatable(temp_limit)) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
255 lower_limit = temp_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
256 } else {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
257 upper_limit = temp_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
258 }
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
259 }
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
260 *limit = lower_limit;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
261 }
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
262 return true;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
263 #endif
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 7433
diff changeset
264 }
10195
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
265
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
266 const char* os::get_current_directory(char *buf, size_t buflen) {
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
267 return getcwd(buf, buflen);
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
268 }
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
269
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
270 FILE* os::open(int fd, const char* mode) {
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
271 return ::fdopen(fd, mode);
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 8854
diff changeset
272 }
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
273
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
274 // Builds a platform dependent Agent_OnLoad_<lib_name> function name
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
275 // which is used to find statically linked in agents.
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
276 // Parameters:
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
277 // sym_name: Symbol in library we are looking for
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
278 // lib_name: Name of library to look in, NULL for shared libs.
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
279 // is_absolute_path == true if lib_name is absolute path to agent
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
280 // such as "/a/b/libL.so"
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
281 // == false if only the base name of the library is passed in
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
282 // such as "L"
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
283 char* os::build_agent_function_name(const char *sym_name, const char *lib_name,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
284 bool is_absolute_path) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
285 char *agent_entry_name;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
286 size_t len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
287 size_t name_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
288 size_t prefix_len = strlen(JNI_LIB_PREFIX);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
289 size_t suffix_len = strlen(JNI_LIB_SUFFIX);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
290 const char *start;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
291
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
292 if (lib_name != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
293 len = name_len = strlen(lib_name);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
294 if (is_absolute_path) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
295 // Need to strip path, prefix and suffix
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
296 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
297 lib_name = ++start;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
298 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
299 if (len <= (prefix_len + suffix_len)) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
300 return NULL;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
301 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
302 lib_name += prefix_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
303 name_len = strlen(lib_name) - suffix_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
304 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
305 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
306 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
307 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
308 if (agent_entry_name == NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
309 return NULL;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
310 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
311 strcpy(agent_entry_name, sym_name);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
312 if (lib_name != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
313 strcat(agent_entry_name, "_");
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
314 strncat(agent_entry_name, lib_name, name_len);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
315 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
316 return agent_entry_name;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
317 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11151
diff changeset
318
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
319 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
320 assert(thread == Thread::current(), "thread consistency check");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
321
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
322 ParkEvent * const slp = thread->_SleepEvent ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
323 slp->reset() ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
324 OrderAccess::fence() ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
325
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
326 if (interruptible) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
327 jlong prevtime = javaTimeNanos();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
328
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
329 for (;;) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
330 if (os::is_interrupted(thread, true)) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
331 return OS_INTRPT;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
332 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
333
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
334 jlong newtime = javaTimeNanos();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
335
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
336 if (newtime - prevtime < 0) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
337 // time moving backwards, should only happen if no monotonic clock
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
338 // not a guarantee() because JVM should not abort on kernel/glibc bugs
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
339 assert(!os::supports_monotonic_clock(), "unexpected time moving backwards detected in os::sleep(interruptible)");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
340 } else {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
341 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
342 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
343
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
344 if (millis <= 0) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
345 return OS_OK;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
346 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
347
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
348 prevtime = newtime;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
349
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
350 {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
351 assert(thread->is_Java_thread(), "sanity check");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
352 JavaThread *jt = (JavaThread *) thread;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
353 ThreadBlockInVM tbivm(jt);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
354 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
355
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
356 jt->set_suspend_equivalent();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
357 // cleared by handle_special_suspend_equivalent_condition() or
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
358 // java_suspend_self() via check_and_wait_while_suspended()
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
359
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
360 slp->park(millis);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
361
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
362 // were we externally suspended while we were waiting?
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
363 jt->check_and_wait_while_suspended();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
364 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
365 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
366 } else {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
367 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
368 jlong prevtime = javaTimeNanos();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
369
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
370 for (;;) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
371 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
372 // the 1st iteration ...
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
373 jlong newtime = javaTimeNanos();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
374
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
375 if (newtime - prevtime < 0) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
376 // time moving backwards, should only happen if no monotonic clock
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
377 // not a guarantee() because JVM should not abort on kernel/glibc bugs
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
378 assert(!os::supports_monotonic_clock(), "unexpected time moving backwards detected on os::sleep(!interruptible)");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
379 } else {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
380 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
381 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
382
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
383 if (millis <= 0) break ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
384
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
385 prevtime = newtime;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
386 slp->park(millis);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
387 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
388 return OS_OK ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
389 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
390 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
391
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
392 ////////////////////////////////////////////////////////////////////////////////
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
393 // interrupt support
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
394
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
395 void os::interrupt(Thread* thread) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
396 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
397 "possibility of dangling Thread pointer");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
398
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
399 OSThread* osthread = thread->osthread();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
400
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
401 if (!osthread->interrupted()) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
402 osthread->set_interrupted(true);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
403 // More than one thread can get here with the same value of osthread,
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
404 // resulting in multiple notifications. We do, however, want the store
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
405 // to interrupted() to be visible to other threads before we execute unpark().
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
406 OrderAccess::fence();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
407 ParkEvent * const slp = thread->_SleepEvent ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
408 if (slp != NULL) slp->unpark() ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
409 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
410
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
411 // For JSR166. Unpark even if interrupt status already was set
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
412 if (thread->is_Java_thread())
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
413 ((JavaThread*)thread)->parker()->unpark();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
414
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
415 ParkEvent * ev = thread->_ParkEvent ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
416 if (ev != NULL) ev->unpark() ;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
417
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
418 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
419
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
420 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
421 assert(Thread::current() == thread || Threads_lock->owned_by_self(),
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
422 "possibility of dangling Thread pointer");
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
423
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
424 OSThread* osthread = thread->osthread();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
425
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
426 bool interrupted = osthread->interrupted();
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
427
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
428 // NOTE that since there is no "lock" around the interrupt and
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
429 // is_interrupted operations, there is the possibility that the
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
430 // interrupted flag (in osThread) will be "false" but that the
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
431 // low-level events will be in the signaled state. This is
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
432 // intentional. The effect of this is that Object.wait() and
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
433 // LockSupport.park() will appear to have a spurious wakeup, which
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
434 // is allowed and not harmful, and the possibility is so rare that
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
435 // it is not worth the added complexity to add yet another lock.
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
436 // For the sleep event an explicit reset is performed on entry
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
437 // to os::sleep, so there is no early return. It has also been
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
438 // recommended not to put the interrupted flag into the "event"
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
439 // structure because it hides the issue.
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
440 if (interrupted && clear_interrupted) {
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
441 osthread->set_interrupted(false);
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
442 // consider thread->_SleepEvent->reset() ... optional optimization
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
443 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
444
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
445 return interrupted;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
446 }
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14286
diff changeset
447
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
448 // Returned string is a constant. For unknown signals "UNKNOWN" is returned.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
449 const char* os::Posix::get_signal_name(int sig, char* out, size_t outlen) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
450
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
451 static const struct {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
452 int sig; const char* name;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
453 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
454 info[] =
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
455 {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
456 { SIGABRT, "SIGABRT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
457 #ifdef SIGAIO
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
458 { SIGAIO, "SIGAIO" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
459 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
460 { SIGALRM, "SIGALRM" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
461 #ifdef SIGALRM1
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
462 { SIGALRM1, "SIGALRM1" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
463 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
464 { SIGBUS, "SIGBUS" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
465 #ifdef SIGCANCEL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
466 { SIGCANCEL, "SIGCANCEL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
467 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
468 { SIGCHLD, "SIGCHLD" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
469 #ifdef SIGCLD
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
470 { SIGCLD, "SIGCLD" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
471 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
472 { SIGCONT, "SIGCONT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
473 #ifdef SIGCPUFAIL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
474 { SIGCPUFAIL, "SIGCPUFAIL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
475 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
476 #ifdef SIGDANGER
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
477 { SIGDANGER, "SIGDANGER" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
478 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
479 #ifdef SIGDIL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
480 { SIGDIL, "SIGDIL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
481 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
482 #ifdef SIGEMT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
483 { SIGEMT, "SIGEMT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
484 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
485 { SIGFPE, "SIGFPE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
486 #ifdef SIGFREEZE
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
487 { SIGFREEZE, "SIGFREEZE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
488 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
489 #ifdef SIGGFAULT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
490 { SIGGFAULT, "SIGGFAULT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
491 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
492 #ifdef SIGGRANT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
493 { SIGGRANT, "SIGGRANT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
494 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
495 { SIGHUP, "SIGHUP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
496 { SIGILL, "SIGILL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
497 { SIGINT, "SIGINT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
498 #ifdef SIGIO
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
499 { SIGIO, "SIGIO" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
500 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
501 #ifdef SIGIOINT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
502 { SIGIOINT, "SIGIOINT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
503 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
504 #ifdef SIGIOT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
505 // SIGIOT is there for BSD compatibility, but on most Unices just a
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
506 // synonym for SIGABRT. The result should be "SIGABRT", not
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
507 // "SIGIOT".
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
508 #if (SIGIOT != SIGABRT )
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
509 { SIGIOT, "SIGIOT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
510 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
511 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
512 #ifdef SIGKAP
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
513 { SIGKAP, "SIGKAP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
514 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
515 { SIGKILL, "SIGKILL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
516 #ifdef SIGLOST
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
517 { SIGLOST, "SIGLOST" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
518 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
519 #ifdef SIGLWP
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
520 { SIGLWP, "SIGLWP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
521 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
522 #ifdef SIGLWPTIMER
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
523 { SIGLWPTIMER, "SIGLWPTIMER" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
524 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
525 #ifdef SIGMIGRATE
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
526 { SIGMIGRATE, "SIGMIGRATE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
527 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
528 #ifdef SIGMSG
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
529 { SIGMSG, "SIGMSG" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
530 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
531 { SIGPIPE, "SIGPIPE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
532 #ifdef SIGPOLL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
533 { SIGPOLL, "SIGPOLL" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
534 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
535 #ifdef SIGPRE
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
536 { SIGPRE, "SIGPRE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
537 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
538 { SIGPROF, "SIGPROF" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
539 #ifdef SIGPTY
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
540 { SIGPTY, "SIGPTY" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
541 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
542 #ifdef SIGPWR
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
543 { SIGPWR, "SIGPWR" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
544 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
545 { SIGQUIT, "SIGQUIT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
546 #ifdef SIGRECONFIG
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
547 { SIGRECONFIG, "SIGRECONFIG" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
548 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
549 #ifdef SIGRECOVERY
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
550 { SIGRECOVERY, "SIGRECOVERY" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
551 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
552 #ifdef SIGRESERVE
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
553 { SIGRESERVE, "SIGRESERVE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
554 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
555 #ifdef SIGRETRACT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
556 { SIGRETRACT, "SIGRETRACT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
557 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
558 #ifdef SIGSAK
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
559 { SIGSAK, "SIGSAK" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
560 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
561 { SIGSEGV, "SIGSEGV" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
562 #ifdef SIGSOUND
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
563 { SIGSOUND, "SIGSOUND" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
564 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
565 { SIGSTOP, "SIGSTOP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
566 { SIGSYS, "SIGSYS" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
567 #ifdef SIGSYSERROR
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
568 { SIGSYSERROR, "SIGSYSERROR" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
569 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
570 #ifdef SIGTALRM
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
571 { SIGTALRM, "SIGTALRM" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
572 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
573 { SIGTERM, "SIGTERM" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
574 #ifdef SIGTHAW
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
575 { SIGTHAW, "SIGTHAW" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
576 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
577 { SIGTRAP, "SIGTRAP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
578 #ifdef SIGTSTP
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
579 { SIGTSTP, "SIGTSTP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
580 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
581 { SIGTTIN, "SIGTTIN" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
582 { SIGTTOU, "SIGTTOU" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
583 #ifdef SIGURG
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
584 { SIGURG, "SIGURG" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
585 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
586 { SIGUSR1, "SIGUSR1" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
587 { SIGUSR2, "SIGUSR2" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
588 #ifdef SIGVIRT
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
589 { SIGVIRT, "SIGVIRT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
590 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
591 { SIGVTALRM, "SIGVTALRM" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
592 #ifdef SIGWAITING
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
593 { SIGWAITING, "SIGWAITING" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
594 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
595 #ifdef SIGWINCH
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
596 { SIGWINCH, "SIGWINCH" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
597 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
598 #ifdef SIGWINDOW
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
599 { SIGWINDOW, "SIGWINDOW" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
600 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
601 { SIGXCPU, "SIGXCPU" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
602 { SIGXFSZ, "SIGXFSZ" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
603 #ifdef SIGXRES
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
604 { SIGXRES, "SIGXRES" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
605 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
606 { -1, NULL }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
607 };
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
608
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
609 const char* ret = NULL;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
610
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
611 #ifdef SIGRTMIN
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
612 if (sig >= SIGRTMIN && sig <= SIGRTMAX) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
613 if (sig == SIGRTMIN) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
614 ret = "SIGRTMIN";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
615 } else if (sig == SIGRTMAX) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
616 ret = "SIGRTMAX";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
617 } else {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
618 jio_snprintf(out, outlen, "SIGRTMIN+%d", sig - SIGRTMIN);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
619 return out;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
620 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
621 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
622 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
623
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
624 if (sig > 0) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
625 for (int idx = 0; info[idx].sig != -1; idx ++) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
626 if (info[idx].sig == sig) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
627 ret = info[idx].name;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
628 break;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
629 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
630 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
631 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
632
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
633 if (!ret) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
634 if (!is_valid_signal(sig)) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
635 ret = "INVALID";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
636 } else {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
637 ret = "UNKNOWN";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
638 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
639 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
640
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
641 jio_snprintf(out, outlen, ret);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
642 return out;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
643 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
644
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
645 // Returns true if signal number is valid.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
646 bool os::Posix::is_valid_signal(int sig) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
647 // MacOS not really POSIX compliant: sigaddset does not return
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
648 // an error for invalid signal numbers. However, MacOS does not
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
649 // support real time signals and simply seems to have just 33
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
650 // signals with no holes in the signal range.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
651 #ifdef __APPLE__
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
652 return sig >= 1 && sig < NSIG;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
653 #else
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
654 // Use sigaddset to check for signal validity.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
655 sigset_t set;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
656 if (sigaddset(&set, sig) == -1 && errno == EINVAL) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
657 return false;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
658 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
659 return true;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
660 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
661 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
662
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
663 #define NUM_IMPORTANT_SIGS 32
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
664 // Returns one-line short description of a signal set in a user provided buffer.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
665 const char* os::Posix::describe_signal_set_short(const sigset_t* set, char* buffer, size_t buf_size) {
14411
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14410
diff changeset
666 assert(buf_size == (NUM_IMPORTANT_SIGS + 1), "wrong buffer size");
14410
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
667 // Note: for shortness, just print out the first 32. That should
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
668 // cover most of the useful ones, apart from realtime signals.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
669 for (int sig = 1; sig <= NUM_IMPORTANT_SIGS; sig++) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
670 const int rc = sigismember(set, sig);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
671 if (rc == -1 && errno == EINVAL) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
672 buffer[sig-1] = '?';
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
673 } else {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
674 buffer[sig-1] = rc == 0 ? '0' : '1';
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
675 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
676 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
677 buffer[NUM_IMPORTANT_SIGS] = 0;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
678 return buffer;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
679 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
680
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
681 // Prints one-line description of a signal set.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
682 void os::Posix::print_signal_set_short(outputStream* st, const sigset_t* set) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
683 char buf[NUM_IMPORTANT_SIGS + 1];
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
684 os::Posix::describe_signal_set_short(set, buf, sizeof(buf));
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
685 st->print(buf);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
686 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
687
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
688 // Writes one-line description of a combination of sigaction.sa_flags into a user
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
689 // provided buffer. Returns that buffer.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
690 const char* os::Posix::describe_sa_flags(int flags, char* buffer, size_t size) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
691 char* p = buffer;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
692 size_t remaining = size;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
693 bool first = true;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
694 int idx = 0;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
695
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
696 assert(buffer, "invalid argument");
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
697
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
698 if (size == 0) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
699 return buffer;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
700 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
701
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
702 strncpy(buffer, "none", size);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
703
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
704 const struct {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
705 int i;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
706 const char* s;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
707 } flaginfo [] = {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
708 { SA_NOCLDSTOP, "SA_NOCLDSTOP" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
709 { SA_ONSTACK, "SA_ONSTACK" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
710 { SA_RESETHAND, "SA_RESETHAND" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
711 { SA_RESTART, "SA_RESTART" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
712 { SA_SIGINFO, "SA_SIGINFO" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
713 { SA_NOCLDWAIT, "SA_NOCLDWAIT" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
714 { SA_NODEFER, "SA_NODEFER" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
715 #ifdef AIX
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
716 { SA_ONSTACK, "SA_ONSTACK" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
717 { SA_OLDSTYLE, "SA_OLDSTYLE" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
718 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
719 { 0, NULL }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
720 };
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
721
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
722 for (idx = 0; flaginfo[idx].s && remaining > 1; idx++) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
723 if (flags & flaginfo[idx].i) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
724 if (first) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
725 jio_snprintf(p, remaining, "%s", flaginfo[idx].s);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
726 first = false;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
727 } else {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
728 jio_snprintf(p, remaining, "|%s", flaginfo[idx].s);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
729 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
730 const size_t len = strlen(p);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
731 p += len;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
732 remaining -= len;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
733 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
734 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
735
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
736 buffer[size - 1] = '\0';
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
737
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
738 return buffer;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
739 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
740
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
741 // Prints one-line description of a combination of sigaction.sa_flags.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
742 void os::Posix::print_sa_flags(outputStream* st, int flags) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
743 char buffer[0x100];
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
744 os::Posix::describe_sa_flags(flags, buffer, sizeof(buffer));
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
745 st->print(buffer);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
746 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
747
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
748 // Helper function for os::Posix::print_siginfo_...():
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
749 // return a textual description for signal code.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
750 struct enum_sigcode_desc_t {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
751 const char* s_name;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
752 const char* s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
753 };
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
754
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
755 static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t* out) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
756
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
757 const struct {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
758 int sig; int code; const char* s_code; const char* s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
759 } t1 [] = {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
760 { SIGILL, ILL_ILLOPC, "ILL_ILLOPC", "Illegal opcode." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
761 { SIGILL, ILL_ILLOPN, "ILL_ILLOPN", "Illegal operand." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
762 { SIGILL, ILL_ILLADR, "ILL_ILLADR", "Illegal addressing mode." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
763 { SIGILL, ILL_ILLTRP, "ILL_ILLTRP", "Illegal trap." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
764 { SIGILL, ILL_PRVOPC, "ILL_PRVOPC", "Privileged opcode." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
765 { SIGILL, ILL_PRVREG, "ILL_PRVREG", "Privileged register." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
766 { SIGILL, ILL_COPROC, "ILL_COPROC", "Coprocessor error." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
767 { SIGILL, ILL_BADSTK, "ILL_BADSTK", "Internal stack error." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
768 #if defined(IA64) && defined(LINUX)
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
769 { SIGILL, ILL_BADIADDR, "ILL_BADIADDR", "Unimplemented instruction address" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
770 { SIGILL, ILL_BREAK, "ILL_BREAK", "Application Break instruction" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
771 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
772 { SIGFPE, FPE_INTDIV, "FPE_INTDIV", "Integer divide by zero." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
773 { SIGFPE, FPE_INTOVF, "FPE_INTOVF", "Integer overflow." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
774 { SIGFPE, FPE_FLTDIV, "FPE_FLTDIV", "Floating-point divide by zero." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
775 { SIGFPE, FPE_FLTOVF, "FPE_FLTOVF", "Floating-point overflow." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
776 { SIGFPE, FPE_FLTUND, "FPE_FLTUND", "Floating-point underflow." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
777 { SIGFPE, FPE_FLTRES, "FPE_FLTRES", "Floating-point inexact result." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
778 { SIGFPE, FPE_FLTINV, "FPE_FLTINV", "Invalid floating-point operation." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
779 { SIGFPE, FPE_FLTSUB, "FPE_FLTSUB", "Subscript out of range." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
780 { SIGSEGV, SEGV_MAPERR, "SEGV_MAPERR", "Address not mapped to object." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
781 { SIGSEGV, SEGV_ACCERR, "SEGV_ACCERR", "Invalid permissions for mapped object." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
782 #ifdef AIX
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
783 // no explanation found what keyerr would be
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
784 { SIGSEGV, SEGV_KEYERR, "SEGV_KEYERR", "key error" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
785 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
786 #if defined(IA64) && !defined(AIX)
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
787 { SIGSEGV, SEGV_PSTKOVF, "SEGV_PSTKOVF", "Paragraph stack overflow" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
788 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
789 { SIGBUS, BUS_ADRALN, "BUS_ADRALN", "Invalid address alignment." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
790 { SIGBUS, BUS_ADRERR, "BUS_ADRERR", "Nonexistent physical address." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
791 { SIGBUS, BUS_OBJERR, "BUS_OBJERR", "Object-specific hardware error." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
792 { SIGTRAP, TRAP_BRKPT, "TRAP_BRKPT", "Process breakpoint." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
793 { SIGTRAP, TRAP_TRACE, "TRAP_TRACE", "Process trace trap." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
794 { SIGCHLD, CLD_EXITED, "CLD_EXITED", "Child has exited." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
795 { SIGCHLD, CLD_KILLED, "CLD_KILLED", "Child has terminated abnormally and did not create a core file." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
796 { SIGCHLD, CLD_DUMPED, "CLD_DUMPED", "Child has terminated abnormally and created a core file." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
797 { SIGCHLD, CLD_TRAPPED, "CLD_TRAPPED", "Traced child has trapped." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
798 { SIGCHLD, CLD_STOPPED, "CLD_STOPPED", "Child has stopped." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
799 { SIGCHLD, CLD_CONTINUED,"CLD_CONTINUED","Stopped child has continued." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
800 #ifdef SIGPOLL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
801 { SIGPOLL, POLL_OUT, "POLL_OUT", "Output buffers available." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
802 { SIGPOLL, POLL_MSG, "POLL_MSG", "Input message available." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
803 { SIGPOLL, POLL_ERR, "POLL_ERR", "I/O error." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
804 { SIGPOLL, POLL_PRI, "POLL_PRI", "High priority input available." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
805 { SIGPOLL, POLL_HUP, "POLL_HUP", "Device disconnected. [Option End]" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
806 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
807 { -1, -1, NULL, NULL }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
808 };
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
809
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
810 // Codes valid in any signal context.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
811 const struct {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
812 int code; const char* s_code; const char* s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
813 } t2 [] = {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
814 { SI_USER, "SI_USER", "Signal sent by kill()." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
815 { SI_QUEUE, "SI_QUEUE", "Signal sent by the sigqueue()." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
816 { SI_TIMER, "SI_TIMER", "Signal generated by expiration of a timer set by timer_settime()." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
817 { SI_ASYNCIO, "SI_ASYNCIO", "Signal generated by completion of an asynchronous I/O request." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
818 { SI_MESGQ, "SI_MESGQ", "Signal generated by arrival of a message on an empty message queue." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
819 // Linux specific
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
820 #ifdef SI_TKILL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
821 { SI_TKILL, "SI_TKILL", "Signal sent by tkill (pthread_kill)" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
822 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
823 #ifdef SI_DETHREAD
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
824 { SI_DETHREAD, "SI_DETHREAD", "Signal sent by execve() killing subsidiary threads" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
825 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
826 #ifdef SI_KERNEL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
827 { SI_KERNEL, "SI_KERNEL", "Signal sent by kernel." },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
828 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
829 #ifdef SI_SIGIO
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
830 { SI_SIGIO, "SI_SIGIO", "Signal sent by queued SIGIO" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
831 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
832
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
833 #ifdef AIX
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
834 { SI_UNDEFINED, "SI_UNDEFINED","siginfo contains partial information" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
835 { SI_EMPTY, "SI_EMPTY", "siginfo contains no useful information" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
836 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
837
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
838 #ifdef __sun
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
839 { SI_NOINFO, "SI_NOINFO", "No signal information" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
840 { SI_RCTL, "SI_RCTL", "kernel generated signal via rctl action" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
841 { SI_LWP, "SI_LWP", "Signal sent via lwp_kill" },
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
842 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
843
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
844 { -1, NULL, NULL }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
845 };
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
846
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
847 const char* s_code = NULL;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
848 const char* s_desc = NULL;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
849
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
850 for (int i = 0; t1[i].sig != -1; i ++) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
851 if (t1[i].sig == si->si_signo && t1[i].code == si->si_code) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
852 s_code = t1[i].s_code;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
853 s_desc = t1[i].s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
854 break;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
855 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
856 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
857
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
858 if (s_code == NULL) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
859 for (int i = 0; t2[i].s_code != NULL; i ++) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
860 if (t2[i].code == si->si_code) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
861 s_code = t2[i].s_code;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
862 s_desc = t2[i].s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
863 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
864 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
865 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
866
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
867 if (s_code == NULL) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
868 out->s_name = "unknown";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
869 out->s_desc = "unknown";
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
870 return false;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
871 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
872
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
873 out->s_name = s_code;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
874 out->s_desc = s_desc;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
875
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
876 return true;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
877 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
878
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
879 // A POSIX conform, platform-independend siginfo print routine.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
880 // Short print out on one line.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
881 void os::Posix::print_siginfo_brief(outputStream* os, const siginfo_t* si) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
882 char buf[20];
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
883 os->print("siginfo: ");
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
884
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
885 if (!si) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
886 os->print("<null>");
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
887 return;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
888 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
889
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
890 // See print_siginfo_full() for details.
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
891 const int sig = si->si_signo;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
892
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
893 os->print("si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf)));
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
894
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
895 enum_sigcode_desc_t ed;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
896 if (get_signal_code_description(si, &ed)) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
897 os->print(", si_code: %d (%s)", si->si_code, ed.s_name);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
898 } else {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
899 os->print(", si_code: %d (unknown)", si->si_code);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
900 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
901
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
902 if (si->si_errno) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
903 os->print(", si_errno: %d", si->si_errno);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
904 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
905
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
906 const int me = (int) ::getpid();
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
907 const int pid = (int) si->si_pid;
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
908
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
909 if (si->si_code == SI_USER || si->si_code == SI_QUEUE) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
910 if (IS_VALID_PID(pid) && pid != me) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
911 os->print(", sent from pid: %d (uid: %d)", pid, (int) si->si_uid);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
912 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
913 } else if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
914 sig == SIGTRAP || sig == SIGFPE) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
915 os->print(", si_addr: " PTR_FORMAT, si->si_addr);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
916 #ifdef SIGPOLL
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
917 } else if (sig == SIGPOLL) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
918 os->print(", si_band: " PTR64_FORMAT, (uint64_t)si->si_band);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
919 #endif
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
920 } else if (sig == SIGCHLD) {
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
921 os->print_cr(", si_pid: %d, si_uid: %d, si_status: %d", (int) si->si_pid, si->si_uid, si->si_status);
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
922 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
923 }
f42f2e2a1518 8020775: PPC64 (part 12): posix signal printing
goetz
parents: 11151
diff changeset
924
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
925 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
926 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
927 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
928
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
929 /*
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
930 * See the caveats for this class in os_posix.hpp
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
931 * Protects the callback call so that SIGSEGV / SIGBUS jumps back into this
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
932 * method and returns false. If none of the signals are raised, returns true.
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
933 * The callback is supposed to provide the method that should be protected.
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
934 */
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
935 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
12141
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
936 sigset_t saved_sig_mask;
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
937
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
938 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
939 assert(!WatcherThread::watcher_thread()->has_crash_protection(),
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
940 "crash_protection already set?");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
941
12141
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
942 // we cannot rely on sigsetjmp/siglongjmp to save/restore the signal mask
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
943 // since on at least some systems (OS X) siglongjmp will restore the mask
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
944 // for the process, not the thread
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
945 pthread_sigmask(0, NULL, &saved_sig_mask);
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
946 if (sigsetjmp(_jmpbuf, 0) == 0) {
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
947 // make sure we can see in the signal handler that we have crash protection
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
948 // installed
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
949 WatcherThread::watcher_thread()->set_crash_protection(this);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
950 cb.call();
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
951 // and clear the crash protection
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
952 WatcherThread::watcher_thread()->set_crash_protection(NULL);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
953 return true;
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
954 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
955 // this happens when we siglongjmp() back
12141
cc56f122f3f7 8023720: (hotspot) setjmp/longjmp changes the process signal mask on OS X
sla
parents: 11151
diff changeset
956 pthread_sigmask(SIG_SETMASK, &saved_sig_mask, NULL);
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
957 WatcherThread::watcher_thread()->set_crash_protection(NULL);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
958 return false;
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
959 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
960
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
961 void os::WatcherThreadCrashProtection::restore() {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
962 assert(WatcherThread::watcher_thread()->has_crash_protection(),
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
963 "must have crash protection");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
964
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
965 siglongjmp(_jmpbuf, 1);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
966 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
967
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
968 void os::WatcherThreadCrashProtection::check_crash_protection(int sig,
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
969 Thread* thread) {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
970
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
971 if (thread != NULL &&
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
972 thread->is_Watcher_thread() &&
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
973 WatcherThread::watcher_thread()->has_crash_protection()) {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
974
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
975 if (sig == SIGSEGV || sig == SIGBUS) {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
976 WatcherThread::watcher_thread()->crash_protection()->restore();
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
977 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
978 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 10195
diff changeset
979 }