Merge
This commit is contained in:
commit
3b8016772d
@ -342,7 +342,6 @@ BsdAttachOperation* BsdAttachListener::dequeue() {
|
||||
|
||||
// get the credentials of the peer and check the effective uid/guid
|
||||
// - check with jeff on this.
|
||||
#ifdef _ALLBSD_SOURCE
|
||||
uid_t puid;
|
||||
gid_t pgid;
|
||||
if (::getpeereid(s, &puid, &pgid) != 0) {
|
||||
@ -350,17 +349,6 @@ BsdAttachOperation* BsdAttachListener::dequeue() {
|
||||
RESTARTABLE(::close(s), res);
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
struct ucred cred_info;
|
||||
socklen_t optlen = sizeof(cred_info);
|
||||
if (::getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void*)&cred_info, &optlen) == -1) {
|
||||
int res;
|
||||
RESTARTABLE(::close(s), res);
|
||||
continue;
|
||||
}
|
||||
uid_t puid = cred_info.uid;
|
||||
gid_t pgid = cred_info.gid;
|
||||
#endif
|
||||
uid_t euid = geteuid();
|
||||
gid_t egid = getegid();
|
||||
|
||||
|
@ -39,18 +39,12 @@
|
||||
|
||||
private:
|
||||
|
||||
#ifdef _ALLBSD_SOURCE
|
||||
|
||||
#ifdef __APPLE__
|
||||
typedef thread_t thread_id_t;
|
||||
#else
|
||||
typedef pthread_t thread_id_t;
|
||||
#endif
|
||||
|
||||
#else
|
||||
typedef pid_t thread_id_t;
|
||||
#endif
|
||||
|
||||
// _pthread_id is the pthread id, which is used by library calls
|
||||
// (e.g. pthread_kill).
|
||||
pthread_t _pthread_id;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -56,19 +56,6 @@ class Bsd {
|
||||
static int sigflags[MAXSIGNUM];
|
||||
|
||||
static int (*_clock_gettime)(clockid_t, struct timespec *);
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *);
|
||||
|
||||
static address _initial_thread_stack_bottom;
|
||||
static uintptr_t _initial_thread_stack_size;
|
||||
|
||||
static const char *_glibc_version;
|
||||
static const char *_libpthread_version;
|
||||
|
||||
static bool _is_floating_stack;
|
||||
static bool _is_NPTL;
|
||||
static bool _supports_fast_thread_cpu_time;
|
||||
#endif
|
||||
|
||||
static GrowableArray<int>* _cpu_to_node;
|
||||
|
||||
@ -76,28 +63,14 @@ class Bsd {
|
||||
|
||||
static julong _physical_memory;
|
||||
static pthread_t _main_thread;
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static Mutex* _createThread_lock;
|
||||
#endif
|
||||
static int _page_size;
|
||||
|
||||
static julong available_memory();
|
||||
static julong physical_memory() { return _physical_memory; }
|
||||
static void initialize_system_info();
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static void set_glibc_version(const char *s) { _glibc_version = s; }
|
||||
static void set_libpthread_version(const char *s) { _libpthread_version = s; }
|
||||
#endif
|
||||
|
||||
static bool supports_variable_stack_size();
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static void set_is_NPTL() { _is_NPTL = true; }
|
||||
static void set_is_BsdThreads() { _is_NPTL = false; }
|
||||
static void set_is_floating_stack() { _is_floating_stack = true; }
|
||||
#endif
|
||||
|
||||
static void rebuild_cpu_to_node_map();
|
||||
static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; }
|
||||
|
||||
@ -106,25 +79,10 @@ class Bsd {
|
||||
public:
|
||||
|
||||
static void init_thread_fpu_state();
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static int get_fpu_control_word();
|
||||
static void set_fpu_control_word(int fpu_control);
|
||||
#endif
|
||||
static pthread_t main_thread(void) { return _main_thread; }
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
// returns kernel thread id (similar to LWP id on Solaris), which can be
|
||||
// used to access /proc
|
||||
static pid_t gettid();
|
||||
static void set_createThread_lock(Mutex* lk) { _createThread_lock = lk; }
|
||||
static Mutex* createThread_lock(void) { return _createThread_lock; }
|
||||
#endif
|
||||
static void hotspot_sigmask(Thread* thread);
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static address initial_thread_stack_bottom(void) { return _initial_thread_stack_bottom; }
|
||||
static uintptr_t initial_thread_stack_size(void) { return _initial_thread_stack_size; }
|
||||
#endif
|
||||
static bool is_initial_thread(void);
|
||||
|
||||
static int page_size(void) { return _page_size; }
|
||||
@ -161,23 +119,6 @@ class Bsd {
|
||||
static struct sigaction *get_chained_signal_action(int sig);
|
||||
static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
// GNU libc and libpthread version strings
|
||||
static const char *glibc_version() { return _glibc_version; }
|
||||
static const char *libpthread_version() { return _libpthread_version; }
|
||||
|
||||
// NPTL or BsdThreads?
|
||||
static bool is_BsdThreads() { return !_is_NPTL; }
|
||||
static bool is_NPTL() { return _is_NPTL; }
|
||||
|
||||
// NPTL is always floating stack. BsdThreads could be using floating
|
||||
// stack or fixed stack.
|
||||
static bool is_floating_stack() { return _is_floating_stack; }
|
||||
|
||||
static void libpthread_init();
|
||||
static bool libnuma_init();
|
||||
static void* libnuma_dlsym(void* handle, const char* name);
|
||||
#endif
|
||||
// Minimum stack size a thread can be created with (allowing
|
||||
// the VM to completely create the thread and enter user code)
|
||||
static size_t min_stack_allowed;
|
||||
@ -186,22 +127,9 @@ class Bsd {
|
||||
static size_t default_stack_size(os::ThreadType thr_type);
|
||||
static size_t default_guard_size(os::ThreadType thr_type);
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static void capture_initial_stack(size_t max_size);
|
||||
|
||||
// Stack overflow handling
|
||||
static bool manually_expand_stack(JavaThread * t, address addr);
|
||||
static int max_register_window_saves_before_flushing();
|
||||
#endif
|
||||
|
||||
// Real-time clock functions
|
||||
static void clock_init(void);
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
// fast POSIX clocks support
|
||||
static void fast_thread_clock_init(void);
|
||||
#endif
|
||||
|
||||
static inline bool supports_monotonic_clock() {
|
||||
return _clock_gettime != NULL;
|
||||
}
|
||||
@ -210,18 +138,6 @@ class Bsd {
|
||||
return _clock_gettime ? _clock_gettime(clock_id, tp) : -1;
|
||||
}
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) {
|
||||
return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1;
|
||||
}
|
||||
|
||||
static bool supports_fast_thread_cpu_time() {
|
||||
return _supports_fast_thread_cpu_time;
|
||||
}
|
||||
|
||||
static jlong fast_thread_cpu_time(clockid_t clockid);
|
||||
#endif
|
||||
|
||||
// Stack repair handling
|
||||
|
||||
// none present
|
||||
|
@ -22,7 +22,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
// Must be at least Windows 2000 or XP to use VectoredExceptions and IsDebuggerPresent
|
||||
// Must be at least Windows 2000 or XP to use IsDebuggerPresent
|
||||
#define _WIN32_WINNT 0x500
|
||||
|
||||
// no precompiled headers
|
||||
@ -110,10 +110,6 @@ static FILETIME process_exit_time;
|
||||
static FILETIME process_user_time;
|
||||
static FILETIME process_kernel_time;
|
||||
|
||||
#ifdef _WIN64
|
||||
PVOID topLevelVectoredExceptionHandler = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef _M_IA64
|
||||
#define __CPU__ ia64
|
||||
#elif _M_AMD64
|
||||
@ -136,12 +132,6 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
|
||||
case DLL_PROCESS_DETACH:
|
||||
if(ForceTimeHighResolution)
|
||||
timeEndPeriod(1L);
|
||||
#ifdef _WIN64
|
||||
if (topLevelVectoredExceptionHandler != NULL) {
|
||||
RemoveVectoredExceptionHandler(topLevelVectoredExceptionHandler);
|
||||
topLevelVectoredExceptionHandler = NULL;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -408,20 +398,14 @@ static unsigned __stdcall java_start(Thread* thread) {
|
||||
}
|
||||
|
||||
|
||||
if (UseVectoredExceptions) {
|
||||
// If we are using vectored exception we don't need to set a SEH
|
||||
thread->run();
|
||||
}
|
||||
else {
|
||||
// Install a win32 structured exception handler around every thread created
|
||||
// by VM, so VM can genrate error dump when an exception occurred in non-
|
||||
// Java thread (e.g. VM thread).
|
||||
__try {
|
||||
thread->run();
|
||||
} __except(topLevelExceptionFilter(
|
||||
(_EXCEPTION_POINTERS*)_exception_info())) {
|
||||
// Nothing to do.
|
||||
}
|
||||
// Install a win32 structured exception handler around every thread created
|
||||
// by VM, so VM can genrate error dump when an exception occurred in non-
|
||||
// Java thread (e.g. VM thread).
|
||||
__try {
|
||||
thread->run();
|
||||
} __except(topLevelExceptionFilter(
|
||||
(_EXCEPTION_POINTERS*)_exception_info())) {
|
||||
// Nothing to do.
|
||||
}
|
||||
|
||||
// One less thread is executing
|
||||
@ -2489,16 +2473,6 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _WIN64
|
||||
// Windows will sometimes generate an access violation
|
||||
// when we call malloc. Since we use VectoredExceptions
|
||||
// on 64 bit platforms, we see this exception. We must
|
||||
// pass this exception on so Windows can recover.
|
||||
// We check to see if the pc of the fault is in NTDLL.DLL
|
||||
// if so, we pass control on to Windows for handling.
|
||||
if (UseVectoredExceptions && _addr_in_ntdll(pc)) return EXCEPTION_CONTINUE_SEARCH;
|
||||
#endif
|
||||
|
||||
// Stack overflow or null pointer exception in native code.
|
||||
report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
|
||||
exceptionInfo->ContextRecord);
|
||||
@ -2527,30 +2501,8 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
}
|
||||
|
||||
if (exception_code != EXCEPTION_BREAKPOINT) {
|
||||
#ifndef _WIN64
|
||||
report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
|
||||
exceptionInfo->ContextRecord);
|
||||
#else
|
||||
// Itanium Windows uses a VectoredExceptionHandler
|
||||
// Which means that C++ programatic exception handlers (try/except)
|
||||
// will get here. Continue the search for the right except block if
|
||||
// the exception code is not a fatal code.
|
||||
switch ( exception_code ) {
|
||||
case EXCEPTION_ACCESS_VIOLATION:
|
||||
case EXCEPTION_STACK_OVERFLOW:
|
||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||
case EXCEPTION_ILLEGAL_INSTRUCTION_2:
|
||||
case EXCEPTION_INT_OVERFLOW:
|
||||
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
||||
case EXCEPTION_UNCAUGHT_CXX_EXCEPTION:
|
||||
{ report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
|
||||
exceptionInfo->ContextRecord);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
@ -3706,18 +3658,6 @@ jint os::init_2(void) {
|
||||
|
||||
// Setup Windows Exceptions
|
||||
|
||||
// On Itanium systems, Structured Exception Handling does not
|
||||
// work since stack frames must be walkable by the OS. Since
|
||||
// much of our code is dynamically generated, and we do not have
|
||||
// proper unwind .xdata sections, the system simply exits
|
||||
// rather than delivering the exception. To work around
|
||||
// this we use VectorExceptions instead.
|
||||
#ifdef _WIN64
|
||||
if (UseVectoredExceptions) {
|
||||
topLevelVectoredExceptionHandler = AddVectoredExceptionHandler( 1, topLevelExceptionFilter);
|
||||
}
|
||||
#endif
|
||||
|
||||
// for debugging float code generation bugs
|
||||
if (ForceFloatExceptions) {
|
||||
#ifndef _WIN64
|
||||
|
@ -25,10 +25,6 @@
|
||||
#ifndef OS_CPU_BSD_X86_VM_BYTES_BSD_X86_INLINE_HPP
|
||||
#define OS_CPU_BSD_X86_VM_BYTES_BSD_X86_INLINE_HPP
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
#include <byteswap.h>
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <libkern/OSByteOrder.h>
|
||||
#endif
|
||||
|
@ -48,7 +48,5 @@ define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
|
||||
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
#endif // OS_CPU_BSD_X86_VM_GLOBALS_BSD_X86_HPP
|
||||
|
@ -76,7 +76,7 @@
|
||||
# include <ucontext.h>
|
||||
#endif
|
||||
|
||||
#if defined(_ALLBSD_SOURCE) && !defined(__APPLE__) && !defined(__NetBSD__)
|
||||
#if !defined(__APPLE__) && !defined(__NetBSD__)
|
||||
# include <pthread_np.h>
|
||||
#endif
|
||||
|
||||
@ -489,23 +489,6 @@ JVM_handle_bsd_signal(int sig,
|
||||
// to handle_unexpected_exception way down below.
|
||||
thread->disable_stack_red_zone();
|
||||
tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
} else {
|
||||
// Accessing stack address below sp may cause SEGV if current
|
||||
// thread has MAP_GROWSDOWN stack. This should only happen when
|
||||
// current thread was created by user code with MAP_GROWSDOWN flag
|
||||
// and then attached to VM. See notes in os_bsd.cpp.
|
||||
if (thread->osthread()->expanding_stack() == 0) {
|
||||
thread->osthread()->set_expanding_stack();
|
||||
if (os::Bsd::manually_expand_stack(thread, addr)) {
|
||||
thread->osthread()->clear_expanding_stack();
|
||||
return 1;
|
||||
}
|
||||
thread->osthread()->clear_expanding_stack();
|
||||
} else {
|
||||
fatal("recursive segv. expanding stack.");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -744,61 +727,21 @@ JVM_handle_bsd_signal(int sig,
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
||||
#ifdef _ALLBSD_SOURCE
|
||||
// From solaris_i486.s ported to bsd_i486.s
|
||||
extern "C" void fixcw();
|
||||
#endif
|
||||
|
||||
void os::Bsd::init_thread_fpu_state(void) {
|
||||
#ifndef AMD64
|
||||
# ifdef _ALLBSD_SOURCE
|
||||
// Set fpu to 53 bit precision. This happens too early to use a stub.
|
||||
fixcw();
|
||||
# else
|
||||
// set fpu to 53 bit precision
|
||||
set_fpu_control_word(0x27f);
|
||||
# endif
|
||||
#endif // !AMD64
|
||||
}
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
int os::Bsd::get_fpu_control_word(void) {
|
||||
#ifdef AMD64
|
||||
return 0;
|
||||
#else
|
||||
int fpu_control;
|
||||
_FPU_GETCW(fpu_control);
|
||||
return fpu_control & 0xffff;
|
||||
#endif // AMD64
|
||||
}
|
||||
|
||||
void os::Bsd::set_fpu_control_word(int fpu_control) {
|
||||
#ifndef AMD64
|
||||
_FPU_SETCW(fpu_control);
|
||||
#endif // !AMD64
|
||||
}
|
||||
#endif
|
||||
|
||||
// Check that the bsd kernel version is 2.4 or higher since earlier
|
||||
// versions do not support SSE without patches.
|
||||
bool os::supports_sse() {
|
||||
#if defined(AMD64) || defined(_ALLBSD_SOURCE)
|
||||
return true;
|
||||
#else
|
||||
struct utsname uts;
|
||||
if( uname(&uts) != 0 ) return false; // uname fails?
|
||||
char *minor_string;
|
||||
int major = strtol(uts.release,&minor_string,10);
|
||||
int minor = strtol(minor_string+1,NULL,10);
|
||||
bool result = (major > 2 || (major==2 && minor >= 4));
|
||||
#ifndef PRODUCT
|
||||
if (PrintMiscellaneous && Verbose) {
|
||||
tty->print("OS version is %d.%d, which %s support SSE/SSE2\n",
|
||||
major,minor, result ? "DOES" : "does NOT");
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
#endif // AMD64
|
||||
}
|
||||
|
||||
bool os::is_allocatable(size_t bytes) {
|
||||
@ -836,46 +779,7 @@ size_t os::Bsd::min_stack_allowed = (48 DEBUG_ONLY(+4))*K;
|
||||
#define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
|
||||
#endif
|
||||
|
||||
#ifdef _ALLBSD_SOURCE
|
||||
bool os::Bsd::supports_variable_stack_size() { return true; }
|
||||
#else
|
||||
// Test if pthread library can support variable thread stack size. BsdThreads
|
||||
// in fixed stack mode allocates 2M fixed slot for each thread. BsdThreads
|
||||
// in floating stack mode and NPTL support variable stack size.
|
||||
bool os::Bsd::supports_variable_stack_size() {
|
||||
if (os::Bsd::is_NPTL()) {
|
||||
// NPTL, yes
|
||||
return true;
|
||||
|
||||
} else {
|
||||
// Note: We can't control default stack size when creating a thread.
|
||||
// If we use non-default stack size (pthread_attr_setstacksize), both
|
||||
// floating stack and non-floating stack BsdThreads will return the
|
||||
// same value. This makes it impossible to implement this function by
|
||||
// detecting thread stack size directly.
|
||||
//
|
||||
// An alternative approach is to check %gs. Fixed-stack BsdThreads
|
||||
// do not use %gs, so its value is 0. Floating-stack BsdThreads use
|
||||
// %gs (either as LDT selector or GDT selector, depending on kernel)
|
||||
// to access thread specific data.
|
||||
//
|
||||
// Note that %gs is a reserved glibc register since early 2001, so
|
||||
// applications are not allowed to change its value (Ulrich Drepper from
|
||||
// Redhat confirmed that all known offenders have been modified to use
|
||||
// either %fs or TSD). In the worst case scenario, when VM is embedded in
|
||||
// a native application that plays with %gs, we might see non-zero %gs
|
||||
// even BsdThreads is running in fixed stack mode. As the result, we'll
|
||||
// return true and skip _thread_safety_check(), so we may not be able to
|
||||
// detect stack-heap collisions. But otherwise it's harmless.
|
||||
//
|
||||
#ifdef __GNUC__
|
||||
return (GET_GS() != 0);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif // AMD64
|
||||
|
||||
// return default stack size for thr_type
|
||||
@ -943,7 +847,7 @@ static void current_stack_region(address * bottom, size_t * size) {
|
||||
|
||||
*bottom = (address)((char *)ss.ss_sp - ss.ss_size);
|
||||
*size = ss.ss_size;
|
||||
#elif defined(_ALLBSD_SOURCE)
|
||||
#else
|
||||
pthread_attr_t attr;
|
||||
|
||||
int rslt = pthread_attr_init(&attr);
|
||||
@ -963,33 +867,6 @@ static void current_stack_region(address * bottom, size_t * size) {
|
||||
}
|
||||
|
||||
pthread_attr_destroy(&attr);
|
||||
#else
|
||||
if (os::Bsd::is_initial_thread()) {
|
||||
// initial thread needs special handling because pthread_getattr_np()
|
||||
// may return bogus value.
|
||||
*bottom = os::Bsd::initial_thread_stack_bottom();
|
||||
*size = os::Bsd::initial_thread_stack_size();
|
||||
} else {
|
||||
pthread_attr_t attr;
|
||||
|
||||
int rslt = pthread_getattr_np(pthread_self(), &attr);
|
||||
|
||||
// JVM needs to know exact stack location, abort if it fails
|
||||
if (rslt != 0) {
|
||||
if (rslt == ENOMEM) {
|
||||
vm_exit_out_of_memory(0, "pthread_getattr_np");
|
||||
} else {
|
||||
fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
|
||||
}
|
||||
}
|
||||
|
||||
if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
|
||||
fatal("Can not locate current stack attributes!");
|
||||
}
|
||||
|
||||
pthread_attr_destroy(&attr);
|
||||
|
||||
}
|
||||
#endif
|
||||
assert(os::current_stack_pointer() >= *bottom &&
|
||||
os::current_stack_pointer() < *bottom + *size, "just checking");
|
||||
|
@ -41,7 +41,6 @@ define_pd_global(intx, VMThreadStackSize, 512);
|
||||
define_pd_global(intx, CompilerThreadStackSize, 0);
|
||||
define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
|
||||
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(_ALLBSD_SOURCE) && !defined(__APPLE__) && !defined(__NetBSD__)
|
||||
#if !defined(__APPLE__) && !defined(__NetBSD__)
|
||||
#include <pthread.h>
|
||||
# include <pthread_np.h> /* For pthread_attr_get_np */
|
||||
#endif
|
||||
@ -178,26 +178,6 @@ JVM_handle_bsd_signal(int sig,
|
||||
thread->disable_stack_red_zone();
|
||||
ShouldNotCallThis();
|
||||
}
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
else {
|
||||
// Accessing stack address below sp may cause SEGV if
|
||||
// current thread has MAP_GROWSDOWN stack. This should
|
||||
// only happen when current thread was created by user
|
||||
// code with MAP_GROWSDOWN flag and then attached to VM.
|
||||
// See notes in os_bsd.cpp.
|
||||
if (thread->osthread()->expanding_stack() == 0) {
|
||||
thread->osthread()->set_expanding_stack();
|
||||
if (os::Bsd::manually_expand_stack(thread, addr)) {
|
||||
thread->osthread()->clear_expanding_stack();
|
||||
return true;
|
||||
}
|
||||
thread->osthread()->clear_expanding_stack();
|
||||
}
|
||||
else {
|
||||
fatal("recursive segv. expanding stack.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -266,16 +246,6 @@ void os::Bsd::init_thread_fpu_state(void) {
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
#ifndef _ALLBSD_SOURCE
|
||||
int os::Bsd::get_fpu_control_word() {
|
||||
ShouldNotCallThis();
|
||||
}
|
||||
|
||||
void os::Bsd::set_fpu_control_word(int fpu) {
|
||||
ShouldNotCallThis();
|
||||
}
|
||||
#endif
|
||||
|
||||
bool os::is_allocatable(size_t bytes) {
|
||||
#ifdef _LP64
|
||||
return true;
|
||||
@ -339,7 +309,7 @@ static void current_stack_region(address *bottom, size_t *size) {
|
||||
stack_top = (address) ss.ss_sp;
|
||||
stack_bytes = ss.ss_size;
|
||||
stack_bottom = stack_top - stack_bytes;
|
||||
#elif defined(_ALLBSD_SOURCE)
|
||||
#else
|
||||
pthread_attr_t attr;
|
||||
|
||||
int rslt = pthread_attr_init(&attr);
|
||||
@ -362,67 +332,6 @@ static void current_stack_region(address *bottom, size_t *size) {
|
||||
pthread_attr_destroy(&attr);
|
||||
|
||||
stack_top = stack_bottom + stack_bytes;
|
||||
#else /* Linux */
|
||||
pthread_attr_t attr;
|
||||
int res = pthread_getattr_np(pthread_self(), &attr);
|
||||
if (res != 0) {
|
||||
if (res == ENOMEM) {
|
||||
vm_exit_out_of_memory(0, "pthread_getattr_np");
|
||||
}
|
||||
else {
|
||||
fatal(err_msg("pthread_getattr_np failed with errno = " INT32_FORMAT,
|
||||
res));
|
||||
}
|
||||
}
|
||||
|
||||
res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes);
|
||||
if (res != 0) {
|
||||
fatal(err_msg("pthread_attr_getstack failed with errno = " INT32_FORMAT,
|
||||
res));
|
||||
}
|
||||
stack_top = stack_bottom + stack_bytes;
|
||||
|
||||
// The block of memory returned by pthread_attr_getstack() includes
|
||||
// guard pages where present. We need to trim these off.
|
||||
size_t page_bytes = os::Bsd::page_size();
|
||||
assert(((intptr_t) stack_bottom & (page_bytes - 1)) == 0, "unaligned stack");
|
||||
|
||||
size_t guard_bytes;
|
||||
res = pthread_attr_getguardsize(&attr, &guard_bytes);
|
||||
if (res != 0) {
|
||||
fatal(err_msg(
|
||||
"pthread_attr_getguardsize failed with errno = " INT32_FORMAT, res));
|
||||
}
|
||||
int guard_pages = align_size_up(guard_bytes, page_bytes) / page_bytes;
|
||||
assert(guard_bytes == guard_pages * page_bytes, "unaligned guard");
|
||||
|
||||
#ifdef IA64
|
||||
// IA64 has two stacks sharing the same area of memory, a normal
|
||||
// stack growing downwards and a register stack growing upwards.
|
||||
// Guard pages, if present, are in the centre. This code splits
|
||||
// the stack in two even without guard pages, though in theory
|
||||
// there's nothing to stop us allocating more to the normal stack
|
||||
// or more to the register stack if one or the other were found
|
||||
// to grow faster.
|
||||
int total_pages = align_size_down(stack_bytes, page_bytes) / page_bytes;
|
||||
stack_bottom += (total_pages - guard_pages) / 2 * page_bytes;
|
||||
#endif // IA64
|
||||
|
||||
stack_bottom += guard_bytes;
|
||||
|
||||
pthread_attr_destroy(&attr);
|
||||
|
||||
// The initial thread has a growable stack, and the size reported
|
||||
// by pthread_attr_getstack is the maximum size it could possibly
|
||||
// be given what currently mapped. This can be huge, so we cap it.
|
||||
if (os::Bsd::is_initial_thread()) {
|
||||
stack_bytes = stack_top - stack_bottom;
|
||||
|
||||
if (stack_bytes > JavaThread::stack_size_at_create())
|
||||
stack_bytes = JavaThread::stack_size_at_create();
|
||||
|
||||
stack_bottom = stack_top - stack_bytes;
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(os::current_stack_pointer() >= stack_bottom, "should do");
|
||||
|
@ -35,7 +35,5 @@ define_pd_global(intx, CompilerThreadStackSize, 0);
|
||||
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx, HeapBaseMinAddress, CONST64(4)*G);
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
#endif // OS_CPU_LINUX_SPARC_VM_GLOBALS_LINUX_SPARC_HPP
|
||||
|
@ -46,7 +46,5 @@ define_pd_global(uintx,JVMInvokeMethodSlack, 8192);
|
||||
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx,HeapBaseMinAddress, 2*G);
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
#endif // OS_CPU_LINUX_X86_VM_GLOBALS_LINUX_X86_HPP
|
||||
|
@ -41,7 +41,6 @@ define_pd_global(intx, VMThreadStackSize, 512);
|
||||
define_pd_global(intx, CompilerThreadStackSize, 0);
|
||||
define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
|
||||
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
|
||||
|
||||
|
@ -39,8 +39,6 @@ define_pd_global(uintx, HeapBaseMinAddress, CONST64(4)*G);
|
||||
#else
|
||||
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
|
||||
#endif
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
|
||||
|
||||
|
@ -45,7 +45,5 @@ define_pd_global(intx, CompilerThreadStackSize, 0);
|
||||
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx,HeapBaseMinAddress, 256*M);
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
#endif // OS_CPU_SOLARIS_X86_VM_GLOBALS_SOLARIS_X86_HPP
|
||||
|
@ -47,7 +47,5 @@ define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
|
||||
|
||||
// Used on 64 bit platforms for UseCompressedOops base address or CDS
|
||||
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
|
||||
// Only used on 64 bit Windows platforms
|
||||
define_pd_global(bool, UseVectoredExceptions, false);
|
||||
|
||||
#endif // OS_CPU_WINDOWS_X86_VM_GLOBALS_WINDOWS_X86_HPP
|
||||
|
@ -175,9 +175,6 @@ bool os::register_code_area(char *low, char *high) {
|
||||
PRUNTIME_FUNCTION prt;
|
||||
PUNWIND_INFO_EH_ONLY punwind;
|
||||
|
||||
// If we are using Vectored Exceptions we don't need this registration
|
||||
if (UseVectoredExceptions) return true;
|
||||
|
||||
BufferBlob* blob = BufferBlob::create("CodeCache Exception Handler", sizeof(DynamicCodeData));
|
||||
CodeBuffer cb(blob);
|
||||
MacroAssembler* masm = new MacroAssembler(&cb);
|
||||
|
@ -115,6 +115,7 @@
|
||||
/* Java runtime version access */ \
|
||||
template(sun_misc_Version, "sun/misc/Version") \
|
||||
template(java_runtime_name_name, "java_runtime_name") \
|
||||
template(java_runtime_version_name, "java_runtime_version") \
|
||||
\
|
||||
/* class file format tags */ \
|
||||
template(tag_source_file, "SourceFile") \
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<?xml-stylesheet type="text/xsl" href="jvmti.xsl"?>
|
||||
<!--
|
||||
Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -358,7 +358,7 @@
|
||||
<specification label="JVM(TM) Tool Interface"
|
||||
majorversion="1"
|
||||
minorversion="2"
|
||||
microversion="1">
|
||||
microversion="2">
|
||||
<title subtitle="Version">
|
||||
<tm>JVM</tm> Tool Interface
|
||||
</title>
|
||||
@ -405,7 +405,7 @@
|
||||
interfaces are more appropriate than <jvmti/> for many tools.
|
||||
For more information on the Java Platform Debugger Architecture,
|
||||
see the
|
||||
<externallink id="http://java.sun.com/products/jpda/">Java
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html">Java
|
||||
Platform Debugger Architecture website</externallink>.
|
||||
</intro>
|
||||
|
||||
@ -693,7 +693,7 @@ Agent_OnUnload(JavaVM *vm)</example>
|
||||
An agent creates a <jvmti/> environment
|
||||
by passing a <jvmti/> version
|
||||
as the interface ID to the JNI Invocation API function
|
||||
<externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#GetEnv"><code>GetEnv</code></externallink>.
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#GetEnv"><code>GetEnv</code></externallink>.
|
||||
See <internallink id="jvmtiEnvAccess">Accessing <jvmti/> Functions</internallink>
|
||||
for more details on the creation and use of
|
||||
<jvmti/> environments.
|
||||
@ -797,7 +797,7 @@ Agent_OnUnload(JavaVM *vm)</example>
|
||||
Modified UTF-8 differs
|
||||
from standard UTF-8 in the representation of supplementary characters
|
||||
and of the null character. See the
|
||||
<externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp16542">
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16542">
|
||||
Modified UTF-8 Strings</externallink>
|
||||
section of the JNI specification for details.
|
||||
</intro>
|
||||
@ -827,7 +827,7 @@ Agent_OnUnload(JavaVM *vm)</example>
|
||||
by calling <jvmti/> functions.
|
||||
Access to <jvmti/> functions is by use of an interface pointer
|
||||
in the same manner as
|
||||
<externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html">Java
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html">Java
|
||||
Native Interface (JNI) functions</externallink> are accessed.
|
||||
The <jvmti/> interface pointer is called the
|
||||
<i>environment pointer</i>.
|
||||
@ -919,7 +919,7 @@ jvmtiEnv *jvmti;
|
||||
local references--these local references are created
|
||||
during the <jvmti/> call.
|
||||
Local references are a resource that must be managed (see the
|
||||
<externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html#wp18654">JNI Documentation</externallink>).
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp18654">JNI Documentation</externallink>).
|
||||
When threads return from native code all local references
|
||||
are freed. Note that some threads, including typical
|
||||
agent threads, will never return from native code.
|
||||
@ -954,7 +954,7 @@ jvmtiEnv *jvmti;
|
||||
<jvmti/> function.
|
||||
See the
|
||||
<externallink
|
||||
id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp770"
|
||||
id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp770"
|
||||
>Java Exceptions</externallink>
|
||||
section of the JNI specification for information on handling exceptions.
|
||||
</intro>
|
||||
@ -2024,7 +2024,7 @@ jvmtiEnv *jvmti;
|
||||
<p/>
|
||||
Upon execution of <code>proc</code>, the new thread will be attached to the
|
||||
VM--see the JNI documentation on
|
||||
<externallink id="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060"
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp1060"
|
||||
>Attaching to the VM</externallink>.
|
||||
</description>
|
||||
<origin>jvmdiClone</origin>
|
||||
@ -4010,7 +4010,7 @@ class C2 extends C1 implements I2 {
|
||||
</inptr>
|
||||
<description>
|
||||
Details about the reference.
|
||||
Set when the <paramlink id="reference_kind"/> is
|
||||
Set when the <datalink id="jvmtiHeapReferenceCallback.reference_kind">reference_kind</datalink> is
|
||||
<datalink id="JVMTI_HEAP_REFERENCE_FIELD"/>,
|
||||
<datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/>,
|
||||
<datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/>,
|
||||
@ -4378,7 +4378,7 @@ class C2 extends C1 implements I2 {
|
||||
do not control which objects are visited but they do control which
|
||||
objects and primitive values are reported by the callbacks.
|
||||
For example, if the only callback that was set is
|
||||
<paramlink id="array_primitive_value_callback"/> and <code>klass</code>
|
||||
<fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/> and <code>klass</code>
|
||||
is set to the array of bytes class, then only arrays of byte will be
|
||||
reported.
|
||||
The table below summarizes this:
|
||||
@ -4414,7 +4414,7 @@ class C2 extends C1 implements I2 {
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left">
|
||||
<fieldlink id="object_reference_callback" struct="jvmtiHeapCallbacks"/>
|
||||
<fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/>
|
||||
in <paramlink id="callbacks"/> set
|
||||
</th>
|
||||
<td>
|
||||
@ -4570,7 +4570,7 @@ class C2 extends C1 implements I2 {
|
||||
do not control which objects are visited but they do control which
|
||||
objects and primitive values are reported by the callbacks.
|
||||
For example, if the only callback that was set is
|
||||
<paramlink id="array_primitive_value_callback"/> and <code>klass</code>
|
||||
<fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/> and <code>klass</code>
|
||||
is set to the array of bytes class, then only arrays of byte will be
|
||||
reported. The table below summarizes this (contrast this with
|
||||
<functionlink id="FollowReferences"/>):
|
||||
@ -4606,7 +4606,7 @@ class C2 extends C1 implements I2 {
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left">
|
||||
<fieldlink id="object_callback" struct="jvmtiHeapCallbacks"/>
|
||||
<fieldlink id="array_primitive_value_callback" struct="jvmtiHeapCallbacks"/>
|
||||
in <paramlink id="callbacks"/> set
|
||||
</th>
|
||||
<td>
|
||||
@ -6478,7 +6478,7 @@ class C2 extends C1 implements I2 {
|
||||
<synopsis>Get Class Signature</synopsis>
|
||||
<description>
|
||||
For the class indicated by <code>klass</code>, return the
|
||||
<externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/types.html#wp16432">JNI
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432">JNI
|
||||
type signature</externallink>
|
||||
and the generic signature of the class.
|
||||
For example, <code>java.util.List</code> is <code>"Ljava/util/List;"</code>
|
||||
@ -8763,7 +8763,7 @@ method(wrapped_foo) -> nativeImplementation(foo)</example>
|
||||
Provides the ability to intercept and resend
|
||||
Java Native Interface (JNI) function calls
|
||||
by manipulating the JNI function table.
|
||||
See <externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html">JNI
|
||||
See <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html">JNI
|
||||
Functions</externallink> in the <i>Java Native Interface Specification</i>.
|
||||
<p/>
|
||||
The following example illustrates intercepting the
|
||||
@ -10446,7 +10446,7 @@ myInit() {
|
||||
for a class. The segment is typically a directory or JAR file.
|
||||
<p/>
|
||||
In the live phase the <paramlink id="segment"/> may be used to specify any platform-dependent
|
||||
path to a <externallink id="http://java.sun.com/javase/6/docs/guide/jar/jar.html">
|
||||
path to a <externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html">
|
||||
JAR file</externallink>. The agent should take care that the JAR file does not
|
||||
contain any classes or resources other than those to be defined by the bootstrap
|
||||
class loader for the purposes of instrumentation.
|
||||
@ -10494,7 +10494,7 @@ myInit() {
|
||||
for a class. The segment is typically a directory or JAR file.
|
||||
<p/>
|
||||
In the live phase the <paramlink id="segment"/> is a platform-dependent path to a <externallink
|
||||
id="http://java.sun.com/javase/6/docs/guide/jar/jar.html">JAR file</externallink> to be
|
||||
id="http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html">JAR file</externallink> to be
|
||||
searched after the system class loader unsuccessfully searches for a class. The agent should
|
||||
take care that the JAR file does not contain any classes or resources other than those to be
|
||||
defined by the system class loader for the purposes of instrumentation.
|
||||
@ -13128,6 +13128,12 @@ myInit() {
|
||||
Unsigned 8 bits.
|
||||
</description>
|
||||
</basetype>
|
||||
<basetype id="jchar">
|
||||
<description>
|
||||
Holds a Java programming language <code>char</code>.
|
||||
Unsigned 16 bits.
|
||||
</description>
|
||||
</basetype>
|
||||
<basetype id="jint">
|
||||
<description>
|
||||
Holds a Java programming language <code>int</code>.
|
||||
@ -13285,7 +13291,7 @@ typedef void (JNICALL *jvmtiEventVMInit)
|
||||
<description>
|
||||
Typedef for the JNI function table <code>JNINativeInterface</code>
|
||||
defined in the
|
||||
<externallink id="http://java.sun.com/javase/6/docs/guide/jni/spec/functions.html#wp23720">JNI Specification</externallink>.
|
||||
<externallink id="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp23720">JNI Specification</externallink>.
|
||||
The JNI reference implementation defines this with an underscore.
|
||||
</description>
|
||||
</basetype>
|
||||
@ -14252,6 +14258,9 @@ typedef void (JNICALL *jvmtiEventVMInit)
|
||||
<change date="6 August 2006" version="1.1.102">
|
||||
Add ResourceExhaustedEvent.
|
||||
</change>
|
||||
<change date="11 October 2012" version="1.2.2">
|
||||
Fixed the "HTTP" and "Missing Anchor" errors reported by the LinkCheck tool.
|
||||
</change>
|
||||
</changehistory>
|
||||
|
||||
</specification>
|
||||
|
@ -69,7 +69,7 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
|
||||
enum {
|
||||
JDK15_JVMTI_VERSION = JVMTI_VERSION_1_0 + 33, /* version: 1.0.33 */
|
||||
JDK16_JVMTI_VERSION = JVMTI_VERSION_1_1 + 102, /* version: 1.1.102 */
|
||||
JDK17_JVMTI_VERSION = JVMTI_VERSION_1_2 + 1 /* version: 1.2.1 */
|
||||
JDK17_JVMTI_VERSION = JVMTI_VERSION_1_2 + 2 /* version: 1.2.2 */
|
||||
};
|
||||
|
||||
static jvmtiPhase get_phase() { return _phase; }
|
||||
|
@ -257,6 +257,7 @@ static ObsoleteFlag obsolete_jvm_flags[] = {
|
||||
{ "MaxPermHeapExpansion", JDK_Version::jdk(8), JDK_Version::jdk(9) },
|
||||
{ "CMSRevisitStackSize", JDK_Version::jdk(8), JDK_Version::jdk(9) },
|
||||
{ "PrintRevisitStats", JDK_Version::jdk(8), JDK_Version::jdk(9) },
|
||||
{ "UseVectoredExceptions", JDK_Version::jdk(8), JDK_Version::jdk(9) },
|
||||
#ifdef PRODUCT
|
||||
{ "DesiredMethodLimit",
|
||||
JDK_Version::jdk_update(7, 2), JDK_Version::jdk(8) },
|
||||
@ -2568,7 +2569,9 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
|
||||
FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
|
||||
}
|
||||
|
||||
#ifndef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD.
|
||||
FLAG_SET_DEFAULT(UseLargePages, true);
|
||||
#endif
|
||||
|
||||
// Increase some data structure sizes for efficiency
|
||||
FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize);
|
||||
@ -3133,6 +3136,10 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
|
||||
UNSUPPORTED_OPTION(UseG1GC, "G1 GC");
|
||||
#endif
|
||||
|
||||
#ifdef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD.
|
||||
UNSUPPORTED_OPTION(UseLargePages, "-XX:+UseLargePages");
|
||||
#endif
|
||||
|
||||
#if !INCLUDE_ALTERNATE_GCS
|
||||
if (UseParallelGC) {
|
||||
warning("Parallel GC is not supported in this VM. Using Serial GC.");
|
||||
|
@ -857,9 +857,6 @@ class CommandLineFlags {
|
||||
develop(bool, BreakAtWarning, false, \
|
||||
"Execute breakpoint upon encountering VM warning") \
|
||||
\
|
||||
product_pd(bool, UseVectoredExceptions, \
|
||||
"Temp Flag - Use Vectored Exceptions rather than SEH (Windows Only)") \
|
||||
\
|
||||
develop(bool, TraceVMOperation, false, \
|
||||
"Trace vm operations") \
|
||||
\
|
||||
|
@ -688,6 +688,7 @@ void vm_shutdown_during_initialization(const char* error, const char* message) {
|
||||
|
||||
JDK_Version JDK_Version::_current;
|
||||
const char* JDK_Version::_runtime_name;
|
||||
const char* JDK_Version::_runtime_version;
|
||||
|
||||
void JDK_Version::initialize() {
|
||||
jdk_version_info info;
|
||||
|
@ -75,6 +75,7 @@ class JDK_Version VALUE_OBJ_CLASS_SPEC {
|
||||
|
||||
static JDK_Version _current;
|
||||
static const char* _runtime_name;
|
||||
static const char* _runtime_version;
|
||||
|
||||
// In this class, we promote the minor version of release to be the
|
||||
// major version for releases >= 5 in anticipation of the JDK doing the
|
||||
@ -189,6 +190,13 @@ class JDK_Version VALUE_OBJ_CLASS_SPEC {
|
||||
_runtime_name = name;
|
||||
}
|
||||
|
||||
static const char* runtime_version() {
|
||||
return _runtime_version;
|
||||
}
|
||||
static void set_runtime_version(const char* version) {
|
||||
_runtime_version = version;
|
||||
}
|
||||
|
||||
// Convenience methods for queries on the current major/minor version
|
||||
static bool is_jdk12x_version() {
|
||||
return current().compare_major(2) == 0;
|
||||
|
@ -1042,6 +1042,7 @@ static void call_initializeSystemClass(TRAPS) {
|
||||
}
|
||||
|
||||
char java_runtime_name[128] = "";
|
||||
char java_runtime_version[128] = "";
|
||||
|
||||
// extract the JRE name from sun.misc.Version.java_runtime_name
|
||||
static const char* get_java_runtime_name(TRAPS) {
|
||||
@ -1064,6 +1065,27 @@ static const char* get_java_runtime_name(TRAPS) {
|
||||
}
|
||||
}
|
||||
|
||||
// extract the JRE version from sun.misc.Version.java_runtime_version
|
||||
static const char* get_java_runtime_version(TRAPS) {
|
||||
Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
|
||||
Handle(), Handle(), CHECK_AND_CLEAR_NULL);
|
||||
fieldDescriptor fd;
|
||||
bool found = k != NULL &&
|
||||
InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_version_name(),
|
||||
vmSymbols::string_signature(), &fd);
|
||||
if (found) {
|
||||
oop name_oop = k->java_mirror()->obj_field(fd.offset());
|
||||
if (name_oop == NULL)
|
||||
return NULL;
|
||||
const char* name = java_lang_String::as_utf8_string(name_oop,
|
||||
java_runtime_version,
|
||||
sizeof(java_runtime_version));
|
||||
return name;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// General purpose hook into Java code, run once when the VM is initialized.
|
||||
// The Java library method itself may be changed independently from the VM.
|
||||
static void call_postVMInitHook(TRAPS) {
|
||||
@ -3473,6 +3495,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||
|
||||
// get the Java runtime name after java.lang.System is initialized
|
||||
JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
|
||||
JDK_Version::set_runtime_version(get_java_runtime_version(THREAD));
|
||||
} else {
|
||||
warning("java.lang.System not initialized");
|
||||
}
|
||||
|
@ -453,7 +453,9 @@ void VMError::report(outputStream* st) {
|
||||
JDK_Version::current().to_string(buf, sizeof(buf));
|
||||
const char* runtime_name = JDK_Version::runtime_name() != NULL ?
|
||||
JDK_Version::runtime_name() : "";
|
||||
st->print_cr("# JRE version: %s (%s)", runtime_name, buf);
|
||||
const char* runtime_version = JDK_Version::runtime_version() != NULL ?
|
||||
JDK_Version::runtime_version() : "";
|
||||
st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version);
|
||||
st->print_cr("# Java VM: %s (%s %s %s %s)",
|
||||
Abstract_VM_Version::vm_name(),
|
||||
Abstract_VM_Version::vm_release(),
|
||||
|
Loading…
x
Reference in New Issue
Block a user