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