hotspot/src/os/bsd/vm/os_bsd.cpp
author tschatzl
Wed, 27 Mar 2013 19:21:18 +0100
changeset 16605 ba13efd453bc
parent 15929 120913eb31dd
child 16672 152c041083e1
permissions -rw-r--r--
7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method. Reviewed-by: jmasa, tamao
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     1
/*
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
     2
 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     4
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     7
 * published by the Free Software Foundation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     8
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    13
 * accompanied this code).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    14
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    18
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    21
 * questions.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    22
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    23
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    24
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    25
// no precompiled headers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    26
#include "classfile/classLoader.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    27
#include "classfile/systemDictionary.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    28
#include "classfile/vmSymbols.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    29
#include "code/icBuffer.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    30
#include "code/vtableStubs.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    31
#include "compiler/compileBroker.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14471
diff changeset
    32
#include "compiler/disassembler.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    33
#include "interpreter/interpreter.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    34
#include "jvm_bsd.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    35
#include "memory/allocation.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    36
#include "memory/filemap.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    37
#include "mutex_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    38
#include "oops/oop.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    39
#include "os_share_bsd.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    40
#include "prims/jniFastGetField.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    41
#include "prims/jvm.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    42
#include "prims/jvm_misc.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    43
#include "runtime/arguments.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    44
#include "runtime/extendedPC.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    45
#include "runtime/globals.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    46
#include "runtime/interfaceSupport.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    47
#include "runtime/java.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    48
#include "runtime/javaCalls.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    49
#include "runtime/mutexLocker.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    50
#include "runtime/objectMonitor.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    51
#include "runtime/osThread.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    52
#include "runtime/perfMemory.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    53
#include "runtime/sharedRuntime.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    54
#include "runtime/statSampler.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    55
#include "runtime/stubRoutines.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14471
diff changeset
    56
#include "runtime/thread.inline.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    57
#include "runtime/threadCritical.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    58
#include "runtime/timer.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    59
#include "services/attachListener.hpp"
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
    60
#include "services/memTracker.hpp"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    61
#include "services/runtimeService.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    62
#include "utilities/decoder.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    63
#include "utilities/defaultStream.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    64
#include "utilities/events.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    65
#include "utilities/growableArray.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    66
#include "utilities/vmError.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    67
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    68
// put OS-includes here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    69
# include <sys/types.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    70
# include <sys/mman.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    71
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    72
# include <sys/select.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    73
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    74
# include <signal.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    75
# include <errno.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    76
# include <dlfcn.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    77
# include <stdio.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    78
# include <unistd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    79
# include <sys/resource.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    80
# include <pthread.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    81
# include <sys/stat.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    82
# include <sys/time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    83
# include <sys/times.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    84
# include <sys/utsname.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    85
# include <sys/socket.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    86
# include <sys/wait.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    87
# include <time.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    88
# include <pwd.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    89
# include <poll.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    90
# include <semaphore.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    91
# include <fcntl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    92
# include <string.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    93
# include <sys/param.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    94
# include <sys/sysctl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    95
# include <sys/ipc.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    96
# include <sys/shm.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    97
#ifndef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    98
# include <link.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
    99
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   100
# include <stdint.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   101
# include <inttypes.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   102
# include <sys/ioctl.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   103
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   104
#if defined(__FreeBSD__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   105
# include <elf.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   106
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   107
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   108
#ifdef __APPLE__
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   109
# include <mach/mach.h> // semaphore_* API
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   110
# include <mach-o/dyld.h>
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   111
# include <sys/proc_info.h>
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   112
# include <objc/objc-auto.h>
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   113
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   114
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   115
#ifndef MAP_ANONYMOUS
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   116
#define MAP_ANONYMOUS MAP_ANON
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   117
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   118
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   119
#define MAX_PATH    (2 * K)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   120
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   121
// for timer info max values which include all bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   122
#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   123
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   124
#define LARGEPAGES_BIT (1 << 6)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   125
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   126
// global variables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   127
julong os::Bsd::_physical_memory = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   128
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   129
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   130
int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   131
pthread_t os::Bsd::_main_thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   132
int os::Bsd::_page_size = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   133
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   134
static jlong initial_time_count=0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   135
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   136
static int clock_tics_per_sec = 100;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   137
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   138
// For diagnostics to print a message once. see run_periodic_checks
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   139
static sigset_t check_signal_done;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   140
static bool check_signals = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   141
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   142
static pid_t _initial_pid = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   143
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   144
/* Signal number used to suspend/resume a thread */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   145
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   146
/* do not use any signal number less than SIGSEGV, see 4355769 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   147
static int SR_signum = SIGUSR2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   148
sigset_t SR_sigset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   149
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   150
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   151
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   152
// utility functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   153
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   154
static int SR_initialize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   155
static int SR_finalize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   156
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   157
julong os::available_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   158
  return Bsd::available_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   159
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   160
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   161
julong os::Bsd::available_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   162
  // XXXBSD: this is just a stopgap implementation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   163
  return physical_memory() >> 2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   164
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   165
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   166
julong os::physical_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   167
  return Bsd::physical_memory();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   168
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   169
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   170
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   171
// environment support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   172
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   173
bool os::getenv(const char* name, char* buf, int len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   174
  const char* val = ::getenv(name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   175
  if (val != NULL && strlen(val) < (size_t)len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   176
    strcpy(buf, val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   177
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   178
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   179
  if (len > 0) buf[0] = 0;  // return a null string
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   180
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   181
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   182
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   183
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   184
// Return true if user is running as root.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   185
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   186
bool os::have_special_privileges() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   187
  static bool init = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   188
  static bool privileges = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   189
  if (!init) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   190
    privileges = (getuid() != geteuid()) || (getgid() != getegid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   191
    init = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   192
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   193
  return privileges;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   194
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   195
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   196
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   197
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   198
// Cpu architecture string
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   199
#if   defined(ZERO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   200
static char cpu_arch[] = ZERO_LIBARCH;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   201
#elif defined(IA64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   202
static char cpu_arch[] = "ia64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   203
#elif defined(IA32)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   204
static char cpu_arch[] = "i386";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   205
#elif defined(AMD64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   206
static char cpu_arch[] = "amd64";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   207
#elif defined(ARM)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   208
static char cpu_arch[] = "arm";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   209
#elif defined(PPC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   210
static char cpu_arch[] = "ppc";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   211
#elif defined(SPARC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   212
#  ifdef _LP64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   213
static char cpu_arch[] = "sparcv9";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   214
#  else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   215
static char cpu_arch[] = "sparc";
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   216
#  endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   217
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   218
#error Add appropriate cpu_arch setting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   219
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   220
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   221
// Compiler variant
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   222
#ifdef COMPILER2
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   223
#define COMPILER_VARIANT "server"
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   224
#else
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   225
#define COMPILER_VARIANT "client"
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
   226
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   227
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   228
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   229
void os::Bsd::initialize_system_info() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   230
  int mib[2];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   231
  size_t len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   232
  int cpu_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   233
  julong mem_val;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   234
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   235
  /* get processors count via hw.ncpus sysctl */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   236
  mib[0] = CTL_HW;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   237
  mib[1] = HW_NCPU;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   238
  len = sizeof(cpu_val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   239
  if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   240
       assert(len == sizeof(cpu_val), "unexpected data size");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   241
       set_processor_count(cpu_val);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   242
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   243
  else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   244
       set_processor_count(1);   // fallback
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   245
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   246
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   247
  /* get physical memory via hw.memsize sysctl (hw.memsize is used
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   248
   * since it returns a 64 bit value)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   249
   */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   250
  mib[0] = CTL_HW;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   251
  mib[1] = HW_MEMSIZE;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   252
  len = sizeof(mem_val);
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   253
  if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   254
       assert(len == sizeof(mem_val), "unexpected data size");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   255
       _physical_memory = mem_val;
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   256
  } else {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   257
       _physical_memory = 256*1024*1024;       // fallback (XXXBSD?)
15231
cddea19288cf 8006431: os::Bsd::initialize_system_info() sets _physical_memory too large
brutisso
parents: 15096
diff changeset
   258
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   259
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   260
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   261
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   262
       // limit _physical_memory memory view on OpenBSD since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   263
       // datasize rlimit restricts us anyway.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   264
       struct rlimit limits;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   265
       getrlimit(RLIMIT_DATA, &limits);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   266
       _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   267
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   268
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   269
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   270
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   271
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   272
static const char *get_home() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   273
  const char *home_dir = ::getenv("HOME");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   274
  if ((home_dir == NULL) || (*home_dir == '\0')) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   275
    struct passwd *passwd_info = getpwuid(geteuid());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   276
    if (passwd_info != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   277
      home_dir = passwd_info->pw_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   278
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   279
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   280
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   281
  return home_dir;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   282
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   283
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   284
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   285
void os::init_system_properties_values() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   286
//  char arch[12];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   287
//  sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   288
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   289
  // The next steps are taken in the product version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   290
  //
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   291
  // Obtain the JAVA_HOME value from the location of libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   292
  // This library should be located at:
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   293
  // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   294
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   295
  // If "/jre/lib/" appears at the right place in the path, then we
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   296
  // assume libjvm.so is installed in a JDK and we use this path.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   297
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   298
  // Otherwise exit with message: "Could not create the Java virtual machine."
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   299
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   300
  // The following extra steps are taken in the debugging version:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   301
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   302
  // If "/jre/lib/" does NOT appear at the right place in the path
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   303
  // instead of exit check for $JAVA_HOME environment variable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   304
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   305
  // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   306
  // then we append a fake suffix "hotspot/libjvm.so" to this path so
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   307
  // it looks like libjvm.so is installed there
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
   308
  // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   309
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   310
  // Otherwise exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   311
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   312
  // Important note: if the location of libjvm.so changes this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   313
  // code needs to be changed accordingly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   314
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   315
  // The next few definitions allow the code to be verbatim:
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
   316
#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   317
#define getenv(n) ::getenv(n)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   318
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   319
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   320
 * See ld(1):
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   321
 *      The linker uses the following search paths to locate required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   322
 *      shared libraries:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   323
 *        1: ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   324
 *        ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   325
 *        7: The default directories, normally /lib and /usr/lib.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   326
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   327
#ifndef DEFAULT_LIBPATH
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   328
#define DEFAULT_LIBPATH "/lib:/usr/lib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   329
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   330
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   331
#define EXTENSIONS_DIR  "/lib/ext"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   332
#define ENDORSED_DIR    "/lib/endorsed"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   333
#define REG_DIR         "/usr/java/packages"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   334
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   335
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   336
#define SYS_EXTENSIONS_DIR   "/Library/Java/Extensions"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   337
#define SYS_EXTENSIONS_DIRS  SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   338
        const char *user_home_dir = get_home();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   339
        // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   340
        int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) +
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   341
            sizeof(SYS_EXTENSIONS_DIRS);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   342
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   343
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   344
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   345
    /* sysclasspath, java_home, dll_dir */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   346
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   347
        char *home_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   348
        char *dll_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   349
        char *pslash;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   350
        char buf[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   351
        os::jvm_path(buf, sizeof(buf));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   352
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   353
        // Found the full path to libjvm.so.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   354
        // Now cut the path to <java_home>/jre if we can.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   355
        *(strrchr(buf, '/')) = '\0';  /* get rid of /libjvm.so */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   356
        pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   357
        if (pslash != NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   358
            *pslash = '\0';           /* get rid of /{client|server|hotspot} */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   359
        dll_path = malloc(strlen(buf) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   360
        if (dll_path == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   361
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   362
        strcpy(dll_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   363
        Arguments::set_dll_dir(dll_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   364
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   365
        if (pslash != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   366
            pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   367
            if (pslash != NULL) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   368
                *pslash = '\0';       /* get rid of /<arch> (/lib on macosx) */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   369
#ifndef __APPLE__
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   370
                pslash = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   371
                if (pslash != NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   372
                    *pslash = '\0';   /* get rid of /lib */
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   373
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   374
            }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   375
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   376
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   377
        home_path = malloc(strlen(buf) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   378
        if (home_path == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   379
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   380
        strcpy(home_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   381
        Arguments::set_java_home(home_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   382
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   383
        if (!set_boot_path('/', ':'))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   384
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   385
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   386
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   387
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   388
     * Where to look for native libraries
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   389
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   390
     * Note: Due to a legacy implementation, most of the library path
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   391
     * is set in the launcher.  This was to accomodate linking restrictions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   392
     * on legacy Bsd implementations (which are no longer supported).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   393
     * Eventually, all the library path setting will be done here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   394
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   395
     * However, to prevent the proliferation of improperly built native
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   396
     * libraries, the new path component /usr/java/packages is added here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   397
     * Eventually, all the library path setting will be done here.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   398
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   399
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   400
        char *ld_library_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   401
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   402
        /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   403
         * Construct the invariant part of ld_library_path. Note that the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   404
         * space for the colon and the trailing null are provided by the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   405
         * nulls included by the sizeof operator (so actually we allocate
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   406
         * a byte more than necessary).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   407
         */
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   408
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   409
        ld_library_path = (char *) malloc(system_ext_size);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   410
        sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   411
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   412
        ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") +
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   413
            strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   414
        sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   415
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   416
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   417
        /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   418
         * Get the user setting of LD_LIBRARY_PATH, and prepended it.  It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   419
         * should always exist (until the legacy problem cited above is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   420
         * addressed).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   421
         */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   422
#ifdef __APPLE__
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   423
        // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   424
        char *l = getenv("JAVA_LIBRARY_PATH");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   425
        if (l != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   426
            char *t = ld_library_path;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   427
            /* That's +1 for the colon and +1 for the trailing '\0' */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   428
            ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   429
            sprintf(ld_library_path, "%s:%s", l, t);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   430
            free(t);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   431
        }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   432
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   433
        char *v = getenv("DYLD_LIBRARY_PATH");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   434
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   435
        char *v = getenv("LD_LIBRARY_PATH");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   436
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   437
        if (v != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   438
            char *t = ld_library_path;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   439
            /* That's +1 for the colon and +1 for the trailing '\0' */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   440
            ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   441
            sprintf(ld_library_path, "%s:%s", v, t);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   442
            free(t);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   443
        }
11880
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   444
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   445
#ifdef __APPLE__
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   446
        // Apple's Java6 has "." at the beginning of java.library.path.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   447
        // OpenJDK on Windows has "." at the end of java.library.path.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   448
        // OpenJDK on Linux and Solaris don't have "." in java.library.path
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   449
        // at all. To ease the transition from Apple's Java6 to OpenJDK7,
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   450
        // "." is appended to the end of java.library.path. Yes, this
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   451
        // could cause a change in behavior, but Apple's Java6 behavior
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   452
        // can be achieved by putting "." at the beginning of the
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   453
        // JAVA_LIBRARY_PATH environment variable.
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   454
        {
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   455
            char *t = ld_library_path;
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   456
            // that's +3 for appending ":." and the trailing '\0'
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   457
            ld_library_path = (char *) malloc(strlen(t) + 3);
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   458
            sprintf(ld_library_path, "%s:%s", t, ".");
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   459
            free(t);
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   460
        }
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   461
#endif
ed550eabf75c 7145798: System.loadLibrary does not search current working directory
dcubed
parents: 11601
diff changeset
   462
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   463
        Arguments::set_library_path(ld_library_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   464
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   465
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   466
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   467
     * Extensions directories.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   468
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   469
     * Note that the space for the colon and the trailing null are provided
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   470
     * by the nulls included by the sizeof operator (so actually one byte more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   471
     * than necessary is allocated).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   472
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   473
    {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   474
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   475
        char *buf = malloc(strlen(Arguments::get_java_home()) +
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   476
            sizeof(EXTENSIONS_DIR) + system_ext_size);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   477
        sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   478
            SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   479
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   480
        char *buf = malloc(strlen(Arguments::get_java_home()) +
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   481
            sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   482
        sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   483
            Arguments::get_java_home());
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   484
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   485
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   486
        Arguments::set_ext_dirs(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   487
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   488
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   489
    /* Endorsed standards default directory. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   490
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   491
        char * buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   492
        buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   493
        sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   494
        Arguments::set_endorsed_dirs(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   495
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   496
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   497
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   498
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   499
#undef SYS_EXTENSIONS_DIR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   500
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   501
#undef malloc
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   502
#undef getenv
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   503
#undef EXTENSIONS_DIR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   504
#undef ENDORSED_DIR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   505
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   506
  // Done
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   507
  return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   508
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   509
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   510
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   511
// breakpoint support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   513
void os::breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   514
  BREAKPOINT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   515
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   516
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   517
extern "C" void breakpoint() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   518
  // use debugger to set breakpoint here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   519
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   520
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   521
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   522
// signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   523
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   524
debug_only(static bool signal_sets_initialized = false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   525
static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   526
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   527
bool os::Bsd::is_sig_ignored(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   528
      struct sigaction oact;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   529
      sigaction(sig, (struct sigaction*)NULL, &oact);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   530
      void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oact.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   531
                                     : CAST_FROM_FN_PTR(void*,  oact.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   532
      if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   533
           return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   534
      else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   535
           return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   536
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   537
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   538
void os::Bsd::signal_sets_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   539
  // Should also have an assertion stating we are still single-threaded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   540
  assert(!signal_sets_initialized, "Already initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   541
  // Fill in signals that are necessarily unblocked for all threads in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   542
  // the VM. Currently, we unblock the following signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   543
  // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   544
  //                         by -Xrs (=ReduceSignalUsage));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   545
  // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   546
  // other threads. The "ReduceSignalUsage" boolean tells us not to alter
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   547
  // the dispositions or masks wrt these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   548
  // Programs embedding the VM that want to use the above signals for their
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   549
  // own purposes must, at this time, use the "-Xrs" option to prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   550
  // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   551
  // (See bug 4345157, and other related bugs).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   552
  // In reality, though, unblocking these signals is really a nop, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   553
  // these signals are not blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   554
  sigemptyset(&unblocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   555
  sigemptyset(&allowdebug_blocked_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   556
  sigaddset(&unblocked_sigs, SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   557
  sigaddset(&unblocked_sigs, SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   558
  sigaddset(&unblocked_sigs, SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   559
  sigaddset(&unblocked_sigs, SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   560
  sigaddset(&unblocked_sigs, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   561
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   562
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   563
   if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   564
      sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   565
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   566
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   567
   if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   568
      sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   569
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   570
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   571
   if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   572
      sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   573
      sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   574
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   575
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   576
  // Fill in signals that are blocked by all but the VM thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   577
  sigemptyset(&vm_sigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   578
  if (!ReduceSignalUsage)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   579
    sigaddset(&vm_sigs, BREAK_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   580
  debug_only(signal_sets_initialized = true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   581
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   582
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   583
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   584
// These are signals that are unblocked while a thread is running Java.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   585
// (For some reason, they get blocked by default.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   586
sigset_t* os::Bsd::unblocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   587
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   588
  return &unblocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   589
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   590
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   591
// These are the signals that are blocked while a (non-VM) thread is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   592
// running Java. Only the VM thread handles these signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   593
sigset_t* os::Bsd::vm_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   594
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   595
  return &vm_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   596
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   597
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   598
// These are signals that are blocked during cond_wait to allow debugger in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   599
sigset_t* os::Bsd::allowdebug_blocked_signals() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   600
  assert(signal_sets_initialized, "Not initialized");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   601
  return &allowdebug_blocked_sigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   602
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   603
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   604
void os::Bsd::hotspot_sigmask(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   605
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   606
  //Save caller's signal mask before setting VM signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   607
  sigset_t caller_sigmask;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   608
  pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   609
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   610
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   611
  osthread->set_caller_sigmask(caller_sigmask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   612
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   613
  pthread_sigmask(SIG_UNBLOCK, os::Bsd::unblocked_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   614
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   615
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   616
    if (thread->is_VM_thread()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   617
      // Only the VM thread handles BREAK_SIGNAL ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   618
      pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   619
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   620
      // ... all other threads block BREAK_SIGNAL
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   621
      pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   622
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   623
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   624
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   625
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   626
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   627
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   628
// create new thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   629
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   630
static address highest_vm_reserved_address();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   631
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   632
// check if it's safe to start a new thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   633
static bool _thread_safety_check(Thread* thread) {
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   634
  return true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   635
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   636
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   637
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   638
// library handle for calling objc_registerThreadWithCollector()
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   639
// without static linking to the libobjc library
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   640
#define OBJC_LIB "/usr/lib/libobjc.dylib"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   641
#define OBJC_GCREGISTER "objc_registerThreadWithCollector"
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   642
typedef void (*objc_registerThreadWithCollector_t)();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   643
extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   644
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   645
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   646
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   647
#ifdef __APPLE__
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   648
static uint64_t locate_unique_thread_id() {
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   649
  // Additional thread_id used to correlate threads in SA
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   650
  thread_identifier_info_data_t     m_ident_info;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   651
  mach_msg_type_number_t            count = THREAD_IDENTIFIER_INFO_COUNT;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   652
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   653
  thread_info(::mach_thread_self(), THREAD_IDENTIFIER_INFO,
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   654
              (thread_info_t) &m_ident_info, &count);
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   655
  return m_ident_info.thread_id;
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   656
}
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   657
#endif
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   658
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   659
// Thread start routine for all newly created threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   660
static void *java_start(Thread *thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   661
  // Try to randomize the cache line index of hot stack frames.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   662
  // This helps when threads of the same stack traces evict each other's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   663
  // cache lines. The threads can be either from the same JVM instance, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   664
  // from different JVM instances. The benefit is especially true for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   665
  // processors with hyperthreading technology.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   666
  static int counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   667
  int pid = os::current_process_id();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   668
  alloca(((pid ^ counter++) & 7) * 128);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   669
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   670
  ThreadLocalStorage::set_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   671
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   672
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   673
  Monitor* sync = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   674
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   675
  // non floating stack BsdThreads needs extra check, see above
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   676
  if (!_thread_safety_check(thread)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   677
    // notify parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   678
    MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   679
    osthread->set_state(ZOMBIE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   680
    sync->notify_all();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   681
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   682
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   683
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   684
#ifdef __APPLE__
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   685
  // thread_id is mach thread on macos
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   686
  osthread->set_thread_id(::mach_thread_self());
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   687
  osthread->set_unique_thread_id(locate_unique_thread_id());
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   688
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   689
  // thread_id is pthread_id on BSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   690
  osthread->set_thread_id(::pthread_self());
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   691
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   692
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   693
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   694
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   695
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   696
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   697
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   698
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   699
  // register thread with objc gc
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   700
  if (objc_registerThreadWithCollectorFunction != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   701
    objc_registerThreadWithCollectorFunction();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   702
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   703
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   704
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   705
  // handshaking with parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   706
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   707
    MutexLockerEx ml(sync, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   708
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   709
    // notify parent thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   710
    osthread->set_state(INITIALIZED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   711
    sync->notify_all();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   712
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   713
    // wait until os::start_thread()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   714
    while (osthread->get_state() == INITIALIZED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   715
      sync->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   716
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   717
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   718
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   719
  // call one more level start routine
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   720
  thread->run();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   721
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   722
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   723
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   724
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   725
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   726
  assert(thread->osthread() == NULL, "caller responsible");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   727
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   728
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   729
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   730
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   731
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   732
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   733
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   734
  // set the correct thread state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   735
  osthread->set_thread_type(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   736
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   737
  // Initial state is ALLOCATED but not INITIALIZED
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   738
  osthread->set_state(ALLOCATED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   739
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   740
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   741
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   742
  // init thread attributes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   743
  pthread_attr_t attr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   744
  pthread_attr_init(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   745
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   746
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   747
  // stack size
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   748
  if (os::Bsd::supports_variable_stack_size()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   749
    // calculate stack size if it's not specified by caller
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   750
    if (stack_size == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   751
      stack_size = os::Bsd::default_stack_size(thr_type);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   752
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   753
      switch (thr_type) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   754
      case os::java_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   755
        // Java threads use ThreadStackSize which default value can be
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   756
        // changed with the flag -Xss
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   757
        assert (JavaThread::stack_size_at_create() > 0, "this should be set");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   758
        stack_size = JavaThread::stack_size_at_create();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   759
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   760
      case os::compiler_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   761
        if (CompilerThreadStackSize > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   762
          stack_size = (size_t)(CompilerThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   763
          break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   764
        } // else fall through:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   765
          // use VMThreadStackSize if CompilerThreadStackSize is not defined
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   766
      case os::vm_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   767
      case os::pgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   768
      case os::cgc_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   769
      case os::watcher_thread:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   770
        if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   771
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   772
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   773
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   774
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   775
    stack_size = MAX2(stack_size, os::Bsd::min_stack_allowed);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   776
    pthread_attr_setstacksize(&attr, stack_size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   777
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   778
    // let pthread_create() pick the default value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   779
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   780
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   781
  ThreadState state;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   782
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   783
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   784
    pthread_t tid;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   785
    int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   786
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   787
    pthread_attr_destroy(&attr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   788
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   789
    if (ret != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   790
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   791
        perror("pthread_create()");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   792
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   793
      // Need to clean up stuff we've allocated so far
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   794
      thread->set_osthread(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   795
      delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   796
      return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   797
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   798
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   799
    // Store pthread info into the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   800
    osthread->set_pthread_id(tid);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   801
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   802
    // Wait until child thread is either initialized or aborted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   803
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   804
      Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   805
      MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   806
      while ((state = osthread->get_state()) == ALLOCATED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   807
        sync_with_child->wait(Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   808
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   809
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   810
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   811
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   812
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   813
  // Aborted due to thread limit being reached
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   814
  if (state == ZOMBIE) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   815
      thread->set_osthread(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   816
      delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   817
      return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   818
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   819
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   820
  // The thread is returned suspended (in state INITIALIZED),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   821
  // and is started higher up in the call chain
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   822
  assert(state == INITIALIZED, "race condition");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   823
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   824
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   825
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   826
/////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   827
// attach existing thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   828
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   829
// bootstrap the main thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   830
bool os::create_main_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   831
  assert(os::Bsd::_main_thread == pthread_self(), "should be called inside main thread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   832
  return create_attached_thread(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   833
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   834
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   835
bool os::create_attached_thread(JavaThread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   836
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   837
    thread->verify_not_published();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   838
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   839
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   840
  // Allocate the OSThread object
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   841
  OSThread* osthread = new OSThread(NULL, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   842
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   843
  if (osthread == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   844
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   845
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   846
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   847
  // Store pthread info into the OSThread
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   848
#ifdef __APPLE__
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   849
  osthread->set_thread_id(::mach_thread_self());
15593
860cf6c70c06 8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
sla
parents: 15234
diff changeset
   850
  osthread->set_unique_thread_id(locate_unique_thread_id());
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   851
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   852
  osthread->set_thread_id(::pthread_self());
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
   853
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   854
  osthread->set_pthread_id(::pthread_self());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   855
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   856
  // initialize floating point control register
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   857
  os::Bsd::init_thread_fpu_state();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   858
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   859
  // Initial thread state is RUNNABLE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   860
  osthread->set_state(RUNNABLE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   861
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   862
  thread->set_osthread(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   863
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   864
  // initialize signal mask for this thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   865
  // and save the caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   866
  os::Bsd::hotspot_sigmask(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   867
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   868
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   869
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   870
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   871
void os::pd_start_thread(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   872
  OSThread * osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   873
  assert(osthread->get_state() != INITIALIZED, "just checking");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   874
  Monitor* sync_with_child = osthread->startThread_lock();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   875
  MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   876
  sync_with_child->notify();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   877
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   878
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   879
// Free Bsd resources related to the OSThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   880
void os::free_thread(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   881
  assert(osthread != NULL, "osthread not set");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   882
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   883
  if (Thread::current()->osthread() == osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   884
    // Restore caller's signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   885
    sigset_t sigmask = osthread->caller_sigmask();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   886
    pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   887
   }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   888
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   889
  delete osthread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   890
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   891
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   892
//////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   893
// thread local storage
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   894
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   895
int os::allocate_thread_local_storage() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   896
  pthread_key_t key;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   897
  int rslt = pthread_key_create(&key, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   898
  assert(rslt == 0, "cannot allocate thread local storage");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   899
  return (int)key;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   900
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   901
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   902
// Note: This is currently not used by VM, as we don't destroy TLS key
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   903
// on VM exit.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   904
void os::free_thread_local_storage(int index) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   905
  int rslt = pthread_key_delete((pthread_key_t)index);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   906
  assert(rslt == 0, "invalid index");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   907
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   908
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   909
void os::thread_local_storage_at_put(int index, void* value) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   910
  int rslt = pthread_setspecific((pthread_key_t)index, value);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   911
  assert(rslt == 0, "pthread_setspecific failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   912
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   913
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   914
extern "C" Thread* get_thread() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   915
  return ThreadLocalStorage::thread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   916
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   917
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   918
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   919
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   920
// time support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   921
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   922
// Time since start-up in seconds to a fine granularity.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   923
// Used by VMSelfDestructTimer and the MemProfiler.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   924
double os::elapsedTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   925
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   926
  return (double)(os::elapsed_counter()) * 0.000001;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   927
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   928
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   929
jlong os::elapsed_counter() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   930
  timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   931
  int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   932
  return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   933
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   934
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   935
jlong os::elapsed_frequency() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   936
  return (1000 * 1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   937
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   938
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   939
// XXX: For now, code this as if BSD does not support vtime.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   940
bool os::supports_vtime() { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   941
bool os::enable_vtime()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   942
bool os::vtime_enabled()  { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   943
double os::elapsedVTime() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   944
  // better than nothing, but not much
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   945
  return elapsedTime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   946
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   947
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   948
jlong os::javaTimeMillis() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   949
  timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   950
  int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   951
  assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   952
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   953
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   954
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   955
#ifndef CLOCK_MONOTONIC
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   956
#define CLOCK_MONOTONIC (1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   957
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   958
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   959
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   960
void os::Bsd::clock_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   961
        // XXXDARWIN: Investigate replacement monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   962
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
   963
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   964
void os::Bsd::clock_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   965
  struct timespec res;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   966
  struct timespec tp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   967
  if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   968
      ::clock_gettime(CLOCK_MONOTONIC, &tp)  == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   969
    // yes, monotonic clock is supported
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   970
    _clock_gettime = ::clock_gettime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   971
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   972
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   973
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   974
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   975
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   976
jlong os::javaTimeNanos() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   977
  if (Bsd::supports_monotonic_clock()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   978
    struct timespec tp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   979
    int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   980
    assert(status == 0, "gettime error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   981
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   982
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   983
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   984
    timeval time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   985
    int status = gettimeofday(&time, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   986
    assert(status != -1, "bsd error");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   987
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   988
    return 1000 * usecs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   989
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   990
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   991
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   992
void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   993
  if (Bsd::supports_monotonic_clock()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   994
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   995
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   996
    // CLOCK_MONOTONIC - amount of time since some arbitrary point in the past
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   997
    info_ptr->may_skip_backward = false;      // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   998
    info_ptr->may_skip_forward = false;       // not subject to resetting or drifting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
   999
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1000
    // gettimeofday - based on time in seconds since the Epoch thus does not wrap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1001
    info_ptr->max_value = ALL_64_BITS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1002
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1003
    // gettimeofday is a real time clock so it skips
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1004
    info_ptr->may_skip_backward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1005
    info_ptr->may_skip_forward = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1006
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1007
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1008
  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1009
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1010
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1011
// Return the real, user, and system times in seconds from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1012
// arbitrary fixed point in the past.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1013
bool os::getTimesSecs(double* process_real_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1014
                      double* process_user_time,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1015
                      double* process_system_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1016
  struct tms ticks;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1017
  clock_t real_ticks = times(&ticks);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1018
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1019
  if (real_ticks == (clock_t) (-1)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1020
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1021
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1022
    double ticks_per_second = (double) clock_tics_per_sec;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1023
    *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1024
    *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1025
    *process_real_time = ((double) real_ticks) / ticks_per_second;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1026
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1027
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1028
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1029
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1030
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1031
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1032
char * os::local_time_string(char *buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1033
  struct tm t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1034
  time_t long_time;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1035
  time(&long_time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1036
  localtime_r(&long_time, &t);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1037
  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1038
               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1039
               t.tm_hour, t.tm_min, t.tm_sec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1040
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1041
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1042
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1043
struct tm* os::localtime_pd(const time_t* clock, struct tm*  res) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1044
  return localtime_r(clock, res);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1045
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1046
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1047
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1048
// runtime exit support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1049
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1050
// Note: os::shutdown() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1051
// called from signal handler. Before adding something to os::shutdown(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1052
// sure it is async-safe and can handle partially initialized VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1053
void os::shutdown() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1054
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1055
  // allow PerfMemory to attempt cleanup of any persistent resources
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1056
  perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1057
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1058
  // needs to remove object in file system
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1059
  AttachListener::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1060
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1061
  // flush buffered output, finish log files
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1062
  ostream_abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1063
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1064
  // Check for abort hook
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1065
  abort_hook_t abort_hook = Arguments::abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1066
  if (abort_hook != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1067
    abort_hook();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1068
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1069
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1070
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1071
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1072
// Note: os::abort() might be called very early during initialization, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1073
// called from signal handler. Before adding something to os::abort(), make
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1074
// sure it is async-safe and can handle partially initialized VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1075
void os::abort(bool dump_core) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1076
  os::shutdown();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1077
  if (dump_core) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1078
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1079
    fdStream out(defaultStream::output_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1080
    out.print_raw("Current thread is ");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1081
    char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1082
    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1083
    out.print_raw_cr(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1084
    out.print_raw_cr("Dumping core ...");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1085
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1086
    ::abort(); // dump core
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1087
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1088
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1089
  ::exit(1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1090
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1091
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1092
// Die immediately, no exit hook, no abort hook, no cleanup.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1093
void os::die() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1094
  // _exit() on BsdThreads only kills current thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1095
  ::abort();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1096
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1097
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1098
// unused on bsd for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1099
void os::set_error_file(const char *logfile) {}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1100
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1101
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1102
// This method is a copy of JDK's sysGetLastErrorString
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1103
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1104
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1105
size_t os::lasterror(char *buf, size_t len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1106
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1107
  if (errno == 0)  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1108
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1109
  const char *s = ::strerror(errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1110
  size_t n = ::strlen(s);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1111
  if (n >= len) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1112
    n = len - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1113
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1114
  ::strncpy(buf, s, n);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1115
  buf[n] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1116
  return n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1117
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1118
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1119
intx os::current_thread_id() {
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1120
#ifdef __APPLE__
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1121
  return (intx)::mach_thread_self();
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1122
#else
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1123
  return (intx)::pthread_self();
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1124
#endif
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  1125
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1126
int os::current_process_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1127
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1128
  // Under the old bsd thread library, bsd gives each thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1129
  // its own process id. Because of this each thread will return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1130
  // a different pid if this method were to return the result
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1131
  // of getpid(2). Bsd provides no api that returns the pid
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1132
  // of the launcher thread for the vm. This implementation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1133
  // returns a unique pid, the pid of the launcher thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1134
  // that starts the vm 'process'.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1135
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1136
  // Under the NPTL, getpid() returns the same pid as the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1137
  // launcher thread rather than a unique pid per thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1138
  // Use gettid() if you want the old pre NPTL behaviour.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1139
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1140
  // if you are looking for the result of a call to getpid() that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1141
  // returns a unique pid for the calling thread, then look at the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1142
  // OSThread::thread_id() method in osThread_bsd.hpp file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1143
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1144
  return (int)(_initial_pid ? _initial_pid : getpid());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1145
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1146
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1147
// DLL functions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1148
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1149
#define JNI_LIB_PREFIX "lib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1150
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1151
#define JNI_LIB_SUFFIX ".dylib"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1152
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1153
#define JNI_LIB_SUFFIX ".so"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1154
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1155
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1156
const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1157
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1158
// This must be hard coded because it's the system's temporary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1159
// directory not the java application's temp directory, ala java.io.tmpdir.
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1160
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1161
// macosx has a secure per-user temporary directory
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1162
char temp_path_storage[PATH_MAX];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1163
const char* os::get_temp_directory() {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1164
  static char *temp_path = NULL;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1165
  if (temp_path == NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1166
    int pathSize = confstr(_CS_DARWIN_USER_TEMP_DIR, temp_path_storage, PATH_MAX);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1167
    if (pathSize == 0 || pathSize > PATH_MAX) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1168
      strlcpy(temp_path_storage, "/tmp/", sizeof(temp_path_storage));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1169
    }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1170
    temp_path = temp_path_storage;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1171
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1172
  return temp_path;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1173
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1174
#else /* __APPLE__ */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1175
const char* os::get_temp_directory() { return "/tmp"; }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1176
#endif /* __APPLE__ */
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1177
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1178
static bool file_exists(const char* filename) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1179
  struct stat statbuf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1180
  if (filename == NULL || strlen(filename) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1181
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1182
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1183
  return os::stat(filename, &statbuf) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1184
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1185
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1186
bool os::dll_build_name(char* buffer, size_t buflen,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1187
                        const char* pname, const char* fname) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1188
  bool retval = false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1189
  // Copied from libhpi
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1190
  const size_t pnamelen = pname ? strlen(pname) : 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1191
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1192
  // Return error on buffer overflow.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1193
  if (pnamelen + strlen(fname) + strlen(JNI_LIB_PREFIX) + strlen(JNI_LIB_SUFFIX) + 2 > buflen) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1194
    return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1195
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1196
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1197
  if (pnamelen == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1198
    snprintf(buffer, buflen, JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, fname);
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1199
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1200
  } else if (strchr(pname, *os::path_separator()) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1201
    int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1202
    char** pelements = split_path(pname, &n);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1203
    for (int i = 0 ; i < n ; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1204
      // Really shouldn't be NULL, but check can't hurt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1205
      if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1206
        continue; // skip the empty path values
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1207
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1208
      snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1209
          pelements[i], fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1210
      if (file_exists(buffer)) {
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1211
        retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1212
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1213
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1214
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1215
    // release the storage
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1216
    for (int i = 0 ; i < n ; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1217
      if (pelements[i] != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1218
        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1219
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1220
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1221
    if (pelements != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1222
      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1223
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1224
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1225
    snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1226
    retval = true;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1227
  }
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14286
diff changeset
  1228
  return retval;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1229
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1230
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1231
const char* os::get_current_directory(char *buf, int buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1232
  return getcwd(buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1233
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1234
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1235
// check if addr is inside libjvm.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1236
bool os::address_is_in_vm(address addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1237
  static address libjvm_base_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1238
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1239
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1240
  if (libjvm_base_addr == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1241
    dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1242
    libjvm_base_addr = (address)dlinfo.dli_fbase;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1243
    assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1244
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1245
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1246
  if (dladdr((void *)addr, &dlinfo)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1247
    if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1248
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1249
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1250
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1251
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1252
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1253
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1254
#define MACH_MAXSYMLEN 256
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1255
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1256
bool os::dll_address_to_function_name(address addr, char *buf,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1257
                                      int buflen, int *offset) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1258
  Dl_info dlinfo;
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1259
  char localbuf[MACH_MAXSYMLEN];
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1260
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1261
  // dladdr will find names of dynamic functions only, but does
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1262
  // it set dli_fbase with mach_header address when it "fails" ?
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1263
  if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1264
    if (buf != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1265
      if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1266
        jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1267
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1268
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1269
    if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1270
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1271
  } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1272
    if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
11485
f4225c55d338 7131050: fix for "7071311 Decoder enhancement" does not build on MacOS X
zgu
parents: 11402
diff changeset
  1273
       buf, buflen, offset, dlinfo.dli_fname)) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1274
       return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1275
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1276
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1277
13340
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1278
  // Handle non-dymanic manually:
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1279
  if (dlinfo.dli_fbase != NULL &&
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1280
      Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) {
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1281
    if(!Decoder::demangle(localbuf, buf, buflen)) {
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1282
      jio_snprintf(buf, buflen, "%s", localbuf);
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1283
    }
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1284
    return true;
40c424a6ff53 7186778: MachO decoder implementation for MacOSX
zgu
parents: 13198
diff changeset
  1285
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1286
  if (buf != NULL) buf[0] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1287
  if (offset != NULL) *offset = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1288
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1289
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1290
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1291
// ported from solaris version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1292
bool os::dll_address_to_library_name(address addr, char* buf,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1293
                                     int buflen, int* offset) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1294
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1295
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1296
  if (dladdr((void*)addr, &dlinfo)){
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1297
     if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1298
     if (offset) *offset = addr - (address)dlinfo.dli_fbase;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1299
     return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1300
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1301
     if (buf) buf[0] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1302
     if (offset) *offset = -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1303
     return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1304
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1305
}
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1306
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1307
// Loads .dll/.so and
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1308
// in case of error it checks if .dll/.so was built for the
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  1309
// same architecture as Hotspot is running on
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1310
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1311
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1312
void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1313
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1314
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1315
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1316
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1317
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1318
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1319
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1320
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1321
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1322
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1323
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1324
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1325
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1326
void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1327
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1328
  void * result= ::dlopen(filename, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1329
  if (result != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1330
    // Successful loading
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1331
    return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1332
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1333
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1334
  Elf32_Ehdr elf_head;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1335
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1336
  // Read system error message into ebuf
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1337
  // It may or may not be overwritten below
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1338
  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1339
  ebuf[ebuflen-1]='\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1340
  int diag_msg_max_length=ebuflen-strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1341
  char* diag_msg_buf=ebuf+strlen(ebuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1342
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1343
  if (diag_msg_max_length==0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1344
    // No more space in ebuf for additional diagnostics message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1345
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1346
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1347
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1348
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1349
  int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1350
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1351
  if (file_descriptor < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1352
    // Can't open library, report dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1353
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1354
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1355
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1356
  bool failed_to_read_elf_head=
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1357
    (sizeof(elf_head)!=
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1358
        (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1359
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1360
  ::close(file_descriptor);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1361
  if (failed_to_read_elf_head) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1362
    // file i/o error - report dlerror() msg
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1363
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1364
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1365
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1366
  typedef struct {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1367
    Elf32_Half  code;         // Actual value as defined in elf.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1368
    Elf32_Half  compat_class; // Compatibility of archs at VM's sense
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1369
    char        elf_class;    // 32 or 64 bit
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1370
    char        endianess;    // MSB or LSB
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1371
    char*       name;         // String representation
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1372
  } arch_t;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1373
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1374
  #ifndef EM_486
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1375
  #define EM_486          6               /* Intel 80486 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1376
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1377
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1378
  #ifndef EM_MIPS_RS3_LE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1379
  #define EM_MIPS_RS3_LE  10              /* MIPS */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1380
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1381
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1382
  #ifndef EM_PPC64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1383
  #define EM_PPC64        21              /* PowerPC64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1384
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1385
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1386
  #ifndef EM_S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1387
  #define EM_S390         22              /* IBM System/390 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1388
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1389
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1390
  #ifndef EM_IA_64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1391
  #define EM_IA_64        50              /* HP/Intel IA-64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1392
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1393
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1394
  #ifndef EM_X86_64
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1395
  #define EM_X86_64       62              /* AMD x86-64 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1396
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1397
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1398
  static const arch_t arch_array[]={
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1399
    {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1400
    {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1401
    {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1402
    {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1403
    {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1404
    {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1405
    {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1406
    {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1407
    {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1408
    {EM_ARM,         EM_ARM,     ELFCLASS32,   ELFDATA2LSB, (char*)"ARM"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1409
    {EM_S390,        EM_S390,    ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1410
    {EM_ALPHA,       EM_ALPHA,   ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1411
    {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1412
    {EM_MIPS,        EM_MIPS,    ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1413
    {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1414
    {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1415
  };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1416
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1417
  #if  (defined IA32)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1418
    static  Elf32_Half running_arch_code=EM_386;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1419
  #elif   (defined AMD64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1420
    static  Elf32_Half running_arch_code=EM_X86_64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1421
  #elif  (defined IA64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1422
    static  Elf32_Half running_arch_code=EM_IA_64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1423
  #elif  (defined __sparc) && (defined _LP64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1424
    static  Elf32_Half running_arch_code=EM_SPARCV9;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1425
  #elif  (defined __sparc) && (!defined _LP64)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1426
    static  Elf32_Half running_arch_code=EM_SPARC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1427
  #elif  (defined __powerpc64__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1428
    static  Elf32_Half running_arch_code=EM_PPC64;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1429
  #elif  (defined __powerpc__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1430
    static  Elf32_Half running_arch_code=EM_PPC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1431
  #elif  (defined ARM)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1432
    static  Elf32_Half running_arch_code=EM_ARM;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1433
  #elif  (defined S390)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1434
    static  Elf32_Half running_arch_code=EM_S390;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1435
  #elif  (defined ALPHA)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1436
    static  Elf32_Half running_arch_code=EM_ALPHA;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1437
  #elif  (defined MIPSEL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1438
    static  Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1439
  #elif  (defined PARISC)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1440
    static  Elf32_Half running_arch_code=EM_PARISC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1441
  #elif  (defined MIPS)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1442
    static  Elf32_Half running_arch_code=EM_MIPS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1443
  #elif  (defined M68K)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1444
    static  Elf32_Half running_arch_code=EM_68K;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1445
  #else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1446
    #error Method os::dll_load requires that one of following is defined:\
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1447
         IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1448
  #endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1449
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1450
  // Identify compatability class for VM's architecture and library's architecture
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1451
  // Obtain string descriptions for architectures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1452
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1453
  arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1454
  int running_arch_index=-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1455
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1456
  for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1457
    if (running_arch_code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1458
      running_arch_index    = i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1459
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1460
    if (lib_arch.code == arch_array[i].code) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1461
      lib_arch.compat_class = arch_array[i].compat_class;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1462
      lib_arch.name         = arch_array[i].name;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1463
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1464
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1465
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1466
  assert(running_arch_index != -1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1467
    "Didn't find running architecture code (running_arch_code) in arch_array");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1468
  if (running_arch_index == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1469
    // Even though running architecture detection failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1470
    // we may still continue with reporting dlerror() message
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1471
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1472
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1473
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1474
  if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1475
    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1476
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1477
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1478
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1479
#ifndef S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1480
  if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1481
    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1482
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1483
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1484
#endif // !S390
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1485
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1486
  if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1487
    if ( lib_arch.name!=NULL ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1488
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1489
        " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1490
        lib_arch.name, arch_array[running_arch_index].name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1491
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1492
      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1493
      " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1494
        lib_arch.code,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1495
        arch_array[running_arch_index].name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1496
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1497
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1498
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1499
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1500
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1501
#endif /* !__APPLE__ */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1502
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1503
// XXX: Do we need a lock around this as per Linux?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1504
void* os::dll_lookup(void* handle, const char* name) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1505
  return dlsym(handle, name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1506
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1507
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1508
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1509
static bool _print_ascii_file(const char* filename, outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1510
  int fd = ::open(filename, O_RDONLY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1511
  if (fd == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1512
     return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1513
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1514
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1515
  char buf[32];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1516
  int bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1517
  while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1518
    st->print_raw(buf, bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1519
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1520
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1521
  ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1522
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1523
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1524
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1525
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1526
void os::print_dll_info(outputStream *st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1527
   st->print_cr("Dynamic libraries:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1528
#ifdef RTLD_DI_LINKMAP
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1529
    Dl_info dli;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1530
    void *handle;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1531
    Link_map *map;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1532
    Link_map *p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1533
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1534
    if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1535
        st->print_cr("Error: Cannot print dynamic libraries.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1536
        return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1537
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1538
    handle = dlopen(dli.dli_fname, RTLD_LAZY);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1539
    if (handle == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1540
        st->print_cr("Error: Cannot print dynamic libraries.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1541
        return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1542
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1543
    dlinfo(handle, RTLD_DI_LINKMAP, &map);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1544
    if (map == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1545
        st->print_cr("Error: Cannot print dynamic libraries.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1546
        return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1547
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1548
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1549
    while (map->l_prev != NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1550
        map = map->l_prev;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1551
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1552
    while (map != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1553
        st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1554
        map = map->l_next;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1555
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1556
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1557
    dlclose(handle);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1558
#elif defined(__APPLE__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1559
    uint32_t count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1560
    uint32_t i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1561
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1562
    count = _dyld_image_count();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1563
    for (i = 1; i < count; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1564
        const char *name = _dyld_get_image_name(i);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1565
        intptr_t slide = _dyld_get_image_vmaddr_slide(i);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1566
        st->print_cr(PTR_FORMAT " \t%s", slide, name);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1567
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1568
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1569
   st->print_cr("Error: Cannot print dynamic libraries.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1570
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1571
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1572
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1573
void os::print_os_info_brief(outputStream* st) {
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1574
  st->print("Bsd");
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1575
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1576
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1577
}
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1578
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1579
void os::print_os_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1580
  st->print("OS:");
12735
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1581
  st->print("Bsd");
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1582
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1583
  os::Posix::print_uname_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1584
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1585
  os::Posix::print_rlimit_info(st);
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1586
3e2e491f4f69 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 12101
diff changeset
  1587
  os::Posix::print_load_average(st);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1588
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1589
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1590
void os::pd_print_cpu_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1591
  // Nothing to do for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1592
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1593
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1594
void os::print_memory_info(outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1595
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1596
  st->print("Memory:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1597
  st->print(" %dk page", os::vm_page_size()>>10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1598
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1599
  st->print(", physical " UINT64_FORMAT "k",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1600
            os::physical_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1601
  st->print("(" UINT64_FORMAT "k free)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1602
            os::available_memory() >> 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1603
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1604
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1605
  // meminfo
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1606
  st->print("\n/proc/meminfo:\n");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1607
  _print_ascii_file("/proc/meminfo", st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1608
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1609
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1610
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1611
// Taken from /usr/include/bits/siginfo.h  Supposed to be architecture specific
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1612
// but they're the same for all the bsd arch that we support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1613
// and they're the same for solaris but there's no common place to put this.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1614
const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1615
                          "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1616
                          "ILL_COPROC", "ILL_BADSTK" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1617
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1618
const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1619
                          "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1620
                          "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1621
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1622
const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1623
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1624
const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1625
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1626
void os::print_siginfo(outputStream* st, void* siginfo) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1627
  st->print("siginfo:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1628
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1629
  const int buflen = 100;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1630
  char buf[buflen];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1631
  siginfo_t *si = (siginfo_t*)siginfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1632
  st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1633
  if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1634
    st->print("si_errno=%s", buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1635
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1636
    st->print("si_errno=%d", si->si_errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1637
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1638
  const int c = si->si_code;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1639
  assert(c > 0, "unexpected si_code");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1640
  switch (si->si_signo) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1641
  case SIGILL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1642
    st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1643
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1644
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1645
  case SIGFPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1646
    st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1647
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1648
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1649
  case SIGSEGV:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1650
    st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1651
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1652
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1653
  case SIGBUS:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1654
    st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1655
    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1656
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1657
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1658
    st->print(", si_code=%d", si->si_code);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1659
    // no si_addr
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1660
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1661
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1662
  if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1663
      UseSharedSpaces) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1664
    FileMapInfo* mapinfo = FileMapInfo::current_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1665
    if (mapinfo->is_in_shared_space(si->si_addr)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1666
      st->print("\n\nError accessing class data sharing archive."   \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1667
                " Mapped file inaccessible during execution, "      \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1668
                " possible disk/network problem.");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1669
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1670
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1671
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1672
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1673
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1674
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1675
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1676
                                 char* buf, size_t buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1677
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1678
void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1679
  st->print_cr("Signal Handlers:");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1680
  print_signal_handler(st, SIGSEGV, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1681
  print_signal_handler(st, SIGBUS , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1682
  print_signal_handler(st, SIGFPE , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1683
  print_signal_handler(st, SIGPIPE, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1684
  print_signal_handler(st, SIGXFSZ, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1685
  print_signal_handler(st, SIGILL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1686
  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1687
  print_signal_handler(st, SR_signum, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1688
  print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1689
  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1690
  print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1691
  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1692
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1693
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1694
static char saved_jvm_path[MAXPATHLEN] = {0};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1695
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1696
// Find the full path to the current module, libjvm
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1697
void os::jvm_path(char *buf, jint buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1698
  // Error checking.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1699
  if (buflen < MAXPATHLEN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1700
    assert(false, "must use a large-enough buffer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1701
    buf[0] = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1702
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1703
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1704
  // Lazy resolve the path to current module.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1705
  if (saved_jvm_path[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1706
    strcpy(buf, saved_jvm_path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1707
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1708
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1709
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1710
  char dli_fname[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1711
  bool ret = dll_address_to_library_name(
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1712
                CAST_FROM_FN_PTR(address, os::jvm_path),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1713
                dli_fname, sizeof(dli_fname), NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1714
  assert(ret != 0, "cannot locate libjvm");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1715
  char *rp = realpath(dli_fname, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1716
  if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1717
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1718
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1719
  if (Arguments::created_by_gamma_launcher()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1720
    // Support for the gamma launcher.  Typical value for buf is
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1721
    // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm".  If "/jre/lib/" appears at
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1722
    // the right place in the string, then assume we are installed in a JDK and
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1723
    // we're done.  Otherwise, check for a JAVA_HOME environment variable and
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1724
    // construct a path to the JVM being overridden.
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1725
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1726
    const char *p = buf + strlen(buf) - 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1727
    for (int count = 0; p > buf && count < 5; ++count) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1728
      for (--p; p > buf && *p != '/'; --p)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1729
        /* empty */ ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1730
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1732
    if (strncmp(p, "/jre/lib/", 9) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1733
      // Look for JAVA_HOME in the environment.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1734
      char* java_home_var = ::getenv("JAVA_HOME");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1735
      if (java_home_var != NULL && java_home_var[0] != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1736
        char* jrelib_p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1737
        int len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1738
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1739
        // Check the current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1740
        p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1741
        assert(strstr(p, "/libjvm") == p, "invalid library name");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1742
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1743
        rp = realpath(java_home_var, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1744
        if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1745
          return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1746
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1747
        // determine if this is a legacy image or modules image
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1748
        // modules image doesn't have "jre" subdirectory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1749
        len = strlen(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1750
        jrelib_p = buf + len;
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1751
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1752
        // Add the appropriate library subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1753
        snprintf(jrelib_p, buflen-len, "/jre/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1754
        if (0 != access(buf, F_OK)) {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1755
          snprintf(jrelib_p, buflen-len, "/lib");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1756
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1757
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1758
        // Add the appropriate client or server subdir
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1759
        len = strlen(buf);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1760
        jrelib_p = buf + len;
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1761
        snprintf(jrelib_p, buflen-len, "/%s", COMPILER_VARIANT);
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1762
        if (0 != access(buf, F_OK)) {
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1763
          snprintf(jrelib_p, buflen-len, "");
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1764
        }
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1765
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1766
        // If the path exists within JAVA_HOME, add the JVM library name
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1767
        // to complete the path to JVM being overridden.  Otherwise fallback
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1768
        // to the path to the current library.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1769
        if (0 == access(buf, F_OK)) {
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1770
          // Use current module name "libjvm"
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1771
          len = strlen(buf);
15096
3db45569f8c0 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 14633
diff changeset
  1772
          snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1773
        } else {
11593
288a647ff773 7125793: MAC: test_gamma should always work
phh
parents: 11485
diff changeset
  1774
          // Fall back to path of current library
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1775
          rp = realpath(dli_fname, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1776
          if (rp == NULL)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1777
            return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1778
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1779
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1780
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1781
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1782
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1783
  strcpy(saved_jvm_path, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1784
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1785
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1786
void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1787
  // no prefix required, not even "_"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1788
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1789
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1790
void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1791
  // no suffix required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1792
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1793
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1794
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1795
// sun.misc.Signal support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1796
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1797
static volatile jint sigint_count = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1798
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1799
static void
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1800
UserHandler(int sig, void *siginfo, void *context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1801
  // 4511530 - sem_post is serialized and handled by the manager thread. When
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1802
  // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1803
  // don't want to flood the manager thread with sem_post requests.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1804
  if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1805
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1806
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1807
  // Ctrl-C is pressed during error reporting, likely because the error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1808
  // handler fails to abort. Let VM die immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1809
  if (sig == SIGINT && is_error_reported()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1810
     os::die();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1811
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1812
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1813
  os::signal_notify(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1814
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1815
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1816
void* os::user_handler() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1817
  return CAST_FROM_FN_PTR(void*, UserHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1818
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1819
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1820
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1821
  typedef void (*sa_handler_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1822
  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1823
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1824
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1825
void* os::signal(int signal_number, void* handler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1826
  struct sigaction sigAct, oldSigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1827
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1828
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1829
  sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1830
  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1831
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1832
  if (sigaction(signal_number, &sigAct, &oldSigAct)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1833
    // -1 means registration failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1834
    return (void *)-1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1835
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1836
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1837
  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1838
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1839
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1840
void os::signal_raise(int signal_number) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1841
  ::raise(signal_number);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1842
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1843
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1844
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1845
 * The following code is moved from os.cpp for making this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1846
 * code platform specific, which it is by its very nature.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1847
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1848
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1849
// Will be modified when max signal is changed to be dynamic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1850
int os::sigexitnum_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1851
  return NSIG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1852
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1853
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1854
// a counter for each possible signal value
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1855
static volatile jint pending_signals[NSIG+1] = { 0 };
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1856
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1857
// Bsd(POSIX) specific hand shaking semaphore.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1858
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1859
static semaphore_t sig_sem;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1860
#define SEM_INIT(sem, value)    semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1861
#define SEM_WAIT(sem)           semaphore_wait(sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1862
#define SEM_POST(sem)           semaphore_signal(sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1863
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1864
static sem_t sig_sem;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1865
#define SEM_INIT(sem, value)    sem_init(&sem, 0, value)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1866
#define SEM_WAIT(sem)           sem_wait(&sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1867
#define SEM_POST(sem)           sem_post(&sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1868
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1869
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1870
void os::signal_init_pd() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1871
  // Initialize signal structures
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1872
  ::memset((void*)pending_signals, 0, sizeof(pending_signals));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1873
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1874
  // Initialize signal semaphore
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1875
  ::SEM_INIT(sig_sem, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1876
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1877
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1878
void os::signal_notify(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1879
  Atomic::inc(&pending_signals[sig]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1880
  ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1881
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1882
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1883
static int check_pending_signals(bool wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1884
  Atomic::store(0, &sigint_count);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1885
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1886
    for (int i = 0; i < NSIG + 1; i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1887
      jint n = pending_signals[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1888
      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1889
        return i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1890
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1891
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1892
    if (!wait) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1893
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1894
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1895
    JavaThread *thread = JavaThread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1896
    ThreadBlockInVM tbivm(thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1897
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1898
    bool threadIsSuspended;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1899
    do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1900
      thread->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1901
      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1902
      ::SEM_WAIT(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1903
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1904
      // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1905
      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1906
      if (threadIsSuspended) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1907
        //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1908
        // The semaphore has been incremented, but while we were waiting
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1909
        // another thread suspended us. We don't want to continue running
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1910
        // while suspended because that would surprise the thread that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1911
        // suspended us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1912
        //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1913
        ::SEM_POST(sig_sem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1914
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1915
        thread->java_suspend_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1916
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1917
    } while (threadIsSuspended);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1918
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1919
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1920
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1921
int os::signal_lookup() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1922
  return check_pending_signals(false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1923
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1924
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1925
int os::signal_wait() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1926
  return check_pending_signals(true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1927
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1928
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1929
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1930
// Virtual Memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1931
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1932
int os::vm_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1933
  // Seems redundant as all get out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1934
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1935
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1936
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1937
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1938
// Solaris allocates memory by pages.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1939
int os::vm_allocation_granularity() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1940
  assert(os::Bsd::page_size() != -1, "must call os::init");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1941
  return os::Bsd::page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1942
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1943
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1944
// Rationale behind this function:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1945
//  current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1946
//  mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1947
//  samples for JITted code. Here we create private executable mapping over the code cache
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1948
//  and then we can use standard (well, almost, as mapping can change) way to provide
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1949
//  info for the reporting script by storing timestamp and location of symbol
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1950
void bsd_wrap_code(char* base, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1951
  static volatile jint cnt = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1952
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1953
  if (!UseOprofile) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1954
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1955
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1956
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1957
  char buf[PATH_MAX + 1];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1958
  int num = Atomic::add(1, &cnt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1959
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1960
  snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1961
           os::get_temp_directory(), os::current_process_id(), num);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1962
  unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1963
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1964
  int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1965
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1966
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1967
    off_t rv = ::lseek(fd, size-2, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1968
    if (rv != (off_t)-1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1969
      if (::write(fd, "", 1) == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1970
        mmap(base, size,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1971
             PROT_READ|PROT_WRITE|PROT_EXEC,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1972
             MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1973
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1974
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1975
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1976
    unlink(buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1977
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1978
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1979
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1980
// NOTE: Bsd kernel does not really reserve the pages for us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1981
//       All it does is to check if there are enough free pages
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1982
//       left at the time of mmap(). This could be a potential
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1983
//       problem.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1984
bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1985
  int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1986
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1987
  // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1988
  return ::mprotect(addr, size, prot) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1989
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1990
  uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1991
                                   MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1992
  return res != (uintptr_t) MAP_FAILED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1993
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1994
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1995
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1996
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  1997
bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1998
                       bool exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  1999
  return commit_memory(addr, size, exec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2000
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2001
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2002
void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2003
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2004
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2005
void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2006
  ::madvise(addr, bytes, MADV_DONTNEED);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2007
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2008
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2009
void os::numa_make_global(char *addr, size_t bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2010
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2011
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2012
void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2013
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2014
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2015
bool os::numa_topology_changed()   { return false; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2016
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2017
size_t os::numa_get_groups_num() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2018
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2019
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2020
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2021
int os::numa_get_group_id() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2022
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2023
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2024
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2025
size_t os::numa_get_leaf_groups(int *ids, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2026
  if (size > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2027
    ids[0] = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2028
    return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2029
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2030
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2031
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2032
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2033
bool os::get_page_info(char *start, page_info* info) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2034
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2035
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2036
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2037
char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2038
  return end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2039
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2040
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2041
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2042
bool os::pd_uncommit_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2043
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2044
  // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2045
  return ::mprotect(addr, size, PROT_NONE) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2046
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2047
  uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2048
                MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2049
  return res  != (uintptr_t) MAP_FAILED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2050
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2051
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2052
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2053
bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2054
  return os::commit_memory(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2055
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2056
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2057
// If this is a growable mapping, remove the guard pages entirely by
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2058
// munmap()ping them.  If not, just call uncommit_memory().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2059
bool os::remove_stack_guard_pages(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2060
  return os::uncommit_memory(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2061
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2062
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2063
static address _highest_vm_reserved_address = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2064
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2065
// If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2066
// at 'requested_addr'. If there are existing memory mappings at the same
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2067
// location, however, they will be overwritten. If 'fixed' is false,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2068
// 'requested_addr' is only treated as a hint, the return value may or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2069
// may not start from the requested address. Unlike Bsd mmap(), this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2070
// function returns NULL to indicate failure.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2071
static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2072
  char * addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2073
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2074
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2075
  flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2076
  if (fixed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2077
    assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2078
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2079
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2080
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2081
  // Map uncommitted pages PROT_READ and PROT_WRITE, change access
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2082
  // to PROT_EXEC if executable when we commit the page.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2083
  addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2084
                       flags, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2085
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2086
  if (addr != MAP_FAILED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2087
    // anon_mmap() should only get called during VM initialization,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2088
    // don't need lock (actually we can skip locking even it can be called
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2089
    // from multiple threads, because _highest_vm_reserved_address is just a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2090
    // hint about the upper limit of non-stack memory regions.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2091
    if ((address)addr + bytes > _highest_vm_reserved_address) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2092
      _highest_vm_reserved_address = (address)addr + bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2093
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2094
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2095
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2096
  return addr == MAP_FAILED ? NULL : addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2097
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2098
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2099
// Don't update _highest_vm_reserved_address, because there might be memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2100
// regions above addr + size. If so, releasing a memory region only creates
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2101
// a hole in the address space, it doesn't help prevent heap-stack collision.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2102
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2103
static int anon_munmap(char * addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2104
  return ::munmap(addr, size) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2105
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2106
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2107
char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2108
                         size_t alignment_hint) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2109
  return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2110
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2111
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2112
bool os::pd_release_memory(char* addr, size_t size) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2113
  return anon_munmap(addr, size);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2114
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2115
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2116
static address highest_vm_reserved_address() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2117
  return _highest_vm_reserved_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2118
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2119
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2120
static bool bsd_mprotect(char* addr, size_t size, int prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2121
  // Bsd wants the mprotect address argument to be page aligned.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2122
  char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2123
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2124
  // According to SUSv3, mprotect() should only be used with mappings
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2125
  // established by mmap(), and mmap() always maps whole pages. Unaligned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2126
  // 'addr' likely indicates problem in the VM (e.g. trying to change
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2127
  // protection of malloc'ed or statically allocated memory). Check the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2128
  // caller if you hit this assert.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2129
  assert(addr == bottom, "sanity check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2130
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2131
  size = align_size_up(pointer_delta(addr, bottom, 1) + size, os::Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2132
  return ::mprotect(bottom, size, prot) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2133
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2134
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2135
// Set protections specified
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2136
bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2137
                        bool is_committed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2138
  unsigned int p = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2139
  switch (prot) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2140
  case MEM_PROT_NONE: p = PROT_NONE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2141
  case MEM_PROT_READ: p = PROT_READ; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2142
  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2143
  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2144
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2145
    ShouldNotReachHere();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2146
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2147
  // is_committed is unused.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2148
  return bsd_mprotect(addr, bytes, p);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2149
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2150
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2151
bool os::guard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2152
  return bsd_mprotect(addr, size, PROT_NONE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2153
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2154
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2155
bool os::unguard_memory(char* addr, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2156
  return bsd_mprotect(addr, size, PROT_READ|PROT_WRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2157
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2158
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2159
bool os::Bsd::hugetlbfs_sanity_check(bool warn, size_t page_size) {
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2160
  return false;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2161
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2162
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2163
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2164
* Set the coredump_filter bits to include largepages in core dump (bit 6)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2165
*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2166
* From the coredump_filter documentation:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2167
*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2168
* - (bit 0) anonymous private memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2169
* - (bit 1) anonymous shared memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2170
* - (bit 2) file-backed private memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2171
* - (bit 3) file-backed shared memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2172
* - (bit 4) ELF header pages in file-backed private memory areas (it is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2173
*           effective only if the bit 2 is cleared)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2174
* - (bit 5) hugetlb private memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2175
* - (bit 6) hugetlb shared memory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2176
*/
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2177
static void set_coredump_filter(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2178
  FILE *f;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2179
  long cdm;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2180
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2181
  if ((f = fopen("/proc/self/coredump_filter", "r+")) == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2182
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2183
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2184
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2185
  if (fscanf(f, "%lx", &cdm) != 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2186
    fclose(f);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2187
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2188
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2189
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2190
  rewind(f);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2191
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2192
  if ((cdm & LARGEPAGES_BIT) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2193
    cdm |= LARGEPAGES_BIT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2194
    fprintf(f, "%#lx", cdm);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2195
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2196
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2197
  fclose(f);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2198
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2199
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2200
// Large page support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2201
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2202
static size_t _large_page_size = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2203
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2204
void os::large_page_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2205
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2206
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2207
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2208
char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2209
  // "exec" is passed in but not used.  Creating the shared image for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2210
  // the code cache doesn't have an SHM_X executable permission to check.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2211
  assert(UseLargePages && UseSHM, "only for SHM large pages");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2212
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2213
  key_t key = IPC_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2214
  char *addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2215
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2216
  bool warn_on_failure = UseLargePages &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2217
                        (!FLAG_IS_DEFAULT(UseLargePages) ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2218
                         !FLAG_IS_DEFAULT(LargePageSizeInBytes)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2219
                        );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2220
  char msg[128];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2221
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2222
  // Create a large shared memory region to attach to based on size.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2223
  // Currently, size is the total size of the heap
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2224
  int shmid = shmget(key, bytes, IPC_CREAT|SHM_R|SHM_W);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2225
  if (shmid == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2226
     // Possible reasons for shmget failure:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2227
     // 1. shmmax is too small for Java heap.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2228
     //    > check shmmax value: cat /proc/sys/kernel/shmmax
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2229
     //    > increase shmmax value: echo "0xffffffff" > /proc/sys/kernel/shmmax
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2230
     // 2. not enough large page memory.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2231
     //    > check available large pages: cat /proc/meminfo
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2232
     //    > increase amount of large pages:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2233
     //          echo new_value > /proc/sys/vm/nr_hugepages
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2234
     //      Note 1: different Bsd may use different name for this property,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2235
     //            e.g. on Redhat AS-3 it is "hugetlb_pool".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2236
     //      Note 2: it's possible there's enough physical memory available but
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2237
     //            they are so fragmented after a long run that they can't
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2238
     //            coalesce into large pages. Try to reserve large pages when
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2239
     //            the system is still "fresh".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2240
     if (warn_on_failure) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2241
       jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2242
       warning(msg);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2243
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2244
     return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2245
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2246
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2247
  // attach to the region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2248
  addr = (char*)shmat(shmid, req_addr, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2249
  int err = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2250
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2251
  // Remove shmid. If shmat() is successful, the actual shared memory segment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2252
  // will be deleted when it's detached by shmdt() or when the process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2253
  // terminates. If shmat() is not successful this will remove the shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2254
  // segment immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2255
  shmctl(shmid, IPC_RMID, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2256
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2257
  if ((intptr_t)addr == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2258
     if (warn_on_failure) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2259
       jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2260
       warning(msg);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2261
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2262
     return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2263
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2264
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2265
  // The memory is committed
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2266
  address pc = CALLER_PC;
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2267
  MemTracker::record_virtual_memory_reserve((address)addr, bytes, pc);
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2268
  MemTracker::record_virtual_memory_commit((address)addr, bytes, pc);
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2269
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2270
  return addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2271
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2272
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2273
bool os::release_memory_special(char* base, size_t bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2274
  // detaching the SHM segment will also delete it, see reserve_memory_special()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2275
  int rslt = shmdt(base);
15927
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2276
  if (rslt == 0) {
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2277
    MemTracker::record_virtual_memory_uncommit((address)base, bytes);
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2278
    MemTracker::record_virtual_memory_release((address)base, bytes);
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2279
    return true;
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2280
  } else {
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2281
    return false;
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2282
  }
f256c20146f4 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 15855
diff changeset
  2283
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2284
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2285
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2286
size_t os::large_page_size() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2287
  return _large_page_size;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2288
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2289
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2290
// HugeTLBFS allows application to commit large page memory on demand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2291
// with SysV SHM the entire memory region must be allocated as shared
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2292
// memory.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2293
bool os::can_commit_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2294
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2295
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2296
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2297
bool os::can_execute_large_page_memory() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2298
  return UseHugeTLBFS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2299
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2300
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2301
// Reserve memory at an arbitrary address, only if that area is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2302
// available (and not reserved for something else).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2303
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  2304
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2305
  const int max_tries = 10;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2306
  char* base[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2307
  size_t size[max_tries];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2308
  const size_t gap = 0x000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2309
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2310
  // Assert only that the size is a multiple of the page size, since
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2311
  // that's all that mmap requires, and since that's all we really know
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2312
  // about at this low abstraction level.  If we need higher alignment,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2313
  // we can either pass an alignment to this method or verify alignment
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2314
  // in one of the methods further up the call chain.  See bug 5044738.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2315
  assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2316
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2317
  // Repeatedly allocate blocks until the block is allocated at the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2318
  // right spot. Give up after max_tries. Note that reserve_memory() will
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2319
  // automatically update _highest_vm_reserved_address if the call is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2320
  // successful. The variable tracks the highest memory address every reserved
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2321
  // by JVM. It is used to detect heap-stack collision if running with
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2322
  // fixed-stack BsdThreads. Because here we may attempt to reserve more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2323
  // space than needed, it could confuse the collision detecting code. To
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2324
  // solve the problem, save current _highest_vm_reserved_address and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2325
  // calculate the correct value before return.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2326
  address old_highest = _highest_vm_reserved_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2327
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2328
  // Bsd mmap allows caller to pass an address as hint; give it a try first,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2329
  // if kernel honors the hint then we can return immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2330
  char * addr = anon_mmap(requested_addr, bytes, false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2331
  if (addr == requested_addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2332
     return requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2333
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2334
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2335
  if (addr != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2336
     // mmap() is successful but it fails to reserve at the requested address
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2337
     anon_munmap(addr, bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2338
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2339
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2340
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2341
  for (i = 0; i < max_tries; ++i) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2342
    base[i] = reserve_memory(bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2343
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2344
    if (base[i] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2345
      // Is this the block we wanted?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2346
      if (base[i] == requested_addr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2347
        size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2348
        break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2349
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2350
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2351
      // Does this overlap the block we wanted? Give back the overlapped
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2352
      // parts and try again.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2353
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2354
      size_t top_overlap = requested_addr + (bytes + gap) - base[i];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2355
      if (top_overlap >= 0 && top_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2356
        unmap_memory(base[i], top_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2357
        base[i] += top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2358
        size[i] = bytes - top_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2359
      } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2360
        size_t bottom_overlap = base[i] + bytes - requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2361
        if (bottom_overlap >= 0 && bottom_overlap < bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2362
          unmap_memory(requested_addr, bottom_overlap);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2363
          size[i] = bytes - bottom_overlap;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2364
        } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2365
          size[i] = bytes;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2366
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2367
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2368
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2369
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2370
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2371
  // Give back the unused reserved pieces.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2372
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2373
  for (int j = 0; j < i; ++j) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2374
    if (base[j] != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2375
      unmap_memory(base[j], size[j]);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2376
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2377
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2378
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2379
  if (i < max_tries) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2380
    _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2381
    return requested_addr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2382
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2383
    _highest_vm_reserved_address = old_highest;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2384
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2385
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2386
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2387
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2388
size_t os::read(int fd, void *buf, unsigned int nBytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2389
  RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2390
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2391
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2392
// TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2393
// Solaris uses poll(), bsd uses park().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2394
// Poll() is likely a better choice, assuming that Thread.interrupt()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2395
// generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2396
// SIGSEGV, see 4355769.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2397
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2398
int os::sleep(Thread* thread, jlong millis, bool interruptible) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2399
  assert(thread == Thread::current(),  "thread consistency check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2400
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2401
  ParkEvent * const slp = thread->_SleepEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2402
  slp->reset() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2403
  OrderAccess::fence() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2404
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2405
  if (interruptible) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2406
    jlong prevtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2407
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2408
    for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2409
      if (os::is_interrupted(thread, true)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2410
        return OS_INTRPT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2411
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2412
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2413
      jlong newtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2414
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2415
      if (newtime - prevtime < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2416
        // time moving backwards, should only happen if no monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2417
        // not a guarantee() because JVM should not abort on kernel/glibc bugs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2418
        assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2419
      } else {
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11161
diff changeset
  2420
        millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2421
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2422
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2423
      if(millis <= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2424
        return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2425
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2426
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2427
      prevtime = newtime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2428
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2429
      {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2430
        assert(thread->is_Java_thread(), "sanity check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2431
        JavaThread *jt = (JavaThread *) thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2432
        ThreadBlockInVM tbivm(jt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2433
        OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2434
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2435
        jt->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2436
        // cleared by handle_special_suspend_equivalent_condition() or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2437
        // java_suspend_self() via check_and_wait_while_suspended()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2438
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2439
        slp->park(millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2440
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2441
        // were we externally suspended while we were waiting?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2442
        jt->check_and_wait_while_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2443
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2444
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2445
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2446
    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2447
    jlong prevtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2448
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2449
    for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2450
      // It'd be nice to avoid the back-to-back javaTimeNanos() calls on
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2451
      // the 1st iteration ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2452
      jlong newtime = javaTimeNanos();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2453
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2454
      if (newtime - prevtime < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2455
        // time moving backwards, should only happen if no monotonic clock
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2456
        // not a guarantee() because JVM should not abort on kernel/glibc bugs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2457
        assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2458
      } else {
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11161
diff changeset
  2459
        millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2460
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2461
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2462
      if(millis <= 0) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2463
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2464
      prevtime = newtime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2465
      slp->park(millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2466
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2467
    return OS_OK ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2468
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2469
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2470
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2471
int os::naked_sleep() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2472
  // %% make the sleep time an integer flag. for now use 1 millisec.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2473
  return os::sleep(Thread::current(), 1, false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2474
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2475
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2476
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2477
void os::infinite_sleep() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2478
  while (true) {    // sleep forever ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2479
    ::sleep(100);   // ... 100 seconds at a time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2480
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2481
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2482
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2483
// Used to convert frequent JVM_Yield() to nops
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2484
bool os::dont_yield() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2485
  return DontYieldALot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2486
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2487
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2488
void os::yield() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2489
  sched_yield();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2490
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2491
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2492
os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2493
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2494
void os::yield_all(int attempts) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2495
  // Yields to all threads, including threads with lower priorities
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2496
  // Threads on Bsd are all with same priority. The Solaris style
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2497
  // os::yield_all() with nanosleep(1ms) is not necessary.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2498
  sched_yield();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2499
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2500
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2501
// Called from the tight loops to possibly influence time-sharing heuristics
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2502
void os::loop_breaker(int attempts) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2503
  os::yield_all(attempts);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2504
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2505
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2506
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2507
// thread priority support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2508
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2509
// Note: Normal Bsd applications are run with SCHED_OTHER policy. SCHED_OTHER
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2510
// only supports dynamic priority, static priority must be zero. For real-time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2511
// applications, Bsd supports SCHED_RR which allows static priority (1-99).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2512
// However, for large multi-threaded applications, SCHED_RR is not only slower
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2513
// than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2514
// of 5 runs - Sep 2005).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2515
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2516
// The following code actually changes the niceness of kernel-thread/LWP. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2517
// has an assumption that setpriority() only modifies one kernel-thread/LWP,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2518
// not the entire user process, and user level threads are 1:1 mapped to kernel
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2519
// threads. It has always been the case, but could change in the future. For
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2520
// this reason, the code should not be used as default (ThreadPriorityPolicy=0).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2521
// It is only used when ThreadPriorityPolicy=1 and requires root privilege.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2522
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2523
#if !defined(__APPLE__)
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2524
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2525
  19,              // 0 Entry should never be used
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2526
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2527
   0,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2528
   3,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2529
   6,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2530
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2531
  10,              // 4
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2532
  15,              // 5 NormPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2533
  18,              // 6
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2534
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2535
  21,              // 7
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2536
  25,              // 8
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2537
  28,              // 9 NearMaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2538
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2539
  31,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2540
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2541
  31               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2542
};
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  2543
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2544
/* Using Mach high-level priority assignments */
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2545
int os::java_to_os_priority[CriticalPriority + 1] = {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2546
   0,              // 0 Entry should never be used (MINPRI_USER)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2547
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2548
  27,              // 1 MinPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2549
  28,              // 2
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2550
  29,              // 3
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2551
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2552
  30,              // 4
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2553
  31,              // 5 NormPriority (BASEPRI_DEFAULT)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2554
  32,              // 6
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2555
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2556
  33,              // 7
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2557
  34,              // 8
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2558
  35,              // 9 NearMaxPriority
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2559
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2560
  36,              // 10 MaxPriority
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2561
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2562
  36               // 11 CriticalPriority
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2563
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2564
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2566
static int prio_init() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2567
  if (ThreadPriorityPolicy == 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2568
    // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2569
    // if effective uid is not root. Perhaps, a more elegant way of doing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2570
    // this is to test CAP_SYS_NICE capability, but that will require libcap.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2571
    if (geteuid() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2572
      if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2573
        warning("-XX:ThreadPriorityPolicy requires root privilege on Bsd");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2574
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2575
      ThreadPriorityPolicy = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2576
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2577
  }
11601
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2578
  if (UseCriticalJavaThreadPriority) {
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2579
    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
f359304c1856 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 11593
diff changeset
  2580
  }
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2581
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2582
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2583
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2584
OSReturn os::set_native_priority(Thread* thread, int newpri) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2585
  if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2586
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2587
#ifdef __OpenBSD__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2588
  // OpenBSD pthread_setprio starves low priority threads
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2589
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2590
#elif defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2591
  int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2592
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2593
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2594
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2595
  pthread_t self = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2596
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2597
  if (pthread_getschedparam(self, &policy, &sp) != 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2598
    return OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2599
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2600
  sp.sched_priority = newpri;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2601
  if (pthread_setschedparam(self, policy, &sp) != 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2602
    return OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2603
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2604
  return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2605
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2606
  int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2607
  return (ret == 0) ? OS_OK : OS_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2608
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2609
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2610
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2611
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2612
  if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2613
    *priority_ptr = java_to_os_priority[NormPriority];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2614
    return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2615
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2616
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2617
  errno = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2618
#if defined(__OpenBSD__) || defined(__FreeBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2619
  *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2620
#elif defined(__APPLE__) || defined(__NetBSD__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2621
  int policy;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2622
  struct sched_param sp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2623
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2624
  pthread_getschedparam(pthread_self(), &policy, &sp);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2625
  *priority_ptr = sp.sched_priority;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2626
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2627
  *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2628
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2629
  return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2630
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2631
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2632
// Hint to the underlying OS that a task switch would not be good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2633
// Void return because it's a hint and can fail.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2634
void os::hint_no_preempt() {}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2635
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2636
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2637
// suspend/resume support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2638
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2639
//  the low-level signal-based suspend/resume support is a remnant from the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2640
//  old VM-suspension that used to be for java-suspension, safepoints etc,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2641
//  within hotspot. Now there is a single use-case for this:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2642
//    - calling get_thread_pc() on the VMThread by the flat-profiler task
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2643
//      that runs in the watcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2644
//  The remaining code is greatly simplified from the more general suspension
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2645
//  code that used to be used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2646
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2647
//  The protocol is quite simple:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2648
//  - suspend:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2649
//      - sends a signal to the target thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2650
//      - polls the suspend state of the osthread using a yield loop
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2651
//      - target thread signal handler (SR_handler) sets suspend state
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2652
//        and blocks in sigsuspend until continued
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2653
//  - resume:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2654
//      - sets target osthread state to continue
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2655
//      - sends signal to end the sigsuspend loop in the SR_handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2656
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2657
//  Note that the SR_lock plays no role in this suspend/resume protocol.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2658
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2659
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2660
static void resume_clear_context(OSThread *osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2661
  osthread->set_ucontext(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2662
  osthread->set_siginfo(NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2663
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2664
  // notify the suspend action is completed, we have now resumed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2665
  osthread->sr.clear_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2666
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2667
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2668
static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2669
  osthread->set_ucontext(context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2670
  osthread->set_siginfo(siginfo);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2671
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2672
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2673
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2674
// Handler function invoked when a thread's execution is suspended or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2675
// resumed. We have to be careful that only async-safe functions are
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2676
// called here (Note: most pthread functions are not async safe and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2677
// should be avoided.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2678
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2679
// Note: sigwait() is a more natural fit than sigsuspend() from an
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2680
// interface point of view, but sigwait() prevents the signal hander
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2681
// from being run. libpthread would get very confused by not having
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2682
// its signal handlers run and prevents sigwait()'s use with the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2683
// mutex granting granting signal.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2684
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2685
// Currently only ever called on the VMThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2686
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2687
static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2688
  // Save and restore errno to avoid confusing native code with EINTR
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2689
  // after sigsuspend.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2690
  int old_errno = errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2691
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2692
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2693
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2694
  assert(thread->is_VM_thread(), "Must be VMThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2695
  // read current suspend action
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2696
  int action = osthread->sr.suspend_action();
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2697
  if (action == os::Bsd::SuspendResume::SR_SUSPEND) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2698
    suspend_save_context(osthread, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2699
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2700
    // Notify the suspend action is about to be completed. do_suspend()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2701
    // waits until SR_SUSPENDED is set and then returns. We will wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2702
    // here for a resume signal and that completes the suspend-other
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2703
    // action. do_suspend/do_resume is always called as a pair from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2704
    // the same thread - so there are no races
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2705
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2706
    // notify the caller
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2707
    osthread->sr.set_suspended();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2708
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2709
    sigset_t suspend_set;  // signals for sigsuspend()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2710
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2711
    // get current set of blocked signals and unblock resume signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2712
    pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2713
    sigdelset(&suspend_set, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2714
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2715
    // wait here until we are resumed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2716
    do {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2717
      sigsuspend(&suspend_set);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2718
      // ignore all returns until we get a resume signal
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2719
    } while (osthread->sr.suspend_action() != os::Bsd::SuspendResume::SR_CONTINUE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2720
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2721
    resume_clear_context(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2722
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2723
  } else {
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2724
    assert(action == os::Bsd::SuspendResume::SR_CONTINUE, "unexpected sr action");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2725
    // nothing special to do - just leave the handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2726
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2727
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2728
  errno = old_errno;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2729
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2730
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2732
static int SR_initialize() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2733
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2734
  char *s;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2735
  /* Get signal number to use for suspend/resume */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2736
  if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2737
    int sig = ::strtol(s, 0, 10);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2738
    if (sig > 0 || sig < NSIG) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2739
        SR_signum = sig;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2740
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2741
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2742
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2743
  assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2744
        "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2745
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2746
  sigemptyset(&SR_sigset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2747
  sigaddset(&SR_sigset, SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2748
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2749
  /* Set up signal handler for suspend/resume */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2750
  act.sa_flags = SA_RESTART|SA_SIGINFO;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2751
  act.sa_handler = (void (*)(int)) SR_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2752
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2753
  // SR_signum is blocked by default.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2754
  // 4528190 - We also need to block pthread restart signal (32 on all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2755
  // supported Bsd platforms). Note that BsdThreads need to block
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2756
  // this signal for all threads to work properly. So we don't have
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2757
  // to use hard-coded signal number when setting up the mask.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2758
  pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2759
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2760
  if (sigaction(SR_signum, &act, 0) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2761
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2762
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2763
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2764
  // Save signal flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2765
  os::Bsd::set_our_sigflags(SR_signum, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2766
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2767
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2768
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2769
static int SR_finalize() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2770
  return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2771
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2772
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2773
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2774
// returns true on success and false on error - really an error is fatal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2775
// but this seems the normal response to library errors
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2776
static bool do_suspend(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2777
  // mark as suspended and send signal
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2778
  osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_SUSPEND);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2779
  int status = pthread_kill(osthread->pthread_id(), SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2780
  assert_status(status == 0, status, "pthread_kill");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2781
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2782
  // check status and wait until notified of suspension
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2783
  if (status == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2784
    for (int i = 0; !osthread->sr.is_suspended(); i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2785
      os::yield_all(i);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2786
    }
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2787
    osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2788
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2789
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2790
  else {
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2791
    osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2792
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2793
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2794
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2795
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2796
static void do_resume(OSThread* osthread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2797
  assert(osthread->sr.is_suspended(), "thread should be suspended");
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2798
  osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_CONTINUE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2799
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2800
  int status = pthread_kill(osthread->pthread_id(), SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2801
  assert_status(status == 0, status, "pthread_kill");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2802
  // check status and wait unit notified of resumption
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2803
  if (status == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2804
    for (int i = 0; osthread->sr.is_suspended(); i++) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2805
      os::yield_all(i);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2806
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2807
  }
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 15743
diff changeset
  2808
  osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2809
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2810
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2811
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2812
// interrupt support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2813
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2814
void os::interrupt(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2815
  assert(Thread::current() == thread || Threads_lock->owned_by_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2816
    "possibility of dangling Thread pointer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2817
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2818
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2819
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2820
  if (!osthread->interrupted()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2821
    osthread->set_interrupted(true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2822
    // More than one thread can get here with the same value of osthread,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2823
    // resulting in multiple notifications.  We do, however, want the store
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2824
    // to interrupted() to be visible to other threads before we execute unpark().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2825
    OrderAccess::fence();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2826
    ParkEvent * const slp = thread->_SleepEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2827
    if (slp != NULL) slp->unpark() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2828
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2829
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2830
  // For JSR166. Unpark even if interrupt status already was set
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2831
  if (thread->is_Java_thread())
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2832
    ((JavaThread*)thread)->parker()->unpark();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2833
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2834
  ParkEvent * ev = thread->_ParkEvent ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2835
  if (ev != NULL) ev->unpark() ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2836
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2837
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2838
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2839
bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2840
  assert(Thread::current() == thread || Threads_lock->owned_by_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2841
    "possibility of dangling Thread pointer");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2842
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2843
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2844
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2845
  bool interrupted = osthread->interrupted();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2846
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2847
  if (interrupted && clear_interrupted) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2848
    osthread->set_interrupted(false);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2849
    // consider thread->_SleepEvent->reset() ... optional optimization
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2850
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2851
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2852
  return interrupted;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2853
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2854
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2855
///////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2856
// signal handling (except suspend/resume)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2857
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2858
// This routine may be used by user applications as a "hook" to catch signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2859
// The user-defined signal handler must pass unrecognized signals to this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2860
// routine, and if it returns true (non-zero), then the signal handler must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2861
// return immediately.  If the flag "abort_if_unrecognized" is true, then this
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2862
// routine will never retun false (zero), but instead will execute a VM panic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2863
// routine kill the process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2864
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2865
// If this routine returns false, it is OK to call it again.  This allows
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2866
// the user-defined signal handler to perform checks either before or after
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2867
// the VM performs its own checks.  Naturally, the user code would be making
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2868
// a serious error if it tried to handle an exception (such as a null check
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2869
// or breakpoint) that the VM was generating for its own correct operation.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2870
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2871
// This routine may recognize any of the following kinds of signals:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2872
//    SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2873
// It should be consulted by handlers for any of those signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2874
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2875
// The caller of this routine must pass in the three arguments supplied
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2876
// to the function referred to in the "sa_sigaction" (not the "sa_handler")
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2877
// field of the structure passed to sigaction().  This routine assumes that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2878
// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2879
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2880
// Note that the VM will print warnings if it detects conflicting signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2881
// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2882
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2883
extern "C" JNIEXPORT int
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2884
JVM_handle_bsd_signal(int signo, siginfo_t* siginfo,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2885
                        void* ucontext, int abort_if_unrecognized);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2886
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2887
void signalHandler(int sig, siginfo_t* info, void* uc) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2888
  assert(info != NULL && uc != NULL, "it must be old kernel");
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  2889
  int orig_errno = errno;  // Preserve errno value over signal handler.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2890
  JVM_handle_bsd_signal(sig, info, uc, true);
15743
f708934a12e7 6749267: Signal handler should save/restore errno
hseigel
parents: 15593
diff changeset
  2891
  errno = orig_errno;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2892
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2893
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2894
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2895
// This boolean allows users to forward their own non-matching signals
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2896
// to JVM_handle_bsd_signal, harmlessly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2897
bool os::Bsd::signal_handlers_are_installed = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2898
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2899
// For signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2900
struct sigaction os::Bsd::sigact[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2901
unsigned int os::Bsd::sigs = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2902
bool os::Bsd::libjsig_is_loaded = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2903
typedef struct sigaction *(*get_signal_t)(int);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2904
get_signal_t os::Bsd::get_signal_action = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2905
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2906
struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2907
  struct sigaction *actp = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2908
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2909
  if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2910
    // Retrieve the old signal handler from libjsig
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2911
    actp = (*get_signal_action)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2912
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2913
  if (actp == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2914
    // Retrieve the preinstalled signal handler from jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2915
    actp = get_preinstalled_handler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2916
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2917
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2918
  return actp;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2919
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2920
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2921
static bool call_chained_handler(struct sigaction *actp, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2922
                                 siginfo_t *siginfo, void *context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2923
  // Call the old signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2924
  if (actp->sa_handler == SIG_DFL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2925
    // It's more reasonable to let jvm treat it as an unexpected exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2926
    // instead of taking the default action.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2927
    return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2928
  } else if (actp->sa_handler != SIG_IGN) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2929
    if ((actp->sa_flags & SA_NODEFER) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2930
      // automaticlly block the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2931
      sigaddset(&(actp->sa_mask), sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2932
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2933
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2934
    sa_handler_t hand;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2935
    sa_sigaction_t sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2936
    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2937
    // retrieve the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2938
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2939
      sa = actp->sa_sigaction;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2940
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2941
      hand = actp->sa_handler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2942
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2943
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2944
    if ((actp->sa_flags & SA_RESETHAND) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2945
      actp->sa_handler = SIG_DFL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2946
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2947
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2948
    // try to honor the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2949
    sigset_t oset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2950
    pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2951
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2952
    // call into the chained handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2953
    if (siginfo_flag_set) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2954
      (*sa)(sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2955
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2956
      (*hand)(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2957
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2958
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2959
    // restore the signal mask
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2960
    pthread_sigmask(SIG_SETMASK, &oset, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2961
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2962
  // Tell jvm's signal handler the signal is taken care of.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2963
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2964
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2965
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2966
bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2967
  bool chained = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2968
  // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2969
  if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2970
    struct sigaction *actp = get_chained_signal_action(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2971
    if (actp != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2972
      chained = call_chained_handler(actp, sig, siginfo, context);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2973
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2974
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2975
  return chained;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2976
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2977
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2978
struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2979
  if ((( (unsigned int)1 << sig ) & sigs) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2980
    return &sigact[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2981
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2982
  return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2983
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2984
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2985
void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2986
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2987
  sigact[sig] = oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2988
  sigs |= (unsigned int)1 << sig;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2989
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2990
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2991
// for diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2992
int os::Bsd::sigflags[MAXSIGNUM];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2993
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2994
int os::Bsd::get_our_sigflags(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2995
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2996
  return sigflags[sig];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2997
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2998
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  2999
void os::Bsd::set_our_sigflags(int sig, int flags) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3000
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3001
  sigflags[sig] = flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3002
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3003
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3004
void os::Bsd::set_signal_handler(int sig, bool set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3005
  // Check for overwrite.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3006
  struct sigaction oldAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3007
  sigaction(sig, (struct sigaction*)NULL, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3008
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3009
  void* oldhand = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3010
                ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3011
                : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3012
  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3013
      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3014
      oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)signalHandler)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3015
    if (AllowUserSignalHandlers || !set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3016
      // Do not overwrite; user takes responsibility to forward to us.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3017
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3018
    } else if (UseSignalChaining) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3019
      // save the old handler in jvm
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3020
      save_preinstalled_handler(sig, oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3021
      // libjsig also interposes the sigaction() call below and saves the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3022
      // old sigaction on it own.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3023
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3024
      fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3025
                    "%#lx for signal %d.", (long)oldhand, sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3026
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3027
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3028
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3029
  struct sigaction sigAct;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3030
  sigfillset(&(sigAct.sa_mask));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3031
  sigAct.sa_handler = SIG_DFL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3032
  if (!set_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3033
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3034
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3035
    sigAct.sa_sigaction = signalHandler;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3036
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3037
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3038
  // Save flags, which are set by ours
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3039
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3040
  sigflags[sig] = sigAct.sa_flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3041
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3042
  int ret = sigaction(sig, &sigAct, &oldAct);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3043
  assert(ret == 0, "check");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3044
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3045
  void* oldhand2  = oldAct.sa_sigaction
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3046
                  ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3047
                  : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3048
  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3049
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3050
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3051
// install signal handlers for signals that HotSpot needs to
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3052
// handle in order to support Java-level exception handling.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3053
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3054
void os::Bsd::install_signal_handlers() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3055
  if (!signal_handlers_are_installed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3056
    signal_handlers_are_installed = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3057
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3058
    // signal-chaining
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3059
    typedef void (*signal_setting_t)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3060
    signal_setting_t begin_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3061
    signal_setting_t end_signal_setting = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3062
    begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3063
                             dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3064
    if (begin_signal_setting != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3065
      end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3066
                             dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3067
      get_signal_action = CAST_TO_FN_PTR(get_signal_t,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3068
                            dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3069
      libjsig_is_loaded = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3070
      assert(UseSignalChaining, "should enable signal-chaining");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3071
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3072
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3073
      // Tell libjsig jvm is setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3074
      (*begin_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3075
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3076
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3077
    set_signal_handler(SIGSEGV, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3078
    set_signal_handler(SIGPIPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3079
    set_signal_handler(SIGBUS, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3080
    set_signal_handler(SIGILL, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3081
    set_signal_handler(SIGFPE, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3082
    set_signal_handler(SIGXFSZ, true);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3083
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3084
#if defined(__APPLE__)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3085
    // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3086
    // signals caught and handled by the JVM. To work around this, we reset the mach task
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3087
    // signal handler that's placed on our process by CrashReporter. This disables
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3088
    // CrashReporter-based reporting.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3089
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3090
    // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3091
    // on caught fatal signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3092
    //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3093
    // Additionally, gdb installs both standard BSD signal handlers, and mach exception
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3094
    // handlers. By replacing the existing task exception handler, we disable gdb's mach
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3095
    // exception handling, while leaving the standard BSD signal handlers functional.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3096
    kern_return_t kr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3097
    kr = task_set_exception_ports(mach_task_self(),
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3098
        EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3099
        MACH_PORT_NULL,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3100
        EXCEPTION_STATE_IDENTITY,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3101
        MACHINE_THREAD_STATE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3102
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3103
    assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3104
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3105
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3106
    if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3107
      // Tell libjsig jvm finishes setting signal handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3108
      (*end_signal_setting)();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3109
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3110
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3111
    // We don't activate signal checker if libjsig is in place, we trust ourselves
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3112
    // and if UserSignalHandler is installed all bets are off
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3113
    if (CheckJNICalls) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3114
      if (libjsig_is_loaded) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3115
        tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3116
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3117
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3118
      if (AllowUserSignalHandlers) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3119
        tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3120
        check_signals = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3121
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3122
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3123
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3124
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3125
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3126
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3127
/////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3128
// glibc on Bsd platform uses non-documented flag
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3129
// to indicate, that some special sort of signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3130
// trampoline is used.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3131
// We will never set this flag, and we should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3132
// ignore this flag in our diagnostic
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3133
#ifdef SIGNIFICANT_SIGNAL_MASK
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3134
#undef SIGNIFICANT_SIGNAL_MASK
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3135
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3136
#define SIGNIFICANT_SIGNAL_MASK (~0x04000000)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3137
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3138
static const char* get_signal_handler_name(address handler,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3139
                                           char* buf, int buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3140
  int offset;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3141
  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3142
  if (found) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3143
    // skip directory names
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3144
    const char *p1, *p2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3145
    p1 = buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3146
    size_t len = strlen(os::file_separator());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3147
    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3148
    jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3149
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3150
    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3151
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3152
  return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3153
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3154
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3155
static void print_signal_handler(outputStream* st, int sig,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3156
                                 char* buf, size_t buflen) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3157
  struct sigaction sa;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3158
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3159
  sigaction(sig, NULL, &sa);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3160
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3161
  // See comment for SIGNIFICANT_SIGNAL_MASK define
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3162
  sa.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3163
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3164
  st->print("%s: ", os::exception_name(sig, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3165
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3166
  address handler = (sa.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3167
    ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3168
    : CAST_FROM_FN_PTR(address, sa.sa_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3169
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3170
  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3171
    st->print("SIG_DFL");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3172
  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3173
    st->print("SIG_IGN");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3174
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3175
    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3176
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3177
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3178
  st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3179
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3180
  address rh = VMError::get_resetted_sighandler(sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3181
  // May be, handler was resetted by VMError?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3182
  if(rh != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3183
    handler = rh;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3184
    sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3185
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3186
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3187
  st->print(", sa_flags="   PTR32_FORMAT, sa.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3188
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3189
  // Check: is it our handler?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3190
  if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3191
     handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3192
    // It is our signal handler
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3193
    // check for flags, reset system-used one!
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3194
    if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3195
      st->print(
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3196
                ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3197
                os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3198
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3199
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3200
  st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3201
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3202
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3203
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3204
#define DO_SIGNAL_CHECK(sig) \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3205
  if (!sigismember(&check_signal_done, sig)) \
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3206
    os::Bsd::check_signal_handler(sig)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3207
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3208
// This method is a periodic task to check for misbehaving JNI applications
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3209
// under CheckJNI, we can add any periodic checks here
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3210
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3211
void os::run_periodic_checks() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3212
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3213
  if (check_signals == false) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3214
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3215
  // SEGV and BUS if overridden could potentially prevent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3216
  // generation of hs*.log in the event of a crash, debugging
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3217
  // such a case can be very challenging, so we absolutely
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3218
  // check the following for a good measure:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3219
  DO_SIGNAL_CHECK(SIGSEGV);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3220
  DO_SIGNAL_CHECK(SIGILL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3221
  DO_SIGNAL_CHECK(SIGFPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3222
  DO_SIGNAL_CHECK(SIGBUS);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3223
  DO_SIGNAL_CHECK(SIGPIPE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3224
  DO_SIGNAL_CHECK(SIGXFSZ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3225
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3226
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3227
  // ReduceSignalUsage allows the user to override these handlers
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3228
  // see comments at the very top and jvm_solaris.h
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3229
  if (!ReduceSignalUsage) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3230
    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3231
    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3232
    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3233
    DO_SIGNAL_CHECK(BREAK_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3234
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3235
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3236
  DO_SIGNAL_CHECK(SR_signum);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3237
  DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3238
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3239
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3240
typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3241
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3242
static os_sigaction_t os_sigaction = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3243
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3244
void os::Bsd::check_signal_handler(int sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3245
  char buf[O_BUFLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3246
  address jvmHandler = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3247
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3248
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3249
  struct sigaction act;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3250
  if (os_sigaction == NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3251
    // only trust the default sigaction, in case it has been interposed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3252
    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3253
    if (os_sigaction == NULL) return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3254
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3255
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3256
  os_sigaction(sig, (struct sigaction*)NULL, &act);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3257
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3258
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3259
  act.sa_flags &= SIGNIFICANT_SIGNAL_MASK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3260
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3261
  address thisHandler = (act.sa_flags & SA_SIGINFO)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3262
    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3263
    : CAST_FROM_FN_PTR(address, act.sa_handler) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3264
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3265
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3266
  switch(sig) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3267
  case SIGSEGV:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3268
  case SIGBUS:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3269
  case SIGFPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3270
  case SIGPIPE:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3271
  case SIGILL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3272
  case SIGXFSZ:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3273
    jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3274
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3275
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3276
  case SHUTDOWN1_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3277
  case SHUTDOWN2_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3278
  case SHUTDOWN3_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3279
  case BREAK_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3280
    jvmHandler = (address)user_handler();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3281
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3282
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3283
  case INTERRUPT_SIGNAL:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3284
    jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3285
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3286
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3287
  default:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3288
    if (sig == SR_signum) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3289
      jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3290
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3291
      return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3292
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3293
    break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3294
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3295
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3296
  if (thisHandler != jvmHandler) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3297
    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3298
    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3299
    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3300
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3301
    sigaddset(&check_signal_done, sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3302
  } else if(os::Bsd::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Bsd::get_our_sigflags(sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3303
    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3304
    tty->print("expected:" PTR32_FORMAT, os::Bsd::get_our_sigflags(sig));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3305
    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3306
    // No need to check this sig any longer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3307
    sigaddset(&check_signal_done, sig);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3308
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3309
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3310
  // Dump all the signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3311
  if (sigismember(&check_signal_done, sig)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3312
    print_signal_handlers(tty, buf, O_BUFLEN);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3313
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3314
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3315
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3316
extern void report_error(char* file_name, int line_no, char* title, char* format, ...);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3317
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3318
extern bool signal_name(int signo, char* buf, size_t len);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3319
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3320
const char* os::exception_name(int exception_code, char* buf, size_t size) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3321
  if (0 < exception_code && exception_code <= SIGRTMAX) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3322
    // signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3323
    if (!signal_name(exception_code, buf, size)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3324
      jio_snprintf(buf, size, "SIG%d", exception_code);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3325
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3326
    return buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3327
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3328
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3329
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3330
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3331
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3332
// this is called _before_ the most of global arguments have been parsed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3333
void os::init(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3334
  char dummy;   /* used to get a guess on initial stack address */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3335
//  first_hrtime = gethrtime();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3336
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3337
  // With BsdThreads the JavaMain thread pid (primordial thread)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3338
  // is different than the pid of the java launcher thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3339
  // So, on Bsd, the launcher thread pid is passed to the VM
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3340
  // via the sun.java.launcher.pid property.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3341
  // Use this property instead of getpid() if it was correctly passed.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3342
  // See bug 6351349.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3343
  pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3344
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3345
  _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3346
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3347
  clock_tics_per_sec = CLK_TCK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3348
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3349
  init_random(1234567);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3350
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3351
  ThreadCritical::initialize();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3352
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3353
  Bsd::set_page_size(getpagesize());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3354
  if (Bsd::page_size() == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3355
    fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3356
                  strerror(errno)));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3357
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3358
  init_page_sizes((size_t) Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3359
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3360
  Bsd::initialize_system_info();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3361
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3362
  // main_thread points to the aboriginal thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3363
  Bsd::_main_thread = pthread_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3364
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3365
  Bsd::clock_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3366
  initial_time_count = os::elapsed_counter();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3367
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3368
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3369
  // XXXDARWIN
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3370
  // Work around the unaligned VM callbacks in hotspot's
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3371
  // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3372
  // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3373
  // alignment when doing symbol lookup. To work around this, we force early
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3374
  // binding of all symbols now, thus binding when alignment is known-good.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3375
  _dyld_bind_fully_image_containing_address((const void *) &os::init);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3376
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3377
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3378
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3379
// To install functions for atexit system call
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3380
extern "C" {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3381
  static void perfMemory_exit_helper() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3382
    perfMemory_exit();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3383
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3384
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3385
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3386
// this is called _after_ the global arguments have been parsed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3387
jint os::init_2(void)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3388
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3389
  // Allocate a single page and mark it as readable for safepoint polling
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3390
  address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3391
  guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3392
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3393
  os::set_polling_page( polling_page );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3394
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3395
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3396
  if(Verbose && PrintMiscellaneous)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3397
    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3398
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3399
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3400
  if (!UseMembar) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3401
    address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3402
    guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3403
    os::set_memory_serialize_page( mem_serialize_page );
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3404
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3405
#ifndef PRODUCT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3406
    if(Verbose && PrintMiscellaneous)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3407
      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3408
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3409
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3410
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3411
  os::large_page_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3412
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3413
  // initialize suspend/resume support - must do this before signal_sets_init()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3414
  if (SR_initialize() != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3415
    perror("SR_initialize failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3416
    return JNI_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3417
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3418
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3419
  Bsd::signal_sets_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3420
  Bsd::install_signal_handlers();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3421
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3422
  // Check minimum allowable stack size for thread creation and to initialize
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3423
  // the java system classes, including StackOverflowError - depends on page
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3424
  // size.  Add a page for compiler2 recursion in main thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3425
  // Add in 2*BytesPerWord times page size to account for VM stack during
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3426
  // class initialization depending on 32 or 64 bit VM.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3427
  os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3428
            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3429
                    2*BytesPerWord COMPILER2_PRESENT(+1)) * Bsd::page_size());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3430
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3431
  size_t threadStackSizeInBytes = ThreadStackSize * K;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3432
  if (threadStackSizeInBytes != 0 &&
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3433
      threadStackSizeInBytes < os::Bsd::min_stack_allowed) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3434
        tty->print_cr("\nThe stack size specified is too small, "
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3435
                      "Specify at least %dk",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3436
                      os::Bsd::min_stack_allowed/ K);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3437
        return JNI_ERR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3438
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3439
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3440
  // Make the stack size a multiple of the page size so that
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3441
  // the yellow/red zones can be guarded.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3442
  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3443
        vm_page_size()));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3444
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3445
  if (MaxFDLimit) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3446
    // set the number of file descriptors to max. print out error
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3447
    // if getrlimit/setrlimit fails but continue regardless.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3448
    struct rlimit nbr_files;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3449
    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3450
    if (status != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3451
      if (PrintMiscellaneous && (Verbose || WizardMode))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3452
        perror("os::init_2 getrlimit failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3453
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3454
      nbr_files.rlim_cur = nbr_files.rlim_max;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3455
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3456
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3457
      // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3458
      // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3459
      // be used instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3460
      nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3461
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3462
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3463
      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3464
      if (status != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3465
        if (PrintMiscellaneous && (Verbose || WizardMode))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3466
          perror("os::init_2 setrlimit failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3467
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3468
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3469
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3470
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3471
  // at-exit methods are called in the reverse order of their registration.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3472
  // atexit functions are called on return from main or as a result of a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3473
  // call to exit(3C). There can be only 32 of these functions registered
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3474
  // and atexit() does not set errno.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3475
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3476
  if (PerfAllowAtExitRegistration) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3477
    // only register atexit functions if PerfAllowAtExitRegistration is set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3478
    // atexit functions can be delayed until process exit time, which
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3479
    // can be problematic for embedded VM situations. Embedded VMs should
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3480
    // call DestroyJavaVM() to assure that VM resources are released.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3481
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3482
    // note: perfMemory_exit_helper atexit function may be removed in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3483
    // the future if the appropriate cleanup code can be added to the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3484
    // VM_Exit VMOperation's doit method.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3485
    if (atexit(perfMemory_exit_helper) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3486
      warning("os::init2 atexit(perfMemory_exit_helper) failed");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3487
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3488
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3489
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3490
  // initialize thread priority policy
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3491
  prio_init();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3492
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3493
#ifdef __APPLE__
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3494
  // dynamically link to objective c gc registration
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3495
  void *handleLibObjc = dlopen(OBJC_LIB, RTLD_LAZY);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3496
  if (handleLibObjc != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3497
    objc_registerThreadWithCollectorFunction = (objc_registerThreadWithCollector_t) dlsym(handleLibObjc, OBJC_GCREGISTER);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3498
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3499
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3500
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3501
  return JNI_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3502
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3503
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3504
// this is called at the end of vm_initialization
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3505
void os::init_3(void) { }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3506
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3507
// Mark the polling page as unreadable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3508
void os::make_polling_page_unreadable(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3509
  if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3510
    fatal("Could not disable polling page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3511
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3513
// Mark the polling page as readable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3514
void os::make_polling_page_readable(void) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3515
  if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3516
    fatal("Could not enable polling page");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3517
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3518
};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3519
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3520
int os::active_processor_count() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3521
  return _processor_count;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3522
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3523
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3524
void os::set_native_thread_name(const char *name) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3525
#if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3526
  // This is only supported in Snow Leopard and beyond
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3527
  if (name != NULL) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3528
    // Add a "Java: " prefix to the name
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3529
    char buf[MAXTHREADNAMESIZE];
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3530
    snprintf(buf, sizeof(buf), "Java: %s", name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3531
    pthread_setname_np(buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3532
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3533
#endif
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3534
}
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3535
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3536
bool os::distribute_processes(uint length, uint* distribution) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3537
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3538
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3539
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3540
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3541
bool os::bind_to_processor(uint processor_id) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3542
  // Not yet implemented.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3543
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3544
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3545
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3546
///
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3547
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3548
// Suspends the target using the signal mechanism and then grabs the PC before
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3549
// resuming the target. Used by the flat-profiler only
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3550
ExtendedPC os::get_thread_pc(Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3551
  // Make sure that it is called by the watcher for the VMThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3552
  assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3553
  assert(thread->is_VM_thread(), "Can only be called for VMThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3554
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3555
  ExtendedPC epc;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3556
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3557
  OSThread* osthread = thread->osthread();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3558
  if (do_suspend(osthread)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3559
    if (osthread->ucontext() != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3560
      epc = os::Bsd::ucontext_get_pc(osthread->ucontext());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3561
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3562
      // NULL context is unexpected, double-check this is the VMThread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3563
      guarantee(thread->is_VM_thread(), "can only be called for VMThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3564
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3565
    do_resume(osthread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3566
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3567
  // failure means pthread_kill failed for some reason - arguably this is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3568
  // a fatal problem, but such problems are ignored elsewhere
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3569
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3570
  return epc;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3571
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3572
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3573
int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3574
{
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3575
  return pthread_cond_timedwait(_cond, _mutex, _abstime);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3576
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3577
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3578
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3579
// debug support
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3580
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3581
static address same_page(address x, address y) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3582
  int page_bits = -os::vm_page_size();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3583
  if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3584
    return x;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3585
  else if (x > y)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3586
    return (address)(intptr_t(y) | ~page_bits) + 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3587
  else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3588
    return (address)(intptr_t(y) & page_bits);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3589
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3590
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3591
bool os::find(address addr, outputStream* st) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3592
  Dl_info dlinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3593
  memset(&dlinfo, 0, sizeof(dlinfo));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3594
  if (dladdr(addr, &dlinfo)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3595
    st->print(PTR_FORMAT ": ", addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3596
    if (dlinfo.dli_sname != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3597
      st->print("%s+%#x", dlinfo.dli_sname,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3598
                 addr - (intptr_t)dlinfo.dli_saddr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3599
    } else if (dlinfo.dli_fname) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3600
      st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3601
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3602
      st->print("<absolute address>");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3603
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3604
    if (dlinfo.dli_fname) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3605
      st->print(" in %s", dlinfo.dli_fname);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3606
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3607
    if (dlinfo.dli_fbase) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3608
      st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3609
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3610
    st->cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3611
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3612
    if (Verbose) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3613
      // decode some bytes around the PC
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3614
      address begin = same_page(addr-40, addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3615
      address end   = same_page(addr+40, addr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3616
      address       lowest = (address) dlinfo.dli_sname;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3617
      if (!lowest)  lowest = (address) dlinfo.dli_fbase;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3618
      if (begin < lowest)  begin = lowest;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3619
      Dl_info dlinfo2;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3620
      if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3621
          && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3622
        end = (address) dlinfo2.dli_saddr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3623
      Disassembler::decode(begin, end, st);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3624
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3625
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3626
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3627
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3628
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3629
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3630
////////////////////////////////////////////////////////////////////////////////
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3631
// misc
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3632
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3633
// This does not do anything on Bsd. This is basically a hook for being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3634
// able to use structured exception handling (thread-local exception filters)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3635
// on, e.g., Win32.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3636
void
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3637
os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3638
                         JavaCallArguments* args, Thread* thread) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3639
  f(value, method, args, thread);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3640
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3641
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3642
void os::print_statistics() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3643
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3644
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3645
int os::message_box(const char* title, const char* message) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3646
  int i;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3647
  fdStream err(defaultStream::error_fd());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3648
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3649
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3650
  err.print_raw_cr(title);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3651
  for (i = 0; i < 78; i++) err.print_raw("-");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3652
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3653
  err.print_raw_cr(message);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3654
  for (i = 0; i < 78; i++) err.print_raw("=");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3655
  err.cr();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3656
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3657
  char buf[16];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3658
  // Prevent process from exiting upon "read error" without consuming all CPU
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3659
  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3660
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3661
  return buf[0] == 'y' || buf[0] == 'Y';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3662
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3663
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3664
int os::stat(const char *path, struct stat *sbuf) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3665
  char pathbuf[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3666
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3667
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3668
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3669
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3670
  os::native_path(strcpy(pathbuf, path));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3671
  return ::stat(pathbuf, sbuf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3672
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3673
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3674
bool os::check_heap(bool force) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3675
  return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3676
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3677
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3678
int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3679
  return ::vsnprintf(buf, count, format, args);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3680
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3681
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3682
// Is a (classpath) directory empty?
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3683
bool os::dir_is_empty(const char* path) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3684
  DIR *dir = NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3685
  struct dirent *ptr;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3686
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3687
  dir = opendir(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3688
  if (dir == NULL) return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3689
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3690
  /* Scan the directory */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3691
  bool result = true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3692
  char buf[sizeof(struct dirent) + MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3693
  while (result && (ptr = ::readdir(dir)) != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3694
    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3695
      result = false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3696
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3697
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3698
  closedir(dir);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3699
  return result;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3700
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3701
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3702
// This code originates from JDK's sysOpen and open64_w
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3703
// from src/solaris/hpi/src/system_md.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3704
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3705
#ifndef O_DELETE
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3706
#define O_DELETE 0x10000
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3707
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3708
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3709
// Open a file. Unlink the file immediately after open returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3710
// if the specified oflag has the O_DELETE flag set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3711
// O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3712
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3713
int os::open(const char *path, int oflag, int mode) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3714
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3715
  if (strlen(path) > MAX_PATH - 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3716
    errno = ENAMETOOLONG;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3717
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3718
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3719
  int fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3720
  int o_delete = (oflag & O_DELETE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3721
  oflag = oflag & ~O_DELETE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3722
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3723
  fd = ::open(path, oflag, mode);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3724
  if (fd == -1) return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3725
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3726
  //If the open succeeded, the file might still be a directory
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3727
  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3728
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3729
    int ret = ::fstat(fd, &buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3730
    int st_mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3731
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3732
    if (ret != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3733
      if ((st_mode & S_IFMT) == S_IFDIR) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3734
        errno = EISDIR;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3735
        ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3736
        return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3737
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3738
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3739
      ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3740
      return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3741
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3742
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3743
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3744
    /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3745
     * All file descriptors that are opened in the JVM and not
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3746
     * specifically destined for a subprocess should have the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3747
     * close-on-exec flag set.  If we don't set it, then careless 3rd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3748
     * party native code might fork and exec without closing all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3749
     * appropriate file descriptors (e.g. as we do in closeDescriptors in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3750
     * UNIXProcess.c), and this in turn might:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3751
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3752
     * - cause end-of-file to fail to be detected on some file
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3753
     *   descriptors, resulting in mysterious hangs, or
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3754
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3755
     * - might cause an fopen in the subprocess to fail on a system
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3756
     *   suffering from bug 1085341.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3757
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3758
     * (Yes, the default setting of the close-on-exec flag is a Unix
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3759
     * design flaw)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3760
     *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3761
     * See:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3762
     * 1085341: 32-bit stdio routines should support file descriptors >255
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3763
     * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3764
     * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3765
     */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3766
#ifdef FD_CLOEXEC
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3767
    {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3768
        int flags = ::fcntl(fd, F_GETFD);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3769
        if (flags != -1)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3770
            ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3771
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3772
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3773
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3774
  if (o_delete != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3775
    ::unlink(path);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3776
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3777
  return fd;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3778
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3779
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3780
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3781
// create binary file, rewriting existing file if required
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3782
int os::create_binary_file(const char* path, bool rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3783
  int oflags = O_WRONLY | O_CREAT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3784
  if (!rewrite_existing) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3785
    oflags |= O_EXCL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3786
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3787
  return ::open(path, oflags, S_IREAD | S_IWRITE);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3788
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3789
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3790
// return current position of file pointer
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3791
jlong os::current_file_offset(int fd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3792
  return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3793
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3794
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3795
// move file pointer to the specified offset
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3796
jlong os::seek_to_file_offset(int fd, jlong offset) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3797
  return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3798
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3799
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3800
// This code originates from JDK's sysAvailable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3801
// from src/solaris/hpi/src/native_threads/src/sys_api_td.c
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3802
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3803
int os::available(int fd, jlong *bytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3804
  jlong cur, end;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3805
  int mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3806
  struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3807
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3808
  if (::fstat(fd, &buf) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3809
    mode = buf.st_mode;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3810
    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3811
      /*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3812
      * XXX: is the following call interruptible? If so, this might
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3813
      * need to go through the INTERRUPT_IO() wrapper as for other
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3814
      * blocking, interruptible calls in this file.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3815
      */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3816
      int n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3817
      if (::ioctl(fd, FIONREAD, &n) >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3818
        *bytes = n;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3819
        return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3820
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3821
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3822
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3823
  if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3824
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3825
  } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3826
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3827
  } else if (::lseek(fd, cur, SEEK_SET) == -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3828
    return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3829
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3830
  *bytes = end - cur;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3831
  return 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3832
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3833
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3834
int os::socket_available(int fd, jint *pbytes) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3835
   if (fd < 0)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3836
     return OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3837
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3838
   int ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3839
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3840
   RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3841
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3842
   //%% note ioctl can return 0 when successful, JVM_SocketAvailable
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3843
   // is expected to return 0 on failure and 1 on success to the jdk.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3844
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3845
   return (ret == OS_ERR) ? 0 : 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3846
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3847
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3848
// Map a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3849
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3850
                     char *addr, size_t bytes, bool read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3851
                     bool allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3852
  int prot;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3853
  int flags;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3854
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3855
  if (read_only) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3856
    prot = PROT_READ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3857
    flags = MAP_SHARED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3858
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3859
    prot = PROT_READ | PROT_WRITE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3860
    flags = MAP_PRIVATE;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3861
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3862
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3863
  if (allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3864
    prot |= PROT_EXEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3865
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3866
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3867
  if (addr != NULL) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3868
    flags |= MAP_FIXED;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3869
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3870
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3871
  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3872
                                     fd, file_offset);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3873
  if (mapped_address == MAP_FAILED) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3874
    return NULL;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3875
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3876
  return mapped_address;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3877
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3878
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3879
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3880
// Remap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3881
char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3882
                       char *addr, size_t bytes, bool read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3883
                       bool allow_exec) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3884
  // same as map_memory() on this OS
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3885
  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3886
                        allow_exec);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3887
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3888
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3889
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3890
// Unmap a block of memory.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12735
diff changeset
  3891
bool os::pd_unmap_memory(char* addr, size_t bytes) {
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3892
  return munmap(addr, bytes) == 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3893
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3894
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3895
// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3896
// are used by JVM M&M and JVMTI to get user+sys or user CPU time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3897
// of a thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3898
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3899
// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3900
// the fast estimate available on the platform.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3901
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3902
jlong os::current_thread_cpu_time() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3903
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3904
  return os::thread_cpu_time(Thread::current(), true /* user + sys */);
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3905
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3906
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3907
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3908
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3909
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3910
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3911
jlong os::thread_cpu_time(Thread* thread) {
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3912
#ifdef __APPLE__
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3913
  return os::thread_cpu_time(thread, true /* user + sys */);
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3914
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3915
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3916
  return 0;
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3917
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3918
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3919
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3920
jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3921
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3922
  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3923
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3924
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3925
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3926
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3927
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3928
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3929
jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3930
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3931
  struct thread_basic_info tinfo;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3932
  mach_msg_type_number_t tcount = THREAD_INFO_MAX;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3933
  kern_return_t kr;
11881
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  3934
  thread_t mach_thread;
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  3935
9642744ae9a5 7132070: Use a mach_port_t as the OSThread thread_id rather than pthread_t on BSD/OSX
sla
parents: 11880
diff changeset
  3936
  mach_thread = thread->osthread()->thread_id();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3937
  kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3938
  if (kr != KERN_SUCCESS)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3939
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3940
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3941
  if (user_sys_cpu_time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3942
    jlong nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3943
    nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3944
    nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3945
    return nanos;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3946
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3947
    return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3948
  }
15869
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3949
#else
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3950
  Unimplemented();
6336b792f928 8008559: [parfait] Path through non-void function '_ZN2os15thread_cpu_timeEP6Thread' returns an undefined value
morris
parents: 15743
diff changeset
  3951
  return 0;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3952
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3953
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3954
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3955
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3956
void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3957
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3958
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3959
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3960
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3961
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3962
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3963
void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3964
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3965
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3966
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3967
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3968
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3969
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3970
bool os::is_thread_cpu_time_supported() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3971
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3972
  return true;
14286
ec9e76cd402f 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 13932
diff changeset
  3973
#else
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3974
  return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3975
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3976
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3977
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3978
// System loadavg support.  Returns -1 if load average cannot be obtained.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3979
// Bsd doesn't yet have a (official) notion of processor sets,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3980
// so just return the system wide load average.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3981
int os::loadavg(double loadavg[], int nelem) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3982
  return ::getloadavg(loadavg, nelem);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3983
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3984
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3985
void os::pause() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3986
  char filename[MAX_PATH];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3987
  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3988
    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3989
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3990
    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3991
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3992
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3993
  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3994
  if (fd != -1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3995
    struct stat buf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3996
    ::close(fd);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3997
    while (::stat(filename, &buf) == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3998
      (void)::poll(NULL, 0, 100);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  3999
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4000
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4001
    jio_fprintf(stderr,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4002
      "Could not open pause file '%s', continuing immediately.\n", filename);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4003
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4004
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4005
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4006
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4007
// Refer to the comments in os_solaris.cpp park-unpark.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4008
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4009
// Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4010
// hang indefinitely.  For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4011
// For specifics regarding the bug see GLIBC BUGID 261237 :
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4012
//    http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4013
// Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4014
// will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4015
// is used.  (The simple C test-case provided in the GLIBC bug report manifests the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4016
// hang).  The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4017
// and monitorenter when we're using 1-0 locking.  All those operations may result in
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4018
// calls to pthread_cond_timedwait().  Using LD_ASSUME_KERNEL to use an older version
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4019
// of libpthread avoids the problem, but isn't practical.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4020
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4021
// Possible remedies:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4022
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4023
// 1.   Establish a minimum relative wait time.  50 to 100 msecs seems to work.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4024
//      This is palliative and probabilistic, however.  If the thread is preempted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4025
//      between the call to compute_abstime() and pthread_cond_timedwait(), more
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4026
//      than the minimum period may have passed, and the abstime may be stale (in the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4027
//      past) resultin in a hang.   Using this technique reduces the odds of a hang
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4028
//      but the JVM is still vulnerable, particularly on heavily loaded systems.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4029
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4030
// 2.   Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4031
//      of the usual flag-condvar-mutex idiom.  The write side of the pipe is set
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4032
//      NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4033
//      reduces to poll()+read().  This works well, but consumes 2 FDs per extant
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4034
//      thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4035
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4036
// 3.   Embargo pthread_cond_timedwait() and implement a native "chron" thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4037
//      that manages timeouts.  We'd emulate pthread_cond_timedwait() by enqueuing
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4038
//      a timeout request to the chron thread and then blocking via pthread_cond_wait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4039
//      This also works well.  In fact it avoids kernel-level scalability impediments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4040
//      on certain platforms that don't handle lots of active pthread_cond_timedwait()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4041
//      timers in a graceful fashion.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4042
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4043
// 4.   When the abstime value is in the past it appears that control returns
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4044
//      correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4045
//      Subsequent timedwait/wait calls may hang indefinitely.  Given that, we
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4046
//      can avoid the problem by reinitializing the condvar -- by cond_destroy()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4047
//      followed by cond_init() -- after all calls to pthread_cond_timedwait().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4048
//      It may be possible to avoid reinitialization by checking the return
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4049
//      value from pthread_cond_timedwait().  In addition to reinitializing the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4050
//      condvar we must establish the invariant that cond_signal() is only called
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4051
//      within critical sections protected by the adjunct mutex.  This prevents
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4052
//      cond_signal() from "seeing" a condvar that's in the midst of being
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4053
//      reinitialized or that is corrupt.  Sadly, this invariant obviates the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4054
//      desirable signal-after-unlock optimization that avoids futile context switching.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4055
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4056
//      I'm also concerned that some versions of NTPL might allocate an auxilliary
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4057
//      structure when a condvar is used or initialized.  cond_destroy()  would
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4058
//      release the helper structure.  Our reinitialize-after-timedwait fix
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4059
//      put excessive stress on malloc/free and locks protecting the c-heap.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4060
//
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4061
// We currently use (4).  See the WorkAroundNTPLTimedWaitHang flag.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4062
// It may be possible to refine (4) by checking the kernel and NTPL verisons
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4063
// and only enabling the work-around for vulnerable environments.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4064
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4065
// utility to compute the abstime argument to timedwait:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4066
// millis is the relative timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4067
// abstime will be the absolute timeout time
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4068
// TODO: replace compute_abstime() with unpackTime()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4069
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4070
static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4071
  if (millis < 0)  millis = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4072
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4073
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4074
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4075
  jlong seconds = millis / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4076
  millis %= 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4077
  if (seconds > 50000000) { // see man cond_timedwait(3T)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4078
    seconds = 50000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4079
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4080
  abstime->tv_sec = now.tv_sec  + seconds;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4081
  long       usec = now.tv_usec + millis * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4082
  if (usec >= 1000000) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4083
    abstime->tv_sec += 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4084
    usec -= 1000000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4085
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4086
  abstime->tv_nsec = usec * 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4087
  return abstime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4088
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4089
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4090
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4091
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4092
// Conceptually TryPark() should be equivalent to park(0).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4093
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4094
int os::PlatformEvent::TryPark() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4095
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4096
    const int v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4097
    guarantee ((v == 0) || (v == 1), "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4098
    if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4099
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4100
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4101
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4102
void os::PlatformEvent::park() {       // AKA "down()"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4103
  // Invariant: Only the thread associated with the Event/PlatformEvent
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4104
  // may call park().
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4105
  // TODO: assert that _Assoc != NULL or _Assoc == Self
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4106
  int v ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4107
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4108
      v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4109
      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4110
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4111
  guarantee (v >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4112
  if (v == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4113
     // Do this the hard way by blocking ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4114
     int status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4115
     assert_status(status == 0, status, "mutex_lock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4116
     guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4117
     ++ _nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4118
     while (_Event < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4119
        status = pthread_cond_wait(_cond, _mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4120
        // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4121
        // Treat this the same as if the wait was interrupted
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4122
        if (status == ETIMEDOUT) { status = EINTR; }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4123
        assert_status(status == 0 || status == EINTR, status, "cond_wait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4124
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4125
     -- _nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4126
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4127
    _Event = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4128
     status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4129
     assert_status(status == 0, status, "mutex_unlock");
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4130
    // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4131
    // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4132
    OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4133
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4134
  guarantee (_Event >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4135
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4136
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4137
int os::PlatformEvent::park(jlong millis) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4138
  guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4139
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4140
  int v ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4141
  for (;;) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4142
      v = _Event ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4143
      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4144
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4145
  guarantee (v >= 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4146
  if (v != 0) return OS_OK ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4147
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4148
  // We do this the hard way, by blocking the thread.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4149
  // Consider enforcing a minimum timeout value.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4150
  struct timespec abst;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4151
  compute_abstime(&abst, millis);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4152
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4153
  int ret = OS_TIMEOUT;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4154
  int status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4155
  assert_status(status == 0, status, "mutex_lock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4156
  guarantee (_nParked == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4157
  ++_nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4158
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4159
  // Object.wait(timo) will return because of
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4160
  // (a) notification
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4161
  // (b) timeout
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4162
  // (c) thread.interrupt
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4163
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4164
  // Thread.interrupt and object.notify{All} both call Event::set.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4165
  // That is, we treat thread.interrupt as a special case of notification.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4166
  // The underlying Solaris implementation, cond_timedwait, admits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4167
  // spurious/premature wakeups, but the JLS/JVM spec prevents the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4168
  // JVM from making those visible to Java code.  As such, we must
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4169
  // filter out spurious wakeups.  We assume all ETIME returns are valid.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4170
  //
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4171
  // TODO: properly differentiate simultaneous notify+interrupt.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4172
  // In that case, we should propagate the notify to another waiter.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4173
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4174
  while (_Event < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4175
    status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4176
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4177
      pthread_cond_destroy (_cond);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4178
      pthread_cond_init (_cond, NULL) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4179
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4180
    assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4181
                  status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4182
                  status, "cond_timedwait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4183
    if (!FilterSpuriousWakeups) break ;                 // previous semantics
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4184
    if (status == ETIMEDOUT) break ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4185
    // We consume and ignore EINTR and spurious wakeups.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4186
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4187
  --_nParked ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4188
  if (_Event >= 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4189
     ret = OS_OK;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4190
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4191
  _Event = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4192
  status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4193
  assert_status(status == 0, status, "mutex_unlock");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4194
  assert (_nParked == 0, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4195
  // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4196
  // correctly with each other.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4197
  OrderAccess::fence();
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4198
  return ret;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4199
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4200
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4201
void os::PlatformEvent::unpark() {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4202
  // Transitions for _Event:
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4203
  //    0 :=> 1
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4204
  //    1 :=> 1
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4205
  //   -1 :=> either 0 or 1; must signal target thread
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4206
  //          That is, we can safely transition _Event from -1 to either
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4207
  //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4208
  //          unpark() calls.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4209
  // See also: "Semaphores in Plan 9" by Mullender & Cox
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4210
  //
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4211
  // Note: Forcing a transition from "-1" to "1" on an unpark() means
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4212
  // that it will take two back-to-back park() calls for the owning
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4213
  // thread to block. This has the benefit of forcing a spurious return
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4214
  // from the first park() call after an unpark() call which will help
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4215
  // shake out uses of park() and unpark() without condition variables.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4216
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4217
  if (Atomic::xchg(1, &_Event) >= 0) return;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4218
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4219
  // Wait for the thread associated with the event to vacate
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4220
  int status = pthread_mutex_lock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4221
  assert_status(status == 0, status, "mutex_lock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4222
  int AnyWaiters = _nParked;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4223
  assert(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4224
  if (AnyWaiters != 0 && WorkAroundNPTLTimedWaitHang) {
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4225
    AnyWaiters = 0;
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4226
    pthread_cond_signal(_cond);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4227
  }
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4228
  status = pthread_mutex_unlock(_mutex);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4229
  assert_status(status == 0, status, "mutex_unlock");
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4230
  if (AnyWaiters != 0) {
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4231
    status = pthread_cond_signal(_cond);
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4232
    assert_status(status == 0, status, "cond_signal");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4233
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4234
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4235
  // Note that we signal() _after dropping the lock for "immortal" Events.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4236
  // This is safe and avoids a common class of  futile wakeups.  In rare
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4237
  // circumstances this can cause a thread to return prematurely from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4238
  // cond_{timed}wait() but the spurious wakeup is benign and the victim will
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4239
  // simply re-test the condition and re-park itself.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4240
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4241
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4242
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4243
// JSR166
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4244
// -------------------------------------------------------
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4245
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4246
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4247
 * The solaris and bsd implementations of park/unpark are fairly
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4248
 * conservative for now, but can be improved. They currently use a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4249
 * mutex/condvar pair, plus a a count.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4250
 * Park decrements count if > 0, else does a condvar wait.  Unpark
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4251
 * sets count to 1 and signals condvar.  Only one thread ever waits
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4252
 * on the condvar. Contention seen when trying to park implies that someone
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4253
 * is unparking you, so don't wait. And spurious returns are fine, so there
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4254
 * is no need to track notifications.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4255
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4256
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4257
#define MAX_SECS 100000000
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4258
/*
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4259
 * This code is common to bsd and solaris and will be moved to a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4260
 * common place in dolphin.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4261
 *
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4262
 * The passed in time value is either a relative time in nanoseconds
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4263
 * or an absolute time in milliseconds. Either way it has to be unpacked
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4264
 * into suitable seconds and nanoseconds components and stored in the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4265
 * given timespec structure.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4266
 * Given time is a 64-bit value and the time_t used in the timespec is only
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4267
 * a signed-32-bit value (except on 64-bit Bsd) we have to watch for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4268
 * overflow if times way in the future are given. Further on Solaris versions
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4269
 * prior to 10 there is a restriction (see cond_timedwait) that the specified
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4270
 * number of seconds, in abstime, is less than current_time  + 100,000,000.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4271
 * As it will be 28 years before "now + 100000000" will overflow we can
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4272
 * ignore overflow and just impose a hard-limit on seconds using the value
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4273
 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4274
 * years from "now".
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4275
 */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4276
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4277
static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4278
  assert (time > 0, "convertTime");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4279
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4280
  struct timeval now;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4281
  int status = gettimeofday(&now, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4282
  assert(status == 0, "gettimeofday");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4283
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4284
  time_t max_secs = now.tv_sec + MAX_SECS;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4285
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4286
  if (isAbsolute) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4287
    jlong secs = time / 1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4288
    if (secs > max_secs) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4289
      absTime->tv_sec = max_secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4290
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4291
    else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4292
      absTime->tv_sec = secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4293
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4294
    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4295
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4296
  else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4297
    jlong secs = time / NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4298
    if (secs >= MAX_SECS) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4299
      absTime->tv_sec = max_secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4300
      absTime->tv_nsec = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4301
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4302
    else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4303
      absTime->tv_sec = now.tv_sec + secs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4304
      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4305
      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4306
        absTime->tv_nsec -= NANOSECS_PER_SEC;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4307
        ++absTime->tv_sec; // note: this must be <= max_secs
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4308
      }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4309
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4310
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4311
  assert(absTime->tv_sec >= 0, "tv_sec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4312
  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4313
  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4314
  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4315
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4316
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4317
void Parker::park(bool isAbsolute, jlong time) {
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4318
  // Ideally we'd do something useful while spinning, such
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4319
  // as calling unpackTime().
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4320
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4321
  // Optional fast-path check:
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4322
  // Return immediately if a permit is available.
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4323
  // We depend on Atomic::xchg() having full barrier semantics
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4324
  // since we are doing a lock-free update to _counter.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4325
  if (Atomic::xchg(0, &_counter) > 0) return;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4326
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4327
  Thread* thread = Thread::current();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4328
  assert(thread->is_Java_thread(), "Must be JavaThread");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4329
  JavaThread *jt = (JavaThread *)thread;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4330
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4331
  // Optional optimization -- avoid state transitions if there's an interrupt pending.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4332
  // Check interrupt before trying to wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4333
  if (Thread::is_interrupted(thread, false)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4334
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4335
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4336
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4337
  // Next, demultiplex/decode time arguments
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4338
  struct timespec absTime;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4339
  if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4340
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4341
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4342
  if (time > 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4343
    unpackTime(&absTime, isAbsolute, time);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4344
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4345
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4346
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4347
  // Enter safepoint region
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4348
  // Beware of deadlocks such as 6317397.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4349
  // The per-thread Parker:: mutex is a classic leaf-lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4350
  // In particular a thread must never block on the Threads_lock while
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4351
  // holding the Parker:: mutex.  If safepoints are pending both the
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4352
  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4353
  ThreadBlockInVM tbivm(jt);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4354
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4355
  // Don't wait if cannot get lock since interference arises from
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4356
  // unblocking.  Also. check interrupt before trying wait
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4357
  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4358
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4359
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4360
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4361
  int status ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4362
  if (_counter > 0)  { // no wait needed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4363
    _counter = 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4364
    status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4365
    assert (status == 0, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4366
    // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4367
    // correctly with each other and Java-level accesses.
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4368
    OrderAccess::fence();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4369
    return;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4370
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4371
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4372
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4373
  // Don't catch signals while blocked; let the running threads have the signals.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4374
  // (This allows a debugger to break into the running thread.)
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4375
  sigset_t oldsigs;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4376
  sigset_t* allowdebug_blocked = os::Bsd::allowdebug_blocked_signals();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4377
  pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4378
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4379
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4380
  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4381
  jt->set_suspend_equivalent();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4382
  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4383
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4384
  if (time == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4385
    status = pthread_cond_wait (_cond, _mutex) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4386
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4387
    status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4388
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4389
      pthread_cond_destroy (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4390
      pthread_cond_init    (_cond, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4391
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4392
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4393
  assert_status(status == 0 || status == EINTR ||
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4394
                status == ETIMEDOUT,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4395
                status, "cond_timedwait");
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4396
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4397
#ifdef ASSERT
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4398
  pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4399
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4400
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4401
  _counter = 0 ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4402
  status = pthread_mutex_unlock(_mutex) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4403
  assert_status(status == 0, status, "invariant") ;
15234
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4404
  // Paranoia to ensure our locked and lock-free paths interact
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4405
  // correctly with each other and Java-level accesses.
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4406
  OrderAccess::fence();
ff1f01be5fbd 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 15231
diff changeset
  4407
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4408
  // If externally suspended while waiting, re-suspend
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4409
  if (jt->handle_special_suspend_equivalent_condition()) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4410
    jt->java_suspend_self();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4411
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4412
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4413
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4414
void Parker::unpark() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4415
  int s, status ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4416
  status = pthread_mutex_lock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4417
  assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4418
  s = _counter;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4419
  _counter = 1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4420
  if (s < 1) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4421
     if (WorkAroundNPTLTimedWaitHang) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4422
        status = pthread_cond_signal (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4423
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4424
        status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4425
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4426
     } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4427
        status = pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4428
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4429
        status = pthread_cond_signal (_cond) ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4430
        assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4431
     }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4432
  } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4433
    pthread_mutex_unlock(_mutex);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4434
    assert (status == 0, "invariant") ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4435
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4436
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4437
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4438
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4439
/* Darwin has no "environ" in a dynamic library. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4440
#ifdef __APPLE__
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4441
#include <crt_externs.h>
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4442
#define environ (*_NSGetEnviron())
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4443
#else
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4444
extern char** environ;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4445
#endif
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4446
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4447
// Run the specified command in a separate process. Return its exit value,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4448
// or -1 on failure (e.g. can't fork a new process).
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4449
// Unlike system(), this function can be called from signal handler. It
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4450
// doesn't block SIGINT et al.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4451
int os::fork_and_exec(char* cmd) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4452
  const char * argv[4] = {"sh", "-c", cmd, NULL};
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4453
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4454
  // fork() in BsdThreads/NPTL is not async-safe. It needs to run
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4455
  // pthread_atfork handlers and reset pthread library. All we need is a
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4456
  // separate process to execve. Make a direct syscall to fork process.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4457
  // On IA64 there's no fork syscall, we have to use fork() and hope for
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4458
  // the best...
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4459
  pid_t pid = fork();
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4460
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4461
  if (pid < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4462
    // fork failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4463
    return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4464
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4465
  } else if (pid == 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4466
    // child process
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4467
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4468
    // execve() in BsdThreads will call pthread_kill_other_threads_np()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4469
    // first to kill every thread on the thread list. Because this list is
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4470
    // not reset by fork() (see notes above), execve() will instead kill
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4471
    // every thread in the parent process. We know this is the only thread
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4472
    // in the new process, so make a system call directly.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4473
    // IA64 should use normal execve() from glibc to match the glibc fork()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4474
    // above.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4475
    execve("/bin/sh", (char* const*)argv, environ);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4476
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4477
    // execve failed
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4478
    _exit(-1);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4479
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4480
  } else  {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4481
    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4482
    // care about the actual exit code, for now.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4483
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4484
    int status;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4485
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4486
    // Wait for the child process to exit.  This returns immediately if
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4487
    // the child has already exited. */
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4488
    while (waitpid(pid, &status, 0) < 0) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4489
        switch (errno) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4490
        case ECHILD: return 0;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4491
        case EINTR: break;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4492
        default: return -1;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4493
        }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4494
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4495
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4496
    if (WIFEXITED(status)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4497
       // The child exited normally; get its exit code.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4498
       return WEXITSTATUS(status);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4499
    } else if (WIFSIGNALED(status)) {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4500
       // The child exited because of a signal
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4501
       // The best value to return is 0x80 + signal number,
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4502
       // because that is what all Unix shells do, and because
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4503
       // it allows callers to distinguish between process exit and
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4504
       // process death by signal.
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4505
       return 0x80 + WTERMSIG(status);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4506
    } else {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4507
       // Unknown exit code; pass it through
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4508
       return status;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4509
    }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4510
  }
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4511
}
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4512
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4513
// is_headless_jre()
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4514
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4515
// Test for the existence of xawt/libmawt.so or libawt_xawt.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4516
// in order to report if we are running in a headless jre
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4517
//
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4518
// Since JDK8 xawt/libmawt.so was moved into the same directory
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4519
// as libawt.so, and renamed libawt_xawt.so
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4520
//
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4521
bool os::is_headless_jre() {
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4522
    struct stat statbuf;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4523
    char buf[MAXPATHLEN];
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4524
    char libmawtpath[MAXPATHLEN];
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4525
    const char *xawtstr  = "/xawt/libmawt" JNI_LIB_SUFFIX;
12101
ce40623cb187 7152206: anti-delta the fix for 7152031
dcubed
parents: 12100
diff changeset
  4526
    const char *new_xawtstr = "/libawt_xawt" JNI_LIB_SUFFIX;
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4527
    char *p;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4528
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4529
    // Get path to libjvm.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4530
    os::jvm_path(buf, sizeof(buf));
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4531
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4532
    // Get rid of libjvm.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4533
    p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4534
    if (p == NULL) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4535
    else *p = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4536
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4537
    // Get rid of client or server
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4538
    p = strrchr(buf, '/');
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4539
    if (p == NULL) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4540
    else *p = '\0';
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4541
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4542
    // check xawt/libmawt.so
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4543
    strcpy(libmawtpath, buf);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4544
    strcat(libmawtpath, xawtstr);
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4545
    if (::stat(libmawtpath, &statbuf) == 0) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4546
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4547
    // check libawt_xawt.so
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4548
    strcpy(libmawtpath, buf);
11161
ec855b5a23c2 7110017: is_headless_jre should be updated to reflect the new location of awt toolkit libraries
dholmes
parents: 10739
diff changeset
  4549
    strcat(libmawtpath, new_xawtstr);
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4550
    if (::stat(libmawtpath, &statbuf) == 0) return false;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4551
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4552
    return true;
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents:
diff changeset
  4553
}
13198
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4554
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4555
// Get the default path to the core file
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4556
// Returns the length of the string
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4557
int os::get_core_path(char* buffer, size_t bufferSize) {
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4558
  int n = jio_snprintf(buffer, bufferSize, "/cores");
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4559
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4560
  // Truncate if theoretical string was longer than bufferSize
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4561
  n = MIN2(n, (int)bufferSize);
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4562
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4563
  return n;
271c557a7623 7129724: MAC: Core file location is wrong in crash report
mikael
parents: 13195
diff changeset
  4564
}