Merge
This commit is contained in:
commit
068ede1458
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -67,8 +67,12 @@ ifndef CC_INTERP
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
# C1 is not ported on ppc64, so we cannot build a tiered VM:
|
# C1 is not ported on ppc64, so we cannot build a tiered VM:
|
||||||
ifeq ($(ARCH),ppc64)
|
# Notice: after 8046471 ARCH will be 'ppc' for top-level ppc64 builds but
|
||||||
|
# 'ppc64' for HotSpot-only ppc64 builds. Need to detect both variants here!
|
||||||
|
ifneq (,$(findstring $(ARCH), ppc ppc64))
|
||||||
|
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||||
FORCE_TIERED=0
|
FORCE_TIERED=0
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef LP64
|
ifdef LP64
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -108,7 +108,9 @@ ifeq ($(ARCH), arm)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# PPC
|
# PPC
|
||||||
ifneq (,$(findstring $(ARCH), ppc))
|
# Notice: after 8046471 ARCH will be 'ppc' for top-level ppc64 builds but
|
||||||
|
# 'ppc64' for HotSpot-only ppc64 builds. Need to detect both variants here!
|
||||||
|
ifneq (,$(findstring $(ARCH), ppc ppc64))
|
||||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||||
MAKE_ARGS += LP64=1
|
MAKE_ARGS += LP64=1
|
||||||
PLATFORM = linux-ppc64
|
PLATFORM = linux-ppc64
|
||||||
|
@ -40,7 +40,14 @@ else
|
|||||||
ifneq ($(ALT_SDT_H),)
|
ifneq ($(ALT_SDT_H),)
|
||||||
SDT_H_FILE = $(ALT_SDT_H)
|
SDT_H_FILE = $(ALT_SDT_H)
|
||||||
else
|
else
|
||||||
SDT_H_FILE = /usr/include/sys/sdt.h
|
ifeq ($(USE_CLANG), true)
|
||||||
|
# Clang doesn't support the -print-sysroot option and there is no known equivalent
|
||||||
|
# option, so fall back to using / as sysroot
|
||||||
|
SDT_SYSROOT=
|
||||||
|
else
|
||||||
|
SDT_SYSROOT=$(shell $(CXX) -print-sysroot)
|
||||||
|
endif
|
||||||
|
SDT_H_FILE = $(SDT_SYSROOT)/usr/include/sys/sdt.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DTRACE_ENABLED = $(shell test -f $(SDT_H_FILE) && echo $(SDT_H_FILE))
|
DTRACE_ENABLED = $(shell test -f $(SDT_H_FILE) && echo $(SDT_H_FILE))
|
||||||
|
@ -32,12 +32,6 @@
|
|||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "vm_version_ppc.hpp"
|
#include "vm_version_ppc.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# include <sys/sysinfo.h>
|
# include <sys/sysinfo.h>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -34,7 +34,7 @@
|
|||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/objectMonitor.hpp"
|
#include "runtime/objectMonitor.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
|
@ -28,12 +28,6 @@
|
|||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "vm_version_sparc.hpp"
|
#include "vm_version_sparc.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int VM_Version::_features = VM_Version::unknown_m;
|
int VM_Version::_features = VM_Version::unknown_m;
|
||||||
const char* VM_Version::_features_str = "";
|
const char* VM_Version::_features_str = "";
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/monitorChunk.hpp"
|
#include "runtime/monitorChunk.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/signature.hpp"
|
#include "runtime/signature.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
@ -29,18 +29,6 @@
|
|||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "vm_version_x86.hpp"
|
#include "vm_version_x86.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
int VM_Version::_cpu;
|
int VM_Version::_cpu;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2009 Red Hat, Inc.
|
* Copyright 2009 Red Hat, Inc.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -29,11 +29,5 @@
|
|||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "vm_version_zero.hpp"
|
#include "vm_version_zero.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This file is intentionally empty
|
// This file is intentionally empty
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/dtraceAttacher.hpp"
|
#include "services/dtraceAttacher.hpp"
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "memory/filemap.hpp"
|
#include "memory/filemap.hpp"
|
||||||
#include "mutex_aix.inline.hpp"
|
#include "mutex_aix.inline.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
|
#include "os_aix.inline.hpp"
|
||||||
#include "os_share_aix.hpp"
|
#include "os_share_aix.hpp"
|
||||||
#include "porting_aix.hpp"
|
#include "porting_aix.hpp"
|
||||||
#include "prims/jniFastGetField.hpp"
|
#include "prims/jniFastGetField.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -26,8 +26,6 @@
|
|||||||
#ifndef OS_AIX_VM_OS_AIX_INLINE_HPP
|
#ifndef OS_AIX_VM_OS_AIX_INLINE_HPP
|
||||||
#define OS_AIX_VM_OS_AIX_INLINE_HPP
|
#define OS_AIX_VM_OS_AIX_INLINE_HPP
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
// System includes
|
// System includes
|
||||||
@ -45,18 +43,6 @@ inline void* os::thread_local_storage_at(int index) {
|
|||||||
return pthread_getspecific((pthread_key_t)index);
|
return pthread_getspecific((pthread_key_t)index);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* os::file_separator() {
|
|
||||||
return "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::line_separator() {
|
|
||||||
return "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::path_separator() {
|
|
||||||
return ":";
|
|
||||||
}
|
|
||||||
|
|
||||||
// File names are case-sensitive on windows only
|
// File names are case-sensitive on windows only
|
||||||
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
||||||
return strcmp(s1, s2);
|
return strcmp(s1, s2);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/dtraceAttacher.hpp"
|
#include "services/dtraceAttacher.hpp"
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "memory/filemap.hpp"
|
#include "memory/filemap.hpp"
|
||||||
#include "mutex_bsd.inline.hpp"
|
#include "mutex_bsd.inline.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
|
#include "os_bsd.inline.hpp"
|
||||||
#include "os_share_bsd.hpp"
|
#include "os_share_bsd.hpp"
|
||||||
#include "prims/jniFastGetField.hpp"
|
#include "prims/jniFastGetField.hpp"
|
||||||
#include "prims/jvm.h"
|
#include "prims/jvm.h"
|
||||||
@ -4217,22 +4218,12 @@ static struct timespec* compute_abstime(struct timespec* abstime, jlong millis)
|
|||||||
return abstime;
|
return abstime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
|
|
||||||
// Conceptually TryPark() should be equivalent to park(0).
|
|
||||||
|
|
||||||
int os::PlatformEvent::TryPark() {
|
|
||||||
for (;;) {
|
|
||||||
const int v = _Event;
|
|
||||||
guarantee((v == 0) || (v == 1), "invariant");
|
|
||||||
if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void os::PlatformEvent::park() { // AKA "down()"
|
void os::PlatformEvent::park() { // AKA "down()"
|
||||||
// Invariant: Only the thread associated with the Event/PlatformEvent
|
// Invariant: Only the thread associated with the Event/PlatformEvent
|
||||||
// may call park().
|
// may call park().
|
||||||
// TODO: assert that _Assoc != NULL or _Assoc == Self
|
// TODO: assert that _Assoc != NULL or _Assoc == Self
|
||||||
|
assert(_nParked == 0, "invariant");
|
||||||
|
|
||||||
int v;
|
int v;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
v = _Event;
|
v = _Event;
|
||||||
@ -4332,8 +4323,7 @@ void os::PlatformEvent::unpark() {
|
|||||||
// 1 :=> 1
|
// 1 :=> 1
|
||||||
// -1 :=> either 0 or 1; must signal target thread
|
// -1 :=> either 0 or 1; must signal target thread
|
||||||
// That is, we can safely transition _Event from -1 to either
|
// That is, we can safely transition _Event from -1 to either
|
||||||
// 0 or 1. Forcing 1 is slightly more efficient for back-to-back
|
// 0 or 1.
|
||||||
// unpark() calls.
|
|
||||||
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
||||||
//
|
//
|
||||||
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
||||||
@ -4540,10 +4530,9 @@ void Parker::park(bool isAbsolute, jlong time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Parker::unpark() {
|
void Parker::unpark() {
|
||||||
int s, status;
|
int status = pthread_mutex_lock(_mutex);
|
||||||
status = pthread_mutex_lock(_mutex);
|
|
||||||
assert(status == 0, "invariant");
|
assert(status == 0, "invariant");
|
||||||
s = _counter;
|
const int s = _counter;
|
||||||
_counter = 1;
|
_counter = 1;
|
||||||
if (s < 1) {
|
if (s < 1) {
|
||||||
if (WorkAroundNPTLTimedWaitHang) {
|
if (WorkAroundNPTLTimedWaitHang) {
|
||||||
|
@ -219,7 +219,6 @@ class PlatformEvent : public CHeapObj<mtInternal> {
|
|||||||
int fired() { return _Event; }
|
int fired() { return _Event; }
|
||||||
void park();
|
void park();
|
||||||
void unpark();
|
void unpark();
|
||||||
int TryPark();
|
|
||||||
int park(jlong millis);
|
int park(jlong millis);
|
||||||
void SetAssociation(Thread * a) { _Assoc = a; }
|
void SetAssociation(Thread * a) { _Assoc = a; }
|
||||||
};
|
};
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#ifndef OS_BSD_VM_OS_BSD_INLINE_HPP
|
#ifndef OS_BSD_VM_OS_BSD_INLINE_HPP
|
||||||
#define OS_BSD_VM_OS_BSD_INLINE_HPP
|
#define OS_BSD_VM_OS_BSD_INLINE_HPP
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
// System includes
|
// System includes
|
||||||
@ -40,18 +38,6 @@ inline void* os::thread_local_storage_at(int index) {
|
|||||||
return pthread_getspecific((pthread_key_t)index);
|
return pthread_getspecific((pthread_key_t)index);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* os::file_separator() {
|
|
||||||
return "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::line_separator() {
|
|
||||||
return "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::path_separator() {
|
|
||||||
return ":";
|
|
||||||
}
|
|
||||||
|
|
||||||
// File names are case-sensitive on windows only
|
// File names are case-sensitive on windows only
|
||||||
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
||||||
return strcmp(s1, s2);
|
return strcmp(s1, s2);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/dtraceAttacher.hpp"
|
#include "services/dtraceAttacher.hpp"
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "memory/filemap.hpp"
|
#include "memory/filemap.hpp"
|
||||||
#include "mutex_linux.inline.hpp"
|
#include "mutex_linux.inline.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
|
#include "os_linux.inline.hpp"
|
||||||
#include "os_share_linux.hpp"
|
#include "os_share_linux.hpp"
|
||||||
#include "prims/jniFastGetField.hpp"
|
#include "prims/jniFastGetField.hpp"
|
||||||
#include "prims/jvm.h"
|
#include "prims/jvm.h"
|
||||||
@ -5456,22 +5457,12 @@ static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
|
|||||||
return abstime;
|
return abstime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
|
|
||||||
// Conceptually TryPark() should be equivalent to park(0).
|
|
||||||
|
|
||||||
int os::PlatformEvent::TryPark() {
|
|
||||||
for (;;) {
|
|
||||||
const int v = _Event;
|
|
||||||
guarantee((v == 0) || (v == 1), "invariant");
|
|
||||||
if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void os::PlatformEvent::park() { // AKA "down()"
|
void os::PlatformEvent::park() { // AKA "down()"
|
||||||
// Invariant: Only the thread associated with the Event/PlatformEvent
|
// Invariant: Only the thread associated with the Event/PlatformEvent
|
||||||
// may call park().
|
// may call park().
|
||||||
// TODO: assert that _Assoc != NULL or _Assoc == Self
|
// TODO: assert that _Assoc != NULL or _Assoc == Self
|
||||||
|
assert(_nParked == 0, "invariant");
|
||||||
|
|
||||||
int v;
|
int v;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
v = _Event;
|
v = _Event;
|
||||||
@ -5571,8 +5562,7 @@ void os::PlatformEvent::unpark() {
|
|||||||
// 1 :=> 1
|
// 1 :=> 1
|
||||||
// -1 :=> either 0 or 1; must signal target thread
|
// -1 :=> either 0 or 1; must signal target thread
|
||||||
// That is, we can safely transition _Event from -1 to either
|
// That is, we can safely transition _Event from -1 to either
|
||||||
// 0 or 1. Forcing 1 is slightly more efficient for back-to-back
|
// 0 or 1.
|
||||||
// unpark() calls.
|
|
||||||
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
||||||
//
|
//
|
||||||
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
||||||
@ -5800,10 +5790,9 @@ void Parker::park(bool isAbsolute, jlong time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Parker::unpark() {
|
void Parker::unpark() {
|
||||||
int s, status;
|
int status = pthread_mutex_lock(_mutex);
|
||||||
status = pthread_mutex_lock(_mutex);
|
|
||||||
assert(status == 0, "invariant");
|
assert(status == 0, "invariant");
|
||||||
s = _counter;
|
const int s = _counter;
|
||||||
_counter = 1;
|
_counter = 1;
|
||||||
if (s < 1) {
|
if (s < 1) {
|
||||||
// thread might be parked
|
// thread might be parked
|
||||||
|
@ -315,7 +315,6 @@ class PlatformEvent : public CHeapObj<mtInternal> {
|
|||||||
int fired() { return _Event; }
|
int fired() { return _Event; }
|
||||||
void park();
|
void park();
|
||||||
void unpark();
|
void unpark();
|
||||||
int TryPark();
|
|
||||||
int park(jlong millis); // relative timed-wait only
|
int park(jlong millis); // relative timed-wait only
|
||||||
void SetAssociation(Thread * a) { _Assoc = a; }
|
void SetAssociation(Thread * a) { _Assoc = a; }
|
||||||
};
|
};
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#ifndef OS_LINUX_VM_OS_LINUX_INLINE_HPP
|
#ifndef OS_LINUX_VM_OS_LINUX_INLINE_HPP
|
||||||
#define OS_LINUX_VM_OS_LINUX_INLINE_HPP
|
#define OS_LINUX_VM_OS_LINUX_INLINE_HPP
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
// System includes
|
// System includes
|
||||||
@ -40,18 +38,6 @@ inline void* os::thread_local_storage_at(int index) {
|
|||||||
return pthread_getspecific((pthread_key_t)index);
|
return pthread_getspecific((pthread_key_t)index);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* os::file_separator() {
|
|
||||||
return "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::line_separator() {
|
|
||||||
return "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* os::path_separator() {
|
|
||||||
return ":";
|
|
||||||
}
|
|
||||||
|
|
||||||
// File names are case-sensitive on windows only
|
// File names are case-sensitive on windows only
|
||||||
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
||||||
return strcmp(s1, s2);
|
return strcmp(s1, s2);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -22,8 +22,16 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
#ifndef OS_POSIX_VM_OS_POSIX_HPP
|
#ifndef OS_POSIX_VM_OS_POSIX_HPP
|
||||||
#define OS_POSIX_VM_OS_POSIX_HPP
|
#define OS_POSIX_VM_OS_POSIX_HPP
|
||||||
|
|
||||||
|
// File conventions
|
||||||
|
static const char* file_separator() { return "/"; }
|
||||||
|
static const char* line_separator() { return "\n"; }
|
||||||
|
static const char* path_separator() { return ":"; }
|
||||||
|
|
||||||
class Posix {
|
class Posix {
|
||||||
friend class os;
|
friend class os;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/dtraceAttacher.hpp"
|
#include "services/dtraceAttacher.hpp"
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "mutex_solaris.inline.hpp"
|
#include "mutex_solaris.inline.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "os_share_solaris.hpp"
|
#include "os_share_solaris.hpp"
|
||||||
|
#include "os_solaris.inline.hpp"
|
||||||
#include "prims/jniFastGetField.hpp"
|
#include "prims/jniFastGetField.hpp"
|
||||||
#include "prims/jvm.h"
|
#include "prims/jvm.h"
|
||||||
#include "prims/jvm_misc.hpp"
|
#include "prims/jvm_misc.hpp"
|
||||||
@ -5439,20 +5440,11 @@ static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
|
|||||||
return abstime;
|
return abstime;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
|
|
||||||
// Conceptually TryPark() should be equivalent to park(0).
|
|
||||||
|
|
||||||
int os::PlatformEvent::TryPark() {
|
|
||||||
for (;;) {
|
|
||||||
const int v = _Event;
|
|
||||||
guarantee((v == 0) || (v == 1), "invariant");
|
|
||||||
if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void os::PlatformEvent::park() { // AKA: down()
|
void os::PlatformEvent::park() { // AKA: down()
|
||||||
// Invariant: Only the thread associated with the Event/PlatformEvent
|
// Invariant: Only the thread associated with the Event/PlatformEvent
|
||||||
// may call park().
|
// may call park().
|
||||||
|
assert(_nParked == 0, "invariant");
|
||||||
|
|
||||||
int v;
|
int v;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
v = _Event;
|
v = _Event;
|
||||||
@ -5539,8 +5531,7 @@ void os::PlatformEvent::unpark() {
|
|||||||
// 1 :=> 1
|
// 1 :=> 1
|
||||||
// -1 :=> either 0 or 1; must signal target thread
|
// -1 :=> either 0 or 1; must signal target thread
|
||||||
// That is, we can safely transition _Event from -1 to either
|
// That is, we can safely transition _Event from -1 to either
|
||||||
// 0 or 1. Forcing 1 is slightly more efficient for back-to-back
|
// 0 or 1.
|
||||||
// unpark() calls.
|
|
||||||
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
||||||
//
|
//
|
||||||
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
||||||
@ -5744,10 +5735,9 @@ void Parker::park(bool isAbsolute, jlong time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Parker::unpark() {
|
void Parker::unpark() {
|
||||||
int s, status;
|
int status = os::Solaris::mutex_lock(_mutex);
|
||||||
status = os::Solaris::mutex_lock(_mutex);
|
|
||||||
assert(status == 0, "invariant");
|
assert(status == 0, "invariant");
|
||||||
s = _counter;
|
const int s = _counter;
|
||||||
_counter = 1;
|
_counter = 1;
|
||||||
status = os::Solaris::mutex_unlock(_mutex);
|
status = os::Solaris::mutex_unlock(_mutex);
|
||||||
assert(status == 0, "invariant");
|
assert(status == 0, "invariant");
|
||||||
|
@ -332,7 +332,6 @@ class PlatformEvent : public CHeapObj<mtInternal> {
|
|||||||
int fired() { return _Event; }
|
int fired() { return _Event; }
|
||||||
void park();
|
void park();
|
||||||
int park(jlong millis);
|
int park(jlong millis);
|
||||||
int TryPark();
|
|
||||||
void unpark();
|
void unpark();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#ifndef OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
|
#ifndef OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
|
||||||
#define OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
|
#define OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
// System includes
|
// System includes
|
||||||
@ -39,10 +37,6 @@
|
|||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
|
||||||
inline const char* os::file_separator() { return "/"; }
|
|
||||||
inline const char* os::line_separator() { return "\n"; }
|
|
||||||
inline const char* os::path_separator() { return ":"; }
|
|
||||||
|
|
||||||
// File names are case-sensitive on windows only
|
// File names are case-sensitive on windows only
|
||||||
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
inline int os::file_name_strcmp(const char* s1, const char* s2) {
|
||||||
return strcmp(s1, s2);
|
return strcmp(s1, s2);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,6 +25,7 @@
|
|||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "prims/jvm.h"
|
#include "prims/jvm.h"
|
||||||
#include "runtime/arguments.hpp"
|
#include "runtime/arguments.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "decoder_windows.hpp"
|
#include "decoder_windows.hpp"
|
||||||
|
|
||||||
WindowsDecoder::WindowsDecoder() {
|
WindowsDecoder::WindowsDecoder() {
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "mutex_windows.inline.hpp"
|
#include "mutex_windows.inline.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "os_share_windows.hpp"
|
#include "os_share_windows.hpp"
|
||||||
|
#include "os_windows.inline.hpp"
|
||||||
#include "prims/jniFastGetField.hpp"
|
#include "prims/jniFastGetField.hpp"
|
||||||
#include "prims/jvm.h"
|
#include "prims/jvm.h"
|
||||||
#include "prims/jvm_misc.hpp"
|
#include "prims/jvm_misc.hpp"
|
||||||
@ -4875,8 +4876,7 @@ void os::PlatformEvent::unpark() {
|
|||||||
// 1 :=> 1
|
// 1 :=> 1
|
||||||
// -1 :=> either 0 or 1; must signal target thread
|
// -1 :=> either 0 or 1; must signal target thread
|
||||||
// That is, we can safely transition _Event from -1 to either
|
// That is, we can safely transition _Event from -1 to either
|
||||||
// 0 or 1. Forcing 1 is slightly more efficient for back-to-back
|
// 0 or 1.
|
||||||
// unpark() calls.
|
|
||||||
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
// See also: "Semaphores in Plan 9" by Mullender & Cox
|
||||||
//
|
//
|
||||||
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
// Note: Forcing a transition from "-1" to "1" on an unpark() means
|
||||||
|
@ -29,6 +29,11 @@
|
|||||||
// Information about the protection of the page at address '0' on this os.
|
// Information about the protection of the page at address '0' on this os.
|
||||||
static bool zero_page_read_protected() { return true; }
|
static bool zero_page_read_protected() { return true; }
|
||||||
|
|
||||||
|
// File conventions
|
||||||
|
static const char* file_separator() { return "\\"; }
|
||||||
|
static const char* line_separator() { return "\r\n"; }
|
||||||
|
static const char* path_separator() { return ";"; }
|
||||||
|
|
||||||
class win32 {
|
class win32 {
|
||||||
friend class os;
|
friend class os;
|
||||||
|
|
||||||
|
@ -25,13 +25,8 @@
|
|||||||
#ifndef OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP
|
#ifndef OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP
|
||||||
#define OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP
|
#define OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
inline const char* os::file_separator() { return "\\"; }
|
|
||||||
inline const char* os::line_separator() { return "\r\n"; }
|
|
||||||
inline const char* os::path_separator() { return ";"; }
|
|
||||||
inline const char* os::dll_file_extension() { return ".dll"; }
|
inline const char* os::dll_file_extension() { return ".dll"; }
|
||||||
|
|
||||||
inline const int os::default_file_open_flags() { return O_BINARY | O_NOINHERIT;}
|
inline const int os::default_file_open_flags() { return O_BINARY | O_NOINHERIT;}
|
||||||
|
@ -4590,8 +4590,9 @@ void ClassFileParser::check_final_method_override(instanceKlassHandle this_klass
|
|||||||
Exceptions::fthrow(
|
Exceptions::fthrow(
|
||||||
THREAD_AND_LOCATION,
|
THREAD_AND_LOCATION,
|
||||||
vmSymbols::java_lang_VerifyError(),
|
vmSymbols::java_lang_VerifyError(),
|
||||||
"class %s overrides final method %s.%s",
|
"class %s overrides final method %s.%s%s",
|
||||||
this_klass->external_name(),
|
this_klass->external_name(),
|
||||||
|
super_m->method_holder()->external_name(),
|
||||||
name->as_C_string(),
|
name->as_C_string(),
|
||||||
signature->as_C_string()
|
signature->as_C_string()
|
||||||
);
|
);
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "services/management.hpp"
|
#include "services/management.hpp"
|
||||||
@ -59,22 +60,6 @@
|
|||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/hashtable.hpp"
|
#include "utilities/hashtable.hpp"
|
||||||
#include "utilities/hashtable.inline.hpp"
|
#include "utilities/hashtable.inline.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Entry points in zip.dll for loading zip/jar file entries
|
// Entry points in zip.dll for loading zip/jar file entries
|
||||||
|
|
||||||
|
@ -618,6 +618,8 @@ void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
|
|||||||
assert(comp_mirror.not_null(), "must have a mirror");
|
assert(comp_mirror.not_null(), "must have a mirror");
|
||||||
|
|
||||||
// Two-way link between the array klass and its component mirror:
|
// Two-way link between the array klass and its component mirror:
|
||||||
|
// (array_klass) k -> mirror -> component_mirror -> array_klass -> k
|
||||||
|
set_component_mirror(mirror(), comp_mirror());
|
||||||
ArrayKlass::cast(k())->set_component_mirror(comp_mirror());
|
ArrayKlass::cast(k())->set_component_mirror(comp_mirror());
|
||||||
set_array_klass(comp_mirror(), k());
|
set_array_klass(comp_mirror(), k());
|
||||||
} else {
|
} else {
|
||||||
@ -679,6 +681,16 @@ void java_lang_Class::set_protection_domain(oop java_class, oop pd) {
|
|||||||
java_class->obj_field_put(_protection_domain_offset, pd);
|
java_class->obj_field_put(_protection_domain_offset, pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) {
|
||||||
|
if (_component_mirror_offset != 0) {
|
||||||
|
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oop java_lang_Class::component_mirror(oop java_class) {
|
||||||
|
assert(_component_mirror_offset != 0, "must be set");
|
||||||
|
return java_class->obj_field(_component_mirror_offset);
|
||||||
|
}
|
||||||
|
|
||||||
oop java_lang_Class::init_lock(oop java_class) {
|
oop java_lang_Class::init_lock(oop java_class) {
|
||||||
assert(_init_lock_offset != 0, "must be set");
|
assert(_init_lock_offset != 0, "must be set");
|
||||||
return java_class->obj_field(_init_lock_offset);
|
return java_class->obj_field(_init_lock_offset);
|
||||||
@ -875,6 +887,10 @@ void java_lang_Class::compute_offsets() {
|
|||||||
klass_oop, vmSymbols::classLoader_name(),
|
klass_oop, vmSymbols::classLoader_name(),
|
||||||
vmSymbols::classloader_signature());
|
vmSymbols::classloader_signature());
|
||||||
|
|
||||||
|
compute_optional_offset(_component_mirror_offset,
|
||||||
|
klass_oop, vmSymbols::componentType_name(),
|
||||||
|
vmSymbols::class_signature());
|
||||||
|
|
||||||
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
|
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3097,6 +3113,7 @@ int java_lang_Class::_oop_size_offset;
|
|||||||
int java_lang_Class::_static_oop_field_count_offset;
|
int java_lang_Class::_static_oop_field_count_offset;
|
||||||
int java_lang_Class::_class_loader_offset;
|
int java_lang_Class::_class_loader_offset;
|
||||||
int java_lang_Class::_protection_domain_offset;
|
int java_lang_Class::_protection_domain_offset;
|
||||||
|
int java_lang_Class::_component_mirror_offset;
|
||||||
int java_lang_Class::_init_lock_offset;
|
int java_lang_Class::_init_lock_offset;
|
||||||
int java_lang_Class::_signers_offset;
|
int java_lang_Class::_signers_offset;
|
||||||
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
|
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
|
||||||
|
@ -241,6 +241,7 @@ class java_lang_Class : AllStatic {
|
|||||||
static int _init_lock_offset;
|
static int _init_lock_offset;
|
||||||
static int _signers_offset;
|
static int _signers_offset;
|
||||||
static int _class_loader_offset;
|
static int _class_loader_offset;
|
||||||
|
static int _component_mirror_offset;
|
||||||
|
|
||||||
static bool offsets_computed;
|
static bool offsets_computed;
|
||||||
static int classRedefinedCount_offset;
|
static int classRedefinedCount_offset;
|
||||||
@ -250,6 +251,7 @@ class java_lang_Class : AllStatic {
|
|||||||
static void set_init_lock(oop java_class, oop init_lock);
|
static void set_init_lock(oop java_class, oop init_lock);
|
||||||
static void set_protection_domain(oop java_class, oop protection_domain);
|
static void set_protection_domain(oop java_class, oop protection_domain);
|
||||||
static void set_class_loader(oop java_class, oop class_loader);
|
static void set_class_loader(oop java_class, oop class_loader);
|
||||||
|
static void set_component_mirror(oop java_class, oop comp_mirror);
|
||||||
static void initialize_mirror_fields(KlassHandle k, Handle mirror, Handle protection_domain, TRAPS);
|
static void initialize_mirror_fields(KlassHandle k, Handle mirror, Handle protection_domain, TRAPS);
|
||||||
public:
|
public:
|
||||||
static void compute_offsets();
|
static void compute_offsets();
|
||||||
@ -291,6 +293,7 @@ class java_lang_Class : AllStatic {
|
|||||||
// Support for embedded per-class oops
|
// Support for embedded per-class oops
|
||||||
static oop protection_domain(oop java_class);
|
static oop protection_domain(oop java_class);
|
||||||
static oop init_lock(oop java_class);
|
static oop init_lock(oop java_class);
|
||||||
|
static oop component_mirror(oop java_class);
|
||||||
static objArrayOop signers(oop java_class);
|
static objArrayOop signers(oop java_class);
|
||||||
static void set_signers(oop java_class, objArrayOop signers);
|
static void set_signers(oop java_class, objArrayOop signers);
|
||||||
|
|
||||||
|
@ -573,6 +573,7 @@
|
|||||||
template(serializeAgentPropertiesToByteArray_name, "serializeAgentPropertiesToByteArray") \
|
template(serializeAgentPropertiesToByteArray_name, "serializeAgentPropertiesToByteArray") \
|
||||||
template(classRedefinedCount_name, "classRedefinedCount") \
|
template(classRedefinedCount_name, "classRedefinedCount") \
|
||||||
template(classLoader_name, "classLoader") \
|
template(classLoader_name, "classLoader") \
|
||||||
|
template(componentType_name, "componentType") \
|
||||||
\
|
\
|
||||||
/* trace signatures */ \
|
/* trace signatures */ \
|
||||||
TRACE_TEMPLATES(template) \
|
TRACE_TEMPLATES(template) \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -27,21 +27,6 @@
|
|||||||
|
|
||||||
#include "asm/codeBuffer.hpp"
|
#include "asm/codeBuffer.hpp"
|
||||||
#include "memory/allocation.hpp"
|
#include "memory/allocation.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The classes in this file provide a simple framework for the
|
// The classes in this file provide a simple framework for the
|
||||||
// management of little pieces of machine code - or stubs -
|
// management of little pieces of machine code - or stubs -
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "memory/cardTableModRefBS.hpp"
|
#include "memory/cardTableModRefBS.hpp"
|
||||||
#include "runtime/fprofiler.hpp"
|
#include "runtime/fprofiler.hpp"
|
||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#ifdef TARGET_ARCH_x86
|
#ifdef TARGET_ARCH_x86
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -27,21 +27,6 @@
|
|||||||
|
|
||||||
#include "asm/codeBuffer.hpp"
|
#include "asm/codeBuffer.hpp"
|
||||||
#include "runtime/globals.hpp"
|
#include "runtime/globals.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class decode_env;
|
class decode_env;
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "memory/sharedHeap.hpp"
|
#include "memory/sharedHeap.hpp"
|
||||||
#include "runtime/globals.hpp"
|
#include "runtime/globals.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
|
#include "runtime/orderAccess.inline.hpp"
|
||||||
#include "runtime/vmThread.hpp"
|
#include "runtime/vmThread.hpp"
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,21 +28,7 @@
|
|||||||
#include "memory/defNewGeneration.hpp"
|
#include "memory/defNewGeneration.hpp"
|
||||||
#include "memory/genCollectedHeap.hpp"
|
#include "memory/genCollectedHeap.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
elapsedTimer CMSAdaptiveSizePolicy::_concurrent_timer;
|
elapsedTimer CMSAdaptiveSizePolicy::_concurrent_timer;
|
||||||
elapsedTimer CMSAdaptiveSizePolicy::_STW_timer;
|
elapsedTimer CMSAdaptiveSizePolicy::_STW_timer;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#include "memory/memRegion.hpp"
|
#include "memory/memRegion.hpp"
|
||||||
#include "oops/markOop.hpp"
|
#include "oops/markOop.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
|
#include "runtime/orderAccess.hpp"
|
||||||
#include "utilities/debug.hpp"
|
#include "utilities/debug.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -30,21 +30,6 @@
|
|||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
#include "utilities/bitMap.inline.hpp"
|
#include "utilities/bitMap.inline.hpp"
|
||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ParMarkBitMap::initialize(MemRegion covered_region)
|
ParMarkBitMap::initialize(MemRegion covered_region)
|
||||||
|
@ -26,21 +26,6 @@
|
|||||||
#include "gc_implementation/parallelScavenge/psVirtualspace.hpp"
|
#include "gc_implementation/parallelScavenge/psVirtualspace.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/virtualspace.hpp"
|
#include "runtime/virtualspace.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ InterpreterOopMap::~InterpreterOopMap() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterpreterOopMap::is_empty() {
|
bool InterpreterOopMap::is_empty() const {
|
||||||
bool result = _method == NULL;
|
bool result = _method == NULL;
|
||||||
assert(_method != NULL || (_bci == 0 &&
|
assert(_method != NULL || (_bci == 0 &&
|
||||||
(_mask_size == 0 || _mask_size == USHRT_MAX) &&
|
(_mask_size == 0 || _mask_size == USHRT_MAX) &&
|
||||||
@ -196,7 +196,7 @@ void InterpreterOopMap::initialize() {
|
|||||||
for (int i = 0; i < N; i++) _bit_mask[i] = 0;
|
for (int i = 0; i < N; i++) _bit_mask[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterOopMap::iterate_oop(OffsetClosure* oop_closure) {
|
void InterpreterOopMap::iterate_oop(OffsetClosure* oop_closure) const {
|
||||||
int n = number_of_entries();
|
int n = number_of_entries();
|
||||||
int word_index = 0;
|
int word_index = 0;
|
||||||
uintptr_t value = 0;
|
uintptr_t value = 0;
|
||||||
@ -238,7 +238,7 @@ void InterpreterOopMap::iterate_all(OffsetClosure* oop_closure, OffsetClosure* v
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void InterpreterOopMap::print() {
|
void InterpreterOopMap::print() const {
|
||||||
int n = number_of_entries();
|
int n = number_of_entries();
|
||||||
tty->print("oop map for ");
|
tty->print("oop map for ");
|
||||||
method()->print_value();
|
method()->print_value();
|
||||||
@ -469,7 +469,7 @@ void InterpreterOopMap::resource_copy(OopMapCacheEntry* from) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned int OopMapCache::hash_value_for(methodHandle method, int bci) {
|
inline unsigned int OopMapCache::hash_value_for(methodHandle method, int bci) const {
|
||||||
// We use method->code_size() rather than method->identity_hash() below since
|
// We use method->code_size() rather than method->identity_hash() below since
|
||||||
// the mark may not be present if a pointer to the method is already reversed.
|
// the mark may not be present if a pointer to the method is already reversed.
|
||||||
return ((unsigned int) bci)
|
return ((unsigned int) bci)
|
||||||
@ -522,7 +522,7 @@ void OopMapCache::flush_obsolete_entries() {
|
|||||||
|
|
||||||
void OopMapCache::lookup(methodHandle method,
|
void OopMapCache::lookup(methodHandle method,
|
||||||
int bci,
|
int bci,
|
||||||
InterpreterOopMap* entry_for) {
|
InterpreterOopMap* entry_for) const {
|
||||||
MutexLocker x(&_mut);
|
MutexLocker x(&_mut);
|
||||||
|
|
||||||
OopMapCacheEntry* entry = NULL;
|
OopMapCacheEntry* entry = NULL;
|
||||||
|
@ -106,27 +106,26 @@ class InterpreterOopMap: ResourceObj {
|
|||||||
void set_bci(int v) { _bci = v; }
|
void set_bci(int v) { _bci = v; }
|
||||||
int mask_size() const { return _mask_size; }
|
int mask_size() const { return _mask_size; }
|
||||||
void set_mask_size(int v) { _mask_size = v; }
|
void set_mask_size(int v) { _mask_size = v; }
|
||||||
int number_of_entries() const { return mask_size() / bits_per_entry; }
|
|
||||||
// Test bit mask size and return either the in-line bit mask or allocated
|
// Test bit mask size and return either the in-line bit mask or allocated
|
||||||
// bit mask.
|
// bit mask.
|
||||||
uintptr_t* bit_mask() { return (uintptr_t*)(mask_size() <= small_mask_limit ? (intptr_t)_bit_mask : _bit_mask[0]); }
|
uintptr_t* bit_mask() const { return (uintptr_t*)(mask_size() <= small_mask_limit ? (intptr_t)_bit_mask : _bit_mask[0]); }
|
||||||
|
|
||||||
// return the word size of_bit_mask. mask_size() <= 4 * MAX_USHORT
|
// return the word size of_bit_mask. mask_size() <= 4 * MAX_USHORT
|
||||||
size_t mask_word_size() {
|
size_t mask_word_size() const {
|
||||||
return (mask_size() + BitsPerWord - 1) / BitsPerWord;
|
return (mask_size() + BitsPerWord - 1) / BitsPerWord;
|
||||||
}
|
}
|
||||||
|
|
||||||
uintptr_t entry_at(int offset) { int i = offset * bits_per_entry; return bit_mask()[i / BitsPerWord] >> (i % BitsPerWord); }
|
uintptr_t entry_at(int offset) const { int i = offset * bits_per_entry; return bit_mask()[i / BitsPerWord] >> (i % BitsPerWord); }
|
||||||
|
|
||||||
void set_expression_stack_size(int sz) { _expression_stack_size = sz; }
|
void set_expression_stack_size(int sz) { _expression_stack_size = sz; }
|
||||||
|
|
||||||
#ifdef ENABLE_ZAP_DEAD_LOCALS
|
#ifdef ENABLE_ZAP_DEAD_LOCALS
|
||||||
bool is_dead(int offset) { return (entry_at(offset) & (1 << dead_bit_number)) != 0; }
|
bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Lookup
|
// Lookup
|
||||||
bool match(methodHandle method, int bci) { return _method == method() && _bci == bci; }
|
bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; }
|
||||||
bool is_empty();
|
bool is_empty() const;
|
||||||
|
|
||||||
// Initialization
|
// Initialization
|
||||||
void initialize();
|
void initialize();
|
||||||
@ -141,12 +140,13 @@ class InterpreterOopMap: ResourceObj {
|
|||||||
// in-line), allocate the space from a Resource area.
|
// in-line), allocate the space from a Resource area.
|
||||||
void resource_copy(OopMapCacheEntry* from);
|
void resource_copy(OopMapCacheEntry* from);
|
||||||
|
|
||||||
void iterate_oop(OffsetClosure* oop_closure);
|
void iterate_oop(OffsetClosure* oop_closure) const;
|
||||||
void print();
|
void print() const;
|
||||||
|
|
||||||
bool is_oop (int offset) { return (entry_at(offset) & (1 << oop_bit_number )) != 0; }
|
int number_of_entries() const { return mask_size() / bits_per_entry; }
|
||||||
|
bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; }
|
||||||
|
|
||||||
int expression_stack_size() { return _expression_stack_size; }
|
int expression_stack_size() const { return _expression_stack_size; }
|
||||||
|
|
||||||
#ifdef ENABLE_ZAP_DEAD_LOCALS
|
#ifdef ENABLE_ZAP_DEAD_LOCALS
|
||||||
void iterate_all(OffsetClosure* oop_closure, OffsetClosure* value_closure, OffsetClosure* dead_closure);
|
void iterate_all(OffsetClosure* oop_closure, OffsetClosure* value_closure, OffsetClosure* dead_closure);
|
||||||
@ -161,10 +161,10 @@ class OopMapCache : public CHeapObj<mtClass> {
|
|||||||
|
|
||||||
OopMapCacheEntry* _array;
|
OopMapCacheEntry* _array;
|
||||||
|
|
||||||
unsigned int hash_value_for(methodHandle method, int bci);
|
unsigned int hash_value_for(methodHandle method, int bci) const;
|
||||||
OopMapCacheEntry* entry_at(int i) const;
|
OopMapCacheEntry* entry_at(int i) const;
|
||||||
|
|
||||||
Mutex _mut;
|
mutable Mutex _mut;
|
||||||
|
|
||||||
void flush();
|
void flush();
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ class OopMapCache : public CHeapObj<mtClass> {
|
|||||||
|
|
||||||
// Returns the oopMap for (method, bci) in parameter "entry".
|
// Returns the oopMap for (method, bci) in parameter "entry".
|
||||||
// Returns false if an oop map was not found.
|
// Returns false if an oop map was not found.
|
||||||
void lookup(methodHandle method, int bci, InterpreterOopMap* entry);
|
void lookup(methodHandle method, int bci, InterpreterOopMap* entry) const;
|
||||||
|
|
||||||
// Compute an oop map without updating the cache or grabbing any locks (for debugging)
|
// Compute an oop map without updating the cache or grabbing any locks (for debugging)
|
||||||
static void compute_one_oop_map(methodHandle method, int bci, InterpreterOopMap* entry);
|
static void compute_one_oop_map(methodHandle method, int bci, InterpreterOopMap* entry);
|
||||||
|
@ -36,22 +36,6 @@
|
|||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
|
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void* StackObj::operator new(size_t size) throw() { ShouldNotCallThis(); return 0; }
|
void* StackObj::operator new(size_t size) throw() { ShouldNotCallThis(); return 0; }
|
||||||
void StackObj::operator delete(void* p) { ShouldNotCallThis(); }
|
void StackObj::operator delete(void* p) { ShouldNotCallThis(); }
|
||||||
void* StackObj::operator new [](size_t size) throw() { ShouldNotCallThis(); return 0; }
|
void* StackObj::operator new [](size_t size) throw() { ShouldNotCallThis(); return 0; }
|
||||||
|
@ -29,19 +29,6 @@
|
|||||||
#include "memory/genCollectedHeap.hpp"
|
#include "memory/genCollectedHeap.hpp"
|
||||||
#include "memory/universe.hpp"
|
#include "memory/universe.hpp"
|
||||||
#include "oops/oop.hpp"
|
#include "oops/oop.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The direct lock/unlock calls do not force a collection if an unlock
|
// The direct lock/unlock calls do not force a collection if an unlock
|
||||||
// decrements the count to zero. Avoid calling these if at all possible.
|
// decrements the count to zero. Avoid calling these if at all possible.
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "memory/metaspaceShared.hpp"
|
#include "memory/metaspaceShared.hpp"
|
||||||
#include "oops/objArrayOop.hpp"
|
#include "oops/objArrayOop.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/signature.hpp"
|
#include "runtime/signature.hpp"
|
||||||
#include "runtime/vm_operations.hpp"
|
#include "runtime/vm_operations.hpp"
|
||||||
#include "runtime/vmThread.hpp"
|
#include "runtime/vmThread.hpp"
|
||||||
|
@ -80,18 +80,6 @@
|
|||||||
#include "utilities/dtrace.hpp"
|
#include "utilities/dtrace.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/histogram.hpp"
|
#include "utilities/histogram.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static jint CurrentVersion = JNI_VERSION_1_8;
|
static jint CurrentVersion = JNI_VERSION_1_8;
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/jfieldIDWorkaround.hpp"
|
#include "runtime/jfieldIDWorkaround.hpp"
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
#include "runtime/orderAccess.inline.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/perfData.hpp"
|
#include "runtime/perfData.hpp"
|
||||||
#include "runtime/reflection.hpp"
|
#include "runtime/reflection.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/objectMonitor.hpp"
|
#include "runtime/objectMonitor.hpp"
|
||||||
#include "runtime/objectMonitor.inline.hpp"
|
#include "runtime/objectMonitor.inline.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/vframe.hpp"
|
#include "runtime/vframe.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
|
@ -41,21 +41,6 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/signature.hpp"
|
#include "runtime/signature.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void mangle_name_on(outputStream* st, Symbol* name, int begin, int end) {
|
static void mangle_name_on(outputStream* st, Symbol* name, int begin, int end) {
|
||||||
|
@ -37,26 +37,12 @@
|
|||||||
#include "runtime/arguments.hpp"
|
#include "runtime/arguments.hpp"
|
||||||
#include "runtime/globals_extension.hpp"
|
#include "runtime/globals_extension.hpp"
|
||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "services/management.hpp"
|
#include "services/management.hpp"
|
||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/taskqueue.hpp"
|
#include "utilities/taskqueue.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#if INCLUDE_ALL_GCS
|
#if INCLUDE_ALL_GCS
|
||||||
#include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
|
#include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
|
||||||
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
|
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#define SHARE_VM_RUNTIME_ARGUMENTS_HPP
|
#define SHARE_VM_RUNTIME_ARGUMENTS_HPP
|
||||||
|
|
||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/perfData.hpp"
|
#include "runtime/perfData.hpp"
|
||||||
#include "utilities/debug.hpp"
|
#include "utilities/debug.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,23 +23,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/atomic.hpp"
|
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
|
|
||||||
jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/monitorChunk.hpp"
|
#include "runtime/monitorChunk.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/signature.hpp"
|
#include "runtime/signature.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
|
@ -1130,10 +1130,10 @@ class CommandLineFlags {
|
|||||||
"Use LWP-based instead of libthread-based synchronization " \
|
"Use LWP-based instead of libthread-based synchronization " \
|
||||||
"(SPARC only)") \
|
"(SPARC only)") \
|
||||||
\
|
\
|
||||||
product(ccstr, SyncKnobs, NULL, \
|
experimental(ccstr, SyncKnobs, NULL, \
|
||||||
"(Unstable) Various monitor synchronization tunables") \
|
"(Unstable) Various monitor synchronization tunables") \
|
||||||
\
|
\
|
||||||
product(intx, EmitSync, 0, \
|
experimental(intx, EmitSync, 0, \
|
||||||
"(Unsafe, Unstable) " \
|
"(Unsafe, Unstable) " \
|
||||||
"Control emission of inline sync fast-path code") \
|
"Control emission of inline sync fast-path code") \
|
||||||
\
|
\
|
||||||
@ -1141,16 +1141,17 @@ class CommandLineFlags {
|
|||||||
\
|
\
|
||||||
product(bool, MonitorInUseLists, false, "Track Monitors for Deflation") \
|
product(bool, MonitorInUseLists, false, "Track Monitors for Deflation") \
|
||||||
\
|
\
|
||||||
product(intx, SyncFlags, 0, "(Unsafe, Unstable) Experimental Sync flags") \
|
experimental(intx, SyncFlags, 0, "(Unsafe, Unstable) " \
|
||||||
|
"Experimental Sync flags") \
|
||||||
\
|
\
|
||||||
product(intx, SyncVerbose, 0, "(Unstable)") \
|
experimental(intx, SyncVerbose, 0, "(Unstable)") \
|
||||||
\
|
\
|
||||||
product(intx, ClearFPUAtPark, 0, "(Unsafe, Unstable)") \
|
experimental(intx, ClearFPUAtPark, 0, "(Unsafe, Unstable)") \
|
||||||
\
|
\
|
||||||
product(intx, hashCode, 5, \
|
experimental(intx, hashCode, 5, \
|
||||||
"(Unstable) select hashCode generation algorithm") \
|
"(Unstable) select hashCode generation algorithm") \
|
||||||
\
|
\
|
||||||
product(intx, WorkAroundNPTLTimedWaitHang, 1, \
|
experimental(intx, WorkAroundNPTLTimedWaitHang, 1, \
|
||||||
"(Unstable, Linux-specific) " \
|
"(Unstable, Linux-specific) " \
|
||||||
"avoid NPTL-FUTEX hang pthread_cond_timedwait") \
|
"avoid NPTL-FUTEX hang pthread_cond_timedwait") \
|
||||||
\
|
\
|
||||||
|
@ -29,18 +29,6 @@
|
|||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "runtime/init.hpp"
|
#include "runtime/init.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/orderAccess.inline.hpp"
|
#include "runtime/orderAccess.inline.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "runtime/vframe.hpp"
|
#include "runtime/vframe.hpp"
|
||||||
#include "utilities/preserveException.hpp"
|
#include "utilities/preserveException.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -37,6 +37,7 @@
|
|||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/signature.hpp"
|
#include "runtime/signature.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
@ -488,7 +487,6 @@ void Monitor::ILock (Thread * Self) {
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
assert(_OnDeck == ESelf, "invariant");
|
assert(_OnDeck == ESelf, "invariant");
|
||||||
if (TrySpin(Self)) break;
|
if (TrySpin(Self)) break;
|
||||||
// CONSIDER: if ESelf->TryPark() && TryLock() break ...
|
|
||||||
// It's probably wise to spin only if we *actually* blocked
|
// It's probably wise to spin only if we *actually* blocked
|
||||||
// CONSIDER: check the lockbyte, if it remains set then
|
// CONSIDER: check the lockbyte, if it remains set then
|
||||||
// preemptively drain the cxq into the EntryList.
|
// preemptively drain the cxq into the EntryList.
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/safepoint.hpp"
|
#include "runtime/safepoint.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
|
@ -27,21 +27,6 @@
|
|||||||
|
|
||||||
#include "memory/allocation.hpp"
|
#include "memory/allocation.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Mutexes used in the VM.
|
// Mutexes used in the VM.
|
||||||
|
|
||||||
|
@ -43,24 +43,12 @@
|
|||||||
#include "utilities/dtrace.hpp"
|
#include "utilities/dtrace.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/preserveException.hpp"
|
#include "utilities/preserveException.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(IA64) && !defined(PPC64)
|
#if defined(__GNUC__) && !defined(IA64) && !defined(PPC64)
|
||||||
// Need to inhibit inlining for older versions of GCC to avoid build-time failures
|
// Need to inhibit inlining for older versions of GCC to avoid build-time failures
|
||||||
#define ATTR __attribute__((noinline))
|
#define NOINLINE __attribute__((noinline))
|
||||||
#else
|
#else
|
||||||
#define ATTR
|
#define NOINLINE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -116,6 +104,7 @@
|
|||||||
// never be modified hence. Consider using __read_mostly with GCC.
|
// never be modified hence. Consider using __read_mostly with GCC.
|
||||||
|
|
||||||
int ObjectMonitor::Knob_Verbose = 0;
|
int ObjectMonitor::Knob_Verbose = 0;
|
||||||
|
int ObjectMonitor::Knob_VerifyInUse = 0;
|
||||||
int ObjectMonitor::Knob_SpinLimit = 5000; // derived by an external tool -
|
int ObjectMonitor::Knob_SpinLimit = 5000; // derived by an external tool -
|
||||||
static int Knob_LogSpins = 0; // enable jvmstat tally for spins
|
static int Knob_LogSpins = 0; // enable jvmstat tally for spins
|
||||||
static int Knob_HandOff = 0;
|
static int Knob_HandOff = 0;
|
||||||
@ -211,7 +200,7 @@ static volatile int InitDone = 0;
|
|||||||
// on EntryList|cxq. That is, spinning relieves contention on the "inner"
|
// on EntryList|cxq. That is, spinning relieves contention on the "inner"
|
||||||
// locks and monitor metadata.
|
// locks and monitor metadata.
|
||||||
//
|
//
|
||||||
// Cxq points to the the set of Recently Arrived Threads attempting entry.
|
// Cxq points to the set of Recently Arrived Threads attempting entry.
|
||||||
// Because we push threads onto _cxq with CAS, the RATs must take the form of
|
// Because we push threads onto _cxq with CAS, the RATs must take the form of
|
||||||
// a singly-linked LIFO. We drain _cxq into EntryList at unlock-time when
|
// a singly-linked LIFO. We drain _cxq into EntryList at unlock-time when
|
||||||
// the unlocking thread notices that EntryList is null but _cxq is != null.
|
// the unlocking thread notices that EntryList is null but _cxq is != null.
|
||||||
@ -281,13 +270,12 @@ bool ObjectMonitor::try_enter(Thread* THREAD) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATTR ObjectMonitor::enter(TRAPS) {
|
void NOINLINE ObjectMonitor::enter(TRAPS) {
|
||||||
// The following code is ordered to check the most common cases first
|
// The following code is ordered to check the most common cases first
|
||||||
// and to reduce RTS->RTO cache line upgrades on SPARC and IA32 processors.
|
// and to reduce RTS->RTO cache line upgrades on SPARC and IA32 processors.
|
||||||
Thread * const Self = THREAD;
|
Thread * const Self = THREAD;
|
||||||
void * cur;
|
|
||||||
|
|
||||||
cur = Atomic::cmpxchg_ptr(Self, &_owner, NULL);
|
void * cur = Atomic::cmpxchg_ptr (Self, &_owner, NULL);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
// Either ASSERT _recursions == 0 or explicitly set _recursions = 0.
|
// Either ASSERT _recursions == 0 or explicitly set _recursions = 0.
|
||||||
assert(_recursions == 0 , "invariant");
|
assert(_recursions == 0 , "invariant");
|
||||||
@ -447,7 +435,6 @@ void ATTR ObjectMonitor::enter(TRAPS) {
|
|||||||
// Callers must compensate as needed.
|
// Callers must compensate as needed.
|
||||||
|
|
||||||
int ObjectMonitor::TryLock (Thread * Self) {
|
int ObjectMonitor::TryLock (Thread * Self) {
|
||||||
for (;;) {
|
|
||||||
void * own = _owner;
|
void * own = _owner;
|
||||||
if (own != NULL) return 0;
|
if (own != NULL) return 0;
|
||||||
if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
|
if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
|
||||||
@ -461,12 +448,11 @@ int ObjectMonitor::TryLock (Thread * Self) {
|
|||||||
// Interference -- the CAS failed.
|
// Interference -- the CAS failed.
|
||||||
// We can either return -1 or retry.
|
// We can either return -1 or retry.
|
||||||
// Retry doesn't make as much sense because the lock was just acquired.
|
// Retry doesn't make as much sense because the lock was just acquired.
|
||||||
if (true) return -1;
|
return -1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATTR ObjectMonitor::EnterI (TRAPS) {
|
void NOINLINE ObjectMonitor::EnterI (TRAPS) {
|
||||||
Thread * Self = THREAD;
|
Thread * const Self = THREAD;
|
||||||
assert(Self->is_Java_thread(), "invariant");
|
assert(Self->is_Java_thread(), "invariant");
|
||||||
assert(((JavaThread *) Self)->thread_state() == _thread_blocked , "invariant");
|
assert(((JavaThread *) Self)->thread_state() == _thread_blocked , "invariant");
|
||||||
|
|
||||||
@ -562,7 +548,7 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
|
|||||||
Atomic::cmpxchg_ptr(Self, &_Responsible, NULL);
|
Atomic::cmpxchg_ptr(Self, &_Responsible, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The lock have been released while this thread was occupied queueing
|
// The lock might have been released while this thread was occupied queueing
|
||||||
// itself onto _cxq. To close the race and avoid "stranding" and
|
// itself onto _cxq. To close the race and avoid "stranding" and
|
||||||
// progress-liveness failure we must resample-retry _owner before parking.
|
// progress-liveness failure we must resample-retry _owner before parking.
|
||||||
// Note the Dekker/Lamport duality: ST cxq; MEMBAR; LD Owner.
|
// Note the Dekker/Lamport duality: ST cxq; MEMBAR; LD Owner.
|
||||||
@ -714,7 +700,7 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
|
|||||||
// Knob_Reset and Knob_SpinAfterFutile support and restructuring the
|
// Knob_Reset and Knob_SpinAfterFutile support and restructuring the
|
||||||
// loop accordingly.
|
// loop accordingly.
|
||||||
|
|
||||||
void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
|
void NOINLINE ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
|
||||||
assert(Self != NULL , "invariant");
|
assert(Self != NULL , "invariant");
|
||||||
assert(SelfNode != NULL , "invariant");
|
assert(SelfNode != NULL , "invariant");
|
||||||
assert(SelfNode->_thread == Self , "invariant");
|
assert(SelfNode->_thread == Self , "invariant");
|
||||||
@ -802,6 +788,7 @@ void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
|
|||||||
OrderAccess::fence(); // see comments at the end of EnterI()
|
OrderAccess::fence(); // see comments at the end of EnterI()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// By convention we unlink a contending thread from EntryList|cxq immediately
|
||||||
// after the thread acquires the lock in ::enter(). Equally, we could defer
|
// after the thread acquires the lock in ::enter(). Equally, we could defer
|
||||||
// unlinking the thread until ::exit()-time.
|
// unlinking the thread until ::exit()-time.
|
||||||
|
|
||||||
@ -822,7 +809,7 @@ void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
|
|||||||
assert(prv == NULL || prv->TState == ObjectWaiter::TS_ENTER, "invariant");
|
assert(prv == NULL || prv->TState == ObjectWaiter::TS_ENTER, "invariant");
|
||||||
TEVENT(Unlink from EntryList);
|
TEVENT(Unlink from EntryList);
|
||||||
} else {
|
} else {
|
||||||
guarantee(SelfNode->TState == ObjectWaiter::TS_CXQ, "invariant");
|
assert(SelfNode->TState == ObjectWaiter::TS_CXQ, "invariant");
|
||||||
// Inopportune interleaving -- Self is still on the cxq.
|
// Inopportune interleaving -- Self is still on the cxq.
|
||||||
// This usually means the enqueue of self raced an exiting thread.
|
// This usually means the enqueue of self raced an exiting thread.
|
||||||
// Normally we'll find Self near the front of the cxq, so
|
// Normally we'll find Self near the front of the cxq, so
|
||||||
@ -862,10 +849,12 @@ void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
|
|||||||
TEVENT(Unlink from cxq);
|
TEVENT(Unlink from cxq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
// Diagnostic hygiene ...
|
// Diagnostic hygiene ...
|
||||||
SelfNode->_prev = (ObjectWaiter *) 0xBAD;
|
SelfNode->_prev = (ObjectWaiter *) 0xBAD;
|
||||||
SelfNode->_next = (ObjectWaiter *) 0xBAD;
|
SelfNode->_next = (ObjectWaiter *) 0xBAD;
|
||||||
SelfNode->TState = ObjectWaiter::TS_RUN;
|
SelfNode->TState = ObjectWaiter::TS_RUN;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -918,9 +907,15 @@ void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
|
|||||||
// the integral of the # of active timers at any instant over time).
|
// the integral of the # of active timers at any instant over time).
|
||||||
// Both impinge on OS scalability. Given that, at most one thread parked on
|
// Both impinge on OS scalability. Given that, at most one thread parked on
|
||||||
// a monitor will use a timer.
|
// a monitor will use a timer.
|
||||||
|
//
|
||||||
|
// There is also the risk of a futile wake-up. If we drop the lock
|
||||||
|
// another thread can reacquire the lock immediately, and we can
|
||||||
|
// then wake a thread unnecessarily. This is benign, and we've
|
||||||
|
// structured the code so the windows are short and the frequency
|
||||||
|
// of such futile wakups is low.
|
||||||
|
|
||||||
void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
void NOINLINE ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
||||||
Thread * Self = THREAD;
|
Thread * const Self = THREAD;
|
||||||
if (THREAD != _owner) {
|
if (THREAD != _owner) {
|
||||||
if (THREAD->is_lock_owned((address) _owner)) {
|
if (THREAD->is_lock_owned((address) _owner)) {
|
||||||
// Transmute _owner from a BasicLock pointer to a Thread address.
|
// Transmute _owner from a BasicLock pointer to a Thread address.
|
||||||
@ -932,14 +927,17 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
|||||||
_recursions = 0;
|
_recursions = 0;
|
||||||
OwnerIsThread = 1;
|
OwnerIsThread = 1;
|
||||||
} else {
|
} else {
|
||||||
// NOTE: we need to handle unbalanced monitor enter/exit
|
// Apparent unbalanced locking ...
|
||||||
// in native code by throwing an exception.
|
// Naively we'd like to throw IllegalMonitorStateException.
|
||||||
// TODO: Throw an IllegalMonitorStateException ?
|
// As a practical matter we can neither allocate nor throw an
|
||||||
|
// exception as ::exit() can be called from leaf routines.
|
||||||
|
// see x86_32.ad Fast_Unlock() and the I1 and I2 properties.
|
||||||
|
// Upon deeper reflection, however, in a properly run JVM the only
|
||||||
|
// way we should encounter this situation is in the presence of
|
||||||
|
// unbalanced JNI locking. TODO: CheckJNICalls.
|
||||||
|
// See also: CR4414101
|
||||||
TEVENT(Exit - Throw IMSX);
|
TEVENT(Exit - Throw IMSX);
|
||||||
assert(false, "Non-balanced monitor enter/exit!");
|
assert(false, "Non-balanced monitor enter/exit! Likely JNI locking");
|
||||||
if (false) {
|
|
||||||
THROW(vmSymbols::java_lang_IllegalMonitorStateException());
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -988,6 +986,7 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TEVENT(Inflated exit - complex egress);
|
TEVENT(Inflated exit - complex egress);
|
||||||
|
// Other threads are blocked trying to acquire the lock.
|
||||||
|
|
||||||
// Normally the exiting thread is responsible for ensuring succession,
|
// Normally the exiting thread is responsible for ensuring succession,
|
||||||
// but if other successors are ready or other entering threads are spinning
|
// but if other successors are ready or other entering threads are spinning
|
||||||
@ -1154,9 +1153,9 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
|||||||
if (w != NULL) {
|
if (w != NULL) {
|
||||||
// I'd like to write: guarantee (w->_thread != Self).
|
// I'd like to write: guarantee (w->_thread != Self).
|
||||||
// But in practice an exiting thread may find itself on the EntryList.
|
// But in practice an exiting thread may find itself on the EntryList.
|
||||||
// Lets say thread T1 calls O.wait(). Wait() enqueues T1 on O's waitset and
|
// Let's say thread T1 calls O.wait(). Wait() enqueues T1 on O's waitset and
|
||||||
// then calls exit(). Exit release the lock by setting O._owner to NULL.
|
// then calls exit(). Exit release the lock by setting O._owner to NULL.
|
||||||
// Lets say T1 then stalls. T2 acquires O and calls O.notify(). The
|
// Let's say T1 then stalls. T2 acquires O and calls O.notify(). The
|
||||||
// notify() operation moves T1 from O's waitset to O's EntryList. T2 then
|
// notify() operation moves T1 from O's waitset to O's EntryList. T2 then
|
||||||
// release the lock "O". T2 resumes immediately after the ST of null into
|
// release the lock "O". T2 resumes immediately after the ST of null into
|
||||||
// _owner, above. T2 notices that the EntryList is populated, so it
|
// _owner, above. T2 notices that the EntryList is populated, so it
|
||||||
@ -1273,10 +1272,13 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
|||||||
// MEMBAR
|
// MEMBAR
|
||||||
// LD Self_>_suspend_flags
|
// LD Self_>_suspend_flags
|
||||||
//
|
//
|
||||||
|
// UPDATE 2007-10-6: since I've replaced the native Mutex/Monitor subsystem
|
||||||
|
// with a more efficient implementation, the need to use "FastHSSEC" has
|
||||||
|
// decreased. - Dave
|
||||||
|
|
||||||
|
|
||||||
bool ObjectMonitor::ExitSuspendEquivalent (JavaThread * jSelf) {
|
bool ObjectMonitor::ExitSuspendEquivalent (JavaThread * jSelf) {
|
||||||
int Mode = Knob_FastHSSEC;
|
const int Mode = Knob_FastHSSEC;
|
||||||
if (Mode && !jSelf->is_external_suspend()) {
|
if (Mode && !jSelf->is_external_suspend()) {
|
||||||
assert(jSelf->is_suspend_equivalent(), "invariant");
|
assert(jSelf->is_suspend_equivalent(), "invariant");
|
||||||
jSelf->clear_suspend_equivalent();
|
jSelf->clear_suspend_equivalent();
|
||||||
@ -1425,7 +1427,7 @@ void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
|
|||||||
// Wait/Notify/NotifyAll
|
// Wait/Notify/NotifyAll
|
||||||
//
|
//
|
||||||
// Note: a subset of changes to ObjectMonitor::wait()
|
// Note: a subset of changes to ObjectMonitor::wait()
|
||||||
// will need to be replicated in complete_exit above
|
// will need to be replicated in complete_exit
|
||||||
void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
|
void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
|
||||||
Thread * const Self = THREAD;
|
Thread * const Self = THREAD;
|
||||||
assert(Self->is_Java_thread(), "Must be Java thread!");
|
assert(Self->is_Java_thread(), "Must be Java thread!");
|
||||||
@ -2280,12 +2282,12 @@ ObjectWaiter::ObjectWaiter(Thread* thread) {
|
|||||||
assert(_event != NULL, "invariant");
|
assert(_event != NULL, "invariant");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectWaiter::wait_reenter_begin(ObjectMonitor *mon) {
|
void ObjectWaiter::wait_reenter_begin(ObjectMonitor * const mon) {
|
||||||
JavaThread *jt = (JavaThread *)this->_thread;
|
JavaThread *jt = (JavaThread *)this->_thread;
|
||||||
_active = JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin(jt, mon);
|
_active = JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin(jt, mon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectWaiter::wait_reenter_end(ObjectMonitor *mon) {
|
void ObjectWaiter::wait_reenter_end(ObjectMonitor * const mon) {
|
||||||
JavaThread *jt = (JavaThread *)this->_thread;
|
JavaThread *jt = (JavaThread *)this->_thread;
|
||||||
JavaThreadBlockedOnMonitorEnterState::wait_reenter_end(jt, _active);
|
JavaThreadBlockedOnMonitorEnterState::wait_reenter_end(jt, _active);
|
||||||
}
|
}
|
||||||
@ -2467,6 +2469,7 @@ void ObjectMonitor::DeferredInitialize() {
|
|||||||
#define SETKNOB(x) { Knob_##x = kvGetInt (knobs, #x, Knob_##x); }
|
#define SETKNOB(x) { Knob_##x = kvGetInt (knobs, #x, Knob_##x); }
|
||||||
SETKNOB(ReportSettings);
|
SETKNOB(ReportSettings);
|
||||||
SETKNOB(Verbose);
|
SETKNOB(Verbose);
|
||||||
|
SETKNOB(VerifyInUse);
|
||||||
SETKNOB(FixedSpin);
|
SETKNOB(FixedSpin);
|
||||||
SETKNOB(SpinLimit);
|
SETKNOB(SpinLimit);
|
||||||
SETKNOB(SpinBase);
|
SETKNOB(SpinBase);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -311,6 +311,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static int Knob_Verbose;
|
static int Knob_Verbose;
|
||||||
|
static int Knob_VerifyInUse;
|
||||||
static int Knob_SpinLimit;
|
static int Knob_SpinLimit;
|
||||||
void* operator new (size_t size) throw() {
|
void* operator new (size_t size) throw() {
|
||||||
return AllocateHeap(size, mtInternal);
|
return AllocateHeap(size, mtInternal);
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
@ -54,18 +54,6 @@
|
|||||||
#include "services/threadService.hpp"
|
#include "services/threadService.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
|
|
||||||
|
@ -629,11 +629,6 @@ class os: AllStatic {
|
|||||||
static void print_jni_name_prefix_on(outputStream* st, int args_size);
|
static void print_jni_name_prefix_on(outputStream* st, int args_size);
|
||||||
static void print_jni_name_suffix_on(outputStream* st, int args_size);
|
static void print_jni_name_suffix_on(outputStream* st, int args_size);
|
||||||
|
|
||||||
// File conventions
|
|
||||||
static const char* file_separator();
|
|
||||||
static const char* line_separator();
|
|
||||||
static const char* path_separator();
|
|
||||||
|
|
||||||
// Init os specific system properties values
|
// Init os specific system properties values
|
||||||
static void init_system_properties_values();
|
static void init_system_properties_values();
|
||||||
|
|
||||||
|
46
hotspot/src/share/vm/runtime/os.inline.hpp
Normal file
46
hotspot/src/share/vm/runtime/os.inline.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_RUNTIME_OS_INLINE_HPP
|
||||||
|
#define SHARE_VM_RUNTIME_OS_INLINE_HPP
|
||||||
|
|
||||||
|
#include "runtime/os.hpp"
|
||||||
|
|
||||||
|
#ifdef TARGET_OS_FAMILY_linux
|
||||||
|
# include "os_linux.inline.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef TARGET_OS_FAMILY_solaris
|
||||||
|
# include "os_solaris.inline.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef TARGET_OS_FAMILY_windows
|
||||||
|
# include "os_windows.inline.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef TARGET_OS_FAMILY_aix
|
||||||
|
# include "os_aix.inline.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef TARGET_OS_FAMILY_bsd
|
||||||
|
# include "os_bsd.inline.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // SHARE_VM_RUNTIME_OS_INLINE_HPP
|
@ -1810,14 +1810,8 @@ JRT_END
|
|||||||
|
|
||||||
|
|
||||||
// Handles the uncommon case in locking, i.e., contention or an inflated lock.
|
// Handles the uncommon case in locking, i.e., contention or an inflated lock.
|
||||||
#ifndef PRODUCT
|
|
||||||
int SharedRuntime::_monitor_enter_ctr=0;
|
|
||||||
#endif
|
|
||||||
JRT_ENTRY_NO_ASYNC(void, SharedRuntime::complete_monitor_locking_C(oopDesc* _obj, BasicLock* lock, JavaThread* thread))
|
JRT_ENTRY_NO_ASYNC(void, SharedRuntime::complete_monitor_locking_C(oopDesc* _obj, BasicLock* lock, JavaThread* thread))
|
||||||
oop obj(_obj);
|
oop obj(_obj);
|
||||||
#ifndef PRODUCT
|
|
||||||
_monitor_enter_ctr++; // monitor enter slow
|
|
||||||
#endif
|
|
||||||
if (PrintBiasedLockingStatistics) {
|
if (PrintBiasedLockingStatistics) {
|
||||||
Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
|
Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
|
||||||
}
|
}
|
||||||
@ -1831,15 +1825,9 @@ JRT_ENTRY_NO_ASYNC(void, SharedRuntime::complete_monitor_locking_C(oopDesc* _obj
|
|||||||
assert(!HAS_PENDING_EXCEPTION, "Should have no exception here");
|
assert(!HAS_PENDING_EXCEPTION, "Should have no exception here");
|
||||||
JRT_END
|
JRT_END
|
||||||
|
|
||||||
#ifndef PRODUCT
|
|
||||||
int SharedRuntime::_monitor_exit_ctr=0;
|
|
||||||
#endif
|
|
||||||
// Handles the uncommon cases of monitor unlocking in compiled code
|
// Handles the uncommon cases of monitor unlocking in compiled code
|
||||||
JRT_LEAF(void, SharedRuntime::complete_monitor_unlocking_C(oopDesc* _obj, BasicLock* lock))
|
JRT_LEAF(void, SharedRuntime::complete_monitor_unlocking_C(oopDesc* _obj, BasicLock* lock))
|
||||||
oop obj(_obj);
|
oop obj(_obj);
|
||||||
#ifndef PRODUCT
|
|
||||||
_monitor_exit_ctr++; // monitor exit slow
|
|
||||||
#endif
|
|
||||||
Thread* THREAD = JavaThread::current();
|
Thread* THREAD = JavaThread::current();
|
||||||
// I'm not convinced we need the code contained by MIGHT_HAVE_PENDING anymore
|
// I'm not convinced we need the code contained by MIGHT_HAVE_PENDING anymore
|
||||||
// testing was unable to ever fire the assert that guarded it so I have removed it.
|
// testing was unable to ever fire the assert that guarded it so I have removed it.
|
||||||
@ -1879,8 +1867,6 @@ void SharedRuntime::print_statistics() {
|
|||||||
ttyLocker ttyl;
|
ttyLocker ttyl;
|
||||||
if (xtty != NULL) xtty->head("statistics type='SharedRuntime'");
|
if (xtty != NULL) xtty->head("statistics type='SharedRuntime'");
|
||||||
|
|
||||||
if (_monitor_enter_ctr) tty->print_cr("%5d monitor enter slow", _monitor_enter_ctr);
|
|
||||||
if (_monitor_exit_ctr) tty->print_cr("%5d monitor exit slow", _monitor_exit_ctr);
|
|
||||||
if (_throw_null_ctr) tty->print_cr("%5d implicit null throw", _throw_null_ctr);
|
if (_throw_null_ctr) tty->print_cr("%5d implicit null throw", _throw_null_ctr);
|
||||||
|
|
||||||
SharedRuntime::print_ic_miss_histogram();
|
SharedRuntime::print_ic_miss_histogram();
|
||||||
@ -2464,9 +2450,9 @@ AdapterHandlerEntry* AdapterHandlerLibrary::get_adapter(methodHandle method) {
|
|||||||
if (PrintAdapterHandlers || PrintStubCode) {
|
if (PrintAdapterHandlers || PrintStubCode) {
|
||||||
ttyLocker ttyl;
|
ttyLocker ttyl;
|
||||||
entry->print_adapter_on(tty);
|
entry->print_adapter_on(tty);
|
||||||
tty->print_cr("i2c argument handler #%d for: %s %s (%d bytes generated)",
|
tty->print_cr("i2c argument handler #%d for: %s %s %s (%d bytes generated)",
|
||||||
_adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"),
|
_adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"),
|
||||||
method->signature()->as_C_string(), insts_size);
|
method->signature()->as_C_string(), fingerprint->as_string(), insts_size);
|
||||||
tty->print_cr("c2i argument handler starts at %p", entry->get_c2i_entry());
|
tty->print_cr("c2i argument handler starts at %p", entry->get_c2i_entry());
|
||||||
if (Verbose || PrintStubCode) {
|
if (Verbose || PrintStubCode) {
|
||||||
address first_pc = entry->base_address();
|
address first_pc = entry->base_address();
|
||||||
|
@ -516,8 +516,6 @@ class SharedRuntime: AllStatic {
|
|||||||
static void trace_ic_miss(address at);
|
static void trace_ic_miss(address at);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int _monitor_enter_ctr; // monitor enter slow
|
|
||||||
static int _monitor_exit_ctr; // monitor exit slow
|
|
||||||
static int _throw_null_ctr; // throwing a null-pointer exception
|
static int _throw_null_ctr; // throwing a null-pointer exception
|
||||||
static int _ic_miss_ctr; // total # of IC misses
|
static int _ic_miss_ctr; // total # of IC misses
|
||||||
static int _wrong_method_ctr;
|
static int _wrong_method_ctr;
|
||||||
|
@ -41,24 +41,12 @@
|
|||||||
#include "utilities/dtrace.hpp"
|
#include "utilities/dtrace.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/preserveException.hpp"
|
#include "utilities/preserveException.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(PPC64)
|
#if defined(__GNUC__) && !defined(PPC64)
|
||||||
// Need to inhibit inlining for older versions of GCC to avoid build-time failures
|
// Need to inhibit inlining for older versions of GCC to avoid build-time failures
|
||||||
#define ATTR __attribute__((noinline))
|
#define NOINLINE __attribute__((noinline))
|
||||||
#else
|
#else
|
||||||
#define ATTR
|
#define NOINLINE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
||||||
@ -218,14 +206,6 @@ void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// The following optimization isn't particularly useful.
|
|
||||||
if (mark->has_monitor() && mark->monitor()->is_entered(THREAD)) {
|
|
||||||
lock->set_displaced_header(NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The object header will never be displaced to this lock,
|
// The object header will never be displaced to this lock,
|
||||||
// so it does not matter what the value is, except that it
|
// so it does not matter what the value is, except that it
|
||||||
// must be non-zero to avoid looking like a re-entrant lock,
|
// must be non-zero to avoid looking like a re-entrant lock,
|
||||||
@ -585,7 +565,7 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
|
|||||||
// added check of the bias pattern is to avoid useless calls to
|
// added check of the bias pattern is to avoid useless calls to
|
||||||
// thread-local storage.
|
// thread-local storage.
|
||||||
if (obj->mark()->has_bias_pattern()) {
|
if (obj->mark()->has_bias_pattern()) {
|
||||||
// Box and unbox the raw reference just in case we cause a STW safepoint.
|
// Handle for oop obj in case of STW safepoint
|
||||||
Handle hobj(Self, obj);
|
Handle hobj(Self, obj);
|
||||||
// Relaxing assertion for bug 6320749.
|
// Relaxing assertion for bug 6320749.
|
||||||
assert(Universe::verify_in_progress() ||
|
assert(Universe::verify_in_progress() ||
|
||||||
@ -902,23 +882,23 @@ static void InduceScavenge (Thread * Self, const char * Whence) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Too slow for general assert or debug
|
|
||||||
void ObjectSynchronizer::verifyInUse (Thread *Self) {
|
void ObjectSynchronizer::verifyInUse (Thread *Self) {
|
||||||
ObjectMonitor* mid;
|
ObjectMonitor* mid;
|
||||||
int inusetally = 0;
|
int inusetally = 0;
|
||||||
for (mid = Self->omInUseList; mid != NULL; mid = mid->FreeNext) {
|
for (mid = Self->omInUseList; mid != NULL; mid = mid->FreeNext) {
|
||||||
inusetally ++;
|
inusetally++;
|
||||||
}
|
}
|
||||||
assert(inusetally == Self->omInUseCount, "inuse count off");
|
assert(inusetally == Self->omInUseCount, "inuse count off");
|
||||||
|
|
||||||
int freetally = 0;
|
int freetally = 0;
|
||||||
for (mid = Self->omFreeList; mid != NULL; mid = mid->FreeNext) {
|
for (mid = Self->omFreeList; mid != NULL; mid = mid->FreeNext) {
|
||||||
freetally ++;
|
freetally++;
|
||||||
}
|
}
|
||||||
assert(freetally == Self->omFreeCount, "free count off");
|
assert(freetally == Self->omFreeCount, "free count off");
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
|
ObjectMonitor * NOINLINE ObjectSynchronizer::omAlloc (Thread * Self) {
|
||||||
// A large MAXPRIVATE value reduces both list lock contention
|
// A large MAXPRIVATE value reduces both list lock contention
|
||||||
// and list coherency traffic, but also tends to increase the
|
// and list coherency traffic, but also tends to increase the
|
||||||
// number of objectMonitors in circulation as well as the STW
|
// number of objectMonitors in circulation as well as the STW
|
||||||
@ -944,7 +924,9 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
|
|||||||
m->FreeNext = Self->omInUseList;
|
m->FreeNext = Self->omInUseList;
|
||||||
Self->omInUseList = m;
|
Self->omInUseList = m;
|
||||||
Self->omInUseCount++;
|
Self->omInUseCount++;
|
||||||
// verifyInUse(Self);
|
if (ObjectMonitor::Knob_VerifyInUse) {
|
||||||
|
verifyInUse(Self);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m->FreeNext = NULL;
|
m->FreeNext = NULL;
|
||||||
}
|
}
|
||||||
@ -1064,7 +1046,9 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
|
|||||||
curmidinuse->FreeNext = mid->FreeNext; // maintain the current thread inuselist
|
curmidinuse->FreeNext = mid->FreeNext; // maintain the current thread inuselist
|
||||||
}
|
}
|
||||||
Self->omInUseCount--;
|
Self->omInUseCount--;
|
||||||
// verifyInUse(Self);
|
if (ObjectMonitor::Knob_VerifyInUse) {
|
||||||
|
verifyInUse(Self);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
curmidinuse = mid;
|
curmidinuse = mid;
|
||||||
@ -1073,7 +1057,7 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FreeNext is used for both onInUseList and omFreeList, so clear old before setting new
|
// FreeNext is used for both omInUseList and omFreeList, so clear old before setting new
|
||||||
m->FreeNext = Self->omFreeList;
|
m->FreeNext = Self->omFreeList;
|
||||||
Self->omFreeList = m;
|
Self->omFreeList = m;
|
||||||
Self->omFreeCount++;
|
Self->omFreeCount++;
|
||||||
@ -1086,7 +1070,7 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
|
|||||||
// consecutive STW safepoints. Relatedly, we might decay
|
// consecutive STW safepoints. Relatedly, we might decay
|
||||||
// omFreeProvision at STW safepoints.
|
// omFreeProvision at STW safepoints.
|
||||||
//
|
//
|
||||||
// Also return the monitors of a moribund thread"s omInUseList to
|
// Also return the monitors of a moribund thread's omInUseList to
|
||||||
// a global gOmInUseList under the global list lock so these
|
// a global gOmInUseList under the global list lock so these
|
||||||
// will continue to be scanned.
|
// will continue to be scanned.
|
||||||
//
|
//
|
||||||
@ -1127,7 +1111,6 @@ void ObjectSynchronizer::omFlush (Thread * Self) {
|
|||||||
InUseTail = curom;
|
InUseTail = curom;
|
||||||
InUseTally++;
|
InUseTally++;
|
||||||
}
|
}
|
||||||
// TODO debug
|
|
||||||
assert(Self->omInUseCount == InUseTally, "inuse count off");
|
assert(Self->omInUseCount == InUseTally, "inuse count off");
|
||||||
Self->omInUseCount = 0;
|
Self->omInUseCount = 0;
|
||||||
guarantee(InUseTail != NULL && InUseList != NULL, "invariant");
|
guarantee(InUseTail != NULL && InUseList != NULL, "invariant");
|
||||||
@ -1166,7 +1149,7 @@ ObjectMonitor* ObjectSynchronizer::inflate_helper(oop obj) {
|
|||||||
// multiple locks occupy the same $ line. Padding might be appropriate.
|
// multiple locks occupy the same $ line. Padding might be appropriate.
|
||||||
|
|
||||||
|
|
||||||
ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
|
ObjectMonitor * NOINLINE ObjectSynchronizer::inflate (Thread * Self, oop object) {
|
||||||
// Inflate mutates the heap ...
|
// Inflate mutates the heap ...
|
||||||
// Relaxing assertion for bug 6320749.
|
// Relaxing assertion for bug 6320749.
|
||||||
assert(Universe::verify_in_progress() ||
|
assert(Universe::verify_in_progress() ||
|
||||||
@ -1397,7 +1380,7 @@ enum ManifestConstants {
|
|||||||
// Deflate a single monitor if not in use
|
// Deflate a single monitor if not in use
|
||||||
// Return true if deflated, false if in use
|
// Return true if deflated, false if in use
|
||||||
bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
|
bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
|
||||||
ObjectMonitor** FreeHeadp, ObjectMonitor** FreeTailp) {
|
ObjectMonitor** freeHeadp, ObjectMonitor** freeTailp) {
|
||||||
bool deflated;
|
bool deflated;
|
||||||
// Normal case ... The monitor is associated with obj.
|
// Normal case ... The monitor is associated with obj.
|
||||||
guarantee(obj->mark() == markOopDesc::encode(mid), "invariant");
|
guarantee(obj->mark() == markOopDesc::encode(mid), "invariant");
|
||||||
@ -1427,13 +1410,13 @@ bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
|
|||||||
assert(mid->object() == NULL, "invariant");
|
assert(mid->object() == NULL, "invariant");
|
||||||
|
|
||||||
// Move the object to the working free list defined by FreeHead,FreeTail.
|
// Move the object to the working free list defined by FreeHead,FreeTail.
|
||||||
if (*FreeHeadp == NULL) *FreeHeadp = mid;
|
if (*freeHeadp == NULL) *freeHeadp = mid;
|
||||||
if (*FreeTailp != NULL) {
|
if (*freeTailp != NULL) {
|
||||||
ObjectMonitor * prevtail = *FreeTailp;
|
ObjectMonitor * prevtail = *freeTailp;
|
||||||
assert(prevtail->FreeNext == NULL, "cleaned up deflated?"); // TODO KK
|
assert(prevtail->FreeNext == NULL, "cleaned up deflated?"); // TODO KK
|
||||||
prevtail->FreeNext = mid;
|
prevtail->FreeNext = mid;
|
||||||
}
|
}
|
||||||
*FreeTailp = mid;
|
*freeTailp = mid;
|
||||||
deflated = true;
|
deflated = true;
|
||||||
}
|
}
|
||||||
return deflated;
|
return deflated;
|
||||||
@ -1441,7 +1424,7 @@ bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
|
|||||||
|
|
||||||
// Caller acquires ListLock
|
// Caller acquires ListLock
|
||||||
int ObjectSynchronizer::walk_monitor_list(ObjectMonitor** listheadp,
|
int ObjectSynchronizer::walk_monitor_list(ObjectMonitor** listheadp,
|
||||||
ObjectMonitor** FreeHeadp, ObjectMonitor** FreeTailp) {
|
ObjectMonitor** freeHeadp, ObjectMonitor** freeTailp) {
|
||||||
ObjectMonitor* mid;
|
ObjectMonitor* mid;
|
||||||
ObjectMonitor* next;
|
ObjectMonitor* next;
|
||||||
ObjectMonitor* curmidinuse = NULL;
|
ObjectMonitor* curmidinuse = NULL;
|
||||||
@ -1451,7 +1434,7 @@ int ObjectSynchronizer::walk_monitor_list(ObjectMonitor** listheadp,
|
|||||||
oop obj = (oop) mid->object();
|
oop obj = (oop) mid->object();
|
||||||
bool deflated = false;
|
bool deflated = false;
|
||||||
if (obj != NULL) {
|
if (obj != NULL) {
|
||||||
deflated = deflate_monitor(mid, obj, FreeHeadp, FreeTailp);
|
deflated = deflate_monitor(mid, obj, freeHeadp, freeTailp);
|
||||||
}
|
}
|
||||||
if (deflated) {
|
if (deflated) {
|
||||||
// extract from per-thread in-use-list
|
// extract from per-thread in-use-list
|
||||||
@ -1494,7 +1477,9 @@ void ObjectSynchronizer::deflate_idle_monitors() {
|
|||||||
nInCirculation+= cur->omInUseCount;
|
nInCirculation+= cur->omInUseCount;
|
||||||
int deflatedcount = walk_monitor_list(cur->omInUseList_addr(), &FreeHead, &FreeTail);
|
int deflatedcount = walk_monitor_list(cur->omInUseList_addr(), &FreeHead, &FreeTail);
|
||||||
cur->omInUseCount-= deflatedcount;
|
cur->omInUseCount-= deflatedcount;
|
||||||
// verifyInUse(cur);
|
if (ObjectMonitor::Knob_VerifyInUse) {
|
||||||
|
verifyInUse(cur);
|
||||||
|
}
|
||||||
nScavenged += deflatedcount;
|
nScavenged += deflatedcount;
|
||||||
nInuse += cur->omInUseCount;
|
nInuse += cur->omInUseCount;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ class ObjectSynchronizer : AllStatic {
|
|||||||
static void reenter (Handle obj, intptr_t recursion, TRAPS);
|
static void reenter (Handle obj, intptr_t recursion, TRAPS);
|
||||||
|
|
||||||
// thread-specific and global objectMonitor free list accessors
|
// thread-specific and global objectMonitor free list accessors
|
||||||
// static void verifyInUse (Thread * Self) ; too slow for general assert/debug
|
static void verifyInUse(Thread * Self);
|
||||||
static ObjectMonitor * omAlloc(Thread * Self);
|
static ObjectMonitor * omAlloc(Thread * Self);
|
||||||
static void omRelease(Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc);
|
static void omRelease(Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc);
|
||||||
static void omFlush(Thread * Self);
|
static void omFlush(Thread * Self);
|
||||||
@ -114,10 +114,10 @@ class ObjectSynchronizer : AllStatic {
|
|||||||
// An adaptive profile-based deflation policy could be used if needed
|
// An adaptive profile-based deflation policy could be used if needed
|
||||||
static void deflate_idle_monitors();
|
static void deflate_idle_monitors();
|
||||||
static int walk_monitor_list(ObjectMonitor** listheadp,
|
static int walk_monitor_list(ObjectMonitor** listheadp,
|
||||||
ObjectMonitor** FreeHeadp,
|
ObjectMonitor** freeHeadp,
|
||||||
ObjectMonitor** FreeTailp);
|
ObjectMonitor** freeTailp);
|
||||||
static bool deflate_monitor(ObjectMonitor* mid, oop obj, ObjectMonitor** FreeHeadp,
|
static bool deflate_monitor(ObjectMonitor* mid, oop obj, ObjectMonitor** freeHeadp,
|
||||||
ObjectMonitor** FreeTailp);
|
ObjectMonitor** freeTailp);
|
||||||
static void oops_do(OopClosure* f);
|
static void oops_do(OopClosure* f);
|
||||||
|
|
||||||
// debugging
|
// debugging
|
||||||
@ -130,7 +130,10 @@ class ObjectSynchronizer : AllStatic {
|
|||||||
enum { _BLOCKSIZE = 128 };
|
enum { _BLOCKSIZE = 128 };
|
||||||
static ObjectMonitor* gBlockList;
|
static ObjectMonitor* gBlockList;
|
||||||
static ObjectMonitor * volatile gFreeList;
|
static ObjectMonitor * volatile gFreeList;
|
||||||
static ObjectMonitor * volatile gOmInUseList; // for moribund thread, so monitors they inflated still get scanned
|
// global monitor in use list, for moribund threads,
|
||||||
|
// monitors they inflated need to be scanned for deflation
|
||||||
|
static ObjectMonitor * volatile gOmInUseList;
|
||||||
|
// count of entries in gOmInUseList
|
||||||
static int gOmInUseCount;
|
static int gOmInUseCount;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,18 +28,6 @@
|
|||||||
#include "runtime/task.hpp"
|
#include "runtime/task.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int PeriodicTask::_num_tasks = 0;
|
int PeriodicTask::_num_tasks = 0;
|
||||||
PeriodicTask* PeriodicTask::_tasks[PeriodicTask::max_tasks];
|
PeriodicTask* PeriodicTask::_tasks[PeriodicTask::max_tasks];
|
||||||
|
@ -85,18 +85,6 @@
|
|||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/preserveException.hpp"
|
#include "utilities/preserveException.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#if INCLUDE_ALL_GCS
|
#if INCLUDE_ALL_GCS
|
||||||
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
|
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
|
||||||
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
|
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
|
||||||
@ -4404,6 +4392,12 @@ void Thread::SpinRelease (volatile int * adr) {
|
|||||||
// It's safe if subsequent LDs and STs float "up" into the critical section,
|
// It's safe if subsequent LDs and STs float "up" into the critical section,
|
||||||
// but prior LDs and STs within the critical section can't be allowed
|
// but prior LDs and STs within the critical section can't be allowed
|
||||||
// to reorder or float past the ST that releases the lock.
|
// to reorder or float past the ST that releases the lock.
|
||||||
|
// Loads and stores in the critical section - which appear in program
|
||||||
|
// order before the store that releases the lock - must also appear
|
||||||
|
// before the store that releases the lock in memory visibility order.
|
||||||
|
// Conceptually we need a #loadstore|#storestore "release" MEMBAR before
|
||||||
|
// the ST of 0 into the lock-word which releases the lock, so fence
|
||||||
|
// more than covers this on all platforms.
|
||||||
*adr = 0;
|
*adr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4585,18 +4579,25 @@ void Thread::muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) {
|
|||||||
// This implementation pops from the head of the list. This is unfair,
|
// This implementation pops from the head of the list. This is unfair,
|
||||||
// but tends to provide excellent throughput as hot threads remain hot.
|
// but tends to provide excellent throughput as hot threads remain hot.
|
||||||
// (We wake recently run threads first).
|
// (We wake recently run threads first).
|
||||||
|
//
|
||||||
|
// All paths through muxRelease() will execute a CAS.
|
||||||
|
// Release consistency -- We depend on the CAS in muxRelease() to provide full
|
||||||
|
// bidirectional fence/MEMBAR semantics, ensuring that all prior memory operations
|
||||||
|
// executed within the critical section are complete and globally visible before the
|
||||||
|
// store (CAS) to the lock-word that releases the lock becomes globally visible.
|
||||||
void Thread::muxRelease (volatile intptr_t * Lock) {
|
void Thread::muxRelease (volatile intptr_t * Lock) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
const intptr_t w = Atomic::cmpxchg_ptr(0, Lock, LOCKBIT);
|
const intptr_t w = Atomic::cmpxchg_ptr(0, Lock, LOCKBIT);
|
||||||
assert(w & LOCKBIT, "invariant");
|
assert(w & LOCKBIT, "invariant");
|
||||||
if (w == LOCKBIT) return;
|
if (w == LOCKBIT) return;
|
||||||
ParkEvent * List = (ParkEvent *)(w & ~LOCKBIT);
|
ParkEvent * const List = (ParkEvent *) (w & ~LOCKBIT);
|
||||||
assert(List != NULL, "invariant");
|
assert(List != NULL, "invariant");
|
||||||
assert(List->OnList == intptr_t(Lock), "invariant");
|
assert(List->OnList == intptr_t(Lock), "invariant");
|
||||||
ParkEvent * nxt = List->ListNext;
|
ParkEvent * const nxt = List->ListNext;
|
||||||
|
guarantee((intptr_t(nxt) & LOCKBIT) == 0, "invariant");
|
||||||
|
|
||||||
// The following CAS() releases the lock and pops the head element.
|
// The following CAS() releases the lock and pops the head element.
|
||||||
|
// The CAS() also ratifies the previously fetched lock-word value.
|
||||||
if (Atomic::cmpxchg_ptr (intptr_t(nxt), Lock, w) != w) {
|
if (Atomic::cmpxchg_ptr (intptr_t(nxt), Lock, w) != w) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1761,34 +1761,6 @@ inline CompilerThread* JavaThread::as_CompilerThread() {
|
|||||||
return (CompilerThread*)this;
|
return (CompilerThread*)this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool JavaThread::stack_guard_zone_unused() {
|
|
||||||
return _stack_guard_state == stack_guard_unused;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool JavaThread::stack_yellow_zone_disabled() {
|
|
||||||
return _stack_guard_state == stack_guard_yellow_disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool JavaThread::stack_yellow_zone_enabled() {
|
|
||||||
#ifdef ASSERT
|
|
||||||
if (os::uses_stack_guard_pages()) {
|
|
||||||
assert(_stack_guard_state != stack_guard_unused, "guard pages must be in use");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return _stack_guard_state == stack_guard_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JavaThread::stack_available(address cur_sp) {
|
|
||||||
// This code assumes java stacks grow down
|
|
||||||
address low_addr; // Limit on the address for deepest stack depth
|
|
||||||
if (_stack_guard_state == stack_guard_unused) {
|
|
||||||
low_addr = stack_base() - stack_size();
|
|
||||||
} else {
|
|
||||||
low_addr = stack_yellow_zone_base();
|
|
||||||
}
|
|
||||||
return cur_sp > low_addr ? cur_sp - low_addr : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A thread used for Compilation.
|
// A thread used for Compilation.
|
||||||
class CompilerThread : public JavaThread {
|
class CompilerThread : public JavaThread {
|
||||||
friend class VMStructs;
|
friend class VMStructs;
|
||||||
@ -1863,7 +1835,6 @@ inline CompilerThread* CompilerThread::current() {
|
|||||||
return JavaThread::current()->as_CompilerThread();
|
return JavaThread::current()->as_CompilerThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The active thread queue. It also keeps track of the current used
|
// The active thread queue. It also keeps track of the current used
|
||||||
// thread priorities.
|
// thread priorities.
|
||||||
class Threads: AllStatic {
|
class Threads: AllStatic {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,6 +28,7 @@
|
|||||||
#define SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
#define SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
||||||
|
|
||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#ifdef TARGET_OS_FAMILY_linux
|
||||||
# include "thread_linux.inline.hpp"
|
# include "thread_linux.inline.hpp"
|
||||||
@ -136,4 +137,32 @@ inline void JavaThread::set_done_attaching_via_jni() {
|
|||||||
OrderAccess::fence();
|
OrderAccess::fence();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool JavaThread::stack_guard_zone_unused() {
|
||||||
|
return _stack_guard_state == stack_guard_unused;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool JavaThread::stack_yellow_zone_disabled() {
|
||||||
|
return _stack_guard_state == stack_guard_yellow_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t JavaThread::stack_available(address cur_sp) {
|
||||||
|
// This code assumes java stacks grow down
|
||||||
|
address low_addr; // Limit on the address for deepest stack depth
|
||||||
|
if (_stack_guard_state == stack_guard_unused) {
|
||||||
|
low_addr = stack_base() - stack_size();
|
||||||
|
} else {
|
||||||
|
low_addr = stack_yellow_zone_base();
|
||||||
|
}
|
||||||
|
return cur_sp > low_addr ? cur_sp - low_addr : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool JavaThread::stack_yellow_zone_enabled() {
|
||||||
|
#ifdef ASSERT
|
||||||
|
if (os::uses_stack_guard_pages()) {
|
||||||
|
assert(_stack_guard_state != stack_guard_unused, "guard pages must be in use");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return _stack_guard_state == stack_guard_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // SHARE_VM_RUNTIME_THREAD_INLINE_HPP
|
#endif // SHARE_VM_RUNTIME_THREAD_INLINE_HPP
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,20 +23,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// static member initialization
|
// static member initialization
|
||||||
int ThreadLocalStorage::_thread_index = -1;
|
int ThreadLocalStorage::_thread_index = -1;
|
||||||
|
@ -26,21 +26,6 @@
|
|||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
double TimeHelper::counter_to_seconds(jlong counter) {
|
double TimeHelper::counter_to_seconds(jlong counter) {
|
||||||
double count = (double) counter;
|
double count = (double) counter;
|
||||||
|
@ -260,66 +260,148 @@ Method* interpretedVFrame::method() const {
|
|||||||
return fr().interpreter_frame_method();
|
return fr().interpreter_frame_method();
|
||||||
}
|
}
|
||||||
|
|
||||||
StackValueCollection* interpretedVFrame::locals() const {
|
static StackValue* create_stack_value_from_oop_map(const InterpreterOopMap& oop_mask,
|
||||||
int length = method()->max_locals();
|
int index,
|
||||||
|
const intptr_t* const addr) {
|
||||||
|
// categorize using oop_mask
|
||||||
|
if (oop_mask.is_oop(index)) {
|
||||||
|
// reference (oop) "r"
|
||||||
|
Handle h(addr != NULL ? (*(oop*)addr) : (oop)NULL);
|
||||||
|
return new StackValue(h);
|
||||||
|
}
|
||||||
|
// value (integer) "v"
|
||||||
|
return new StackValue(addr != NULL ? *addr : 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (method()->is_native()) {
|
static bool is_in_expression_stack(const frame& fr, const intptr_t* const addr) {
|
||||||
// If the method is native, max_locals is not telling the truth.
|
assert(addr != NULL, "invariant");
|
||||||
// maxlocals then equals the size of parameters
|
|
||||||
length = method()->size_of_parameters();
|
// Ensure to be 'inside' the expresion stack (i.e., addr >= sp for Intel).
|
||||||
|
// In case of exceptions, the expression stack is invalid and the sp
|
||||||
|
// will be reset to express this condition.
|
||||||
|
if (frame::interpreter_frame_expression_stack_direction() > 0) {
|
||||||
|
return addr <= fr.interpreter_frame_tos_address();
|
||||||
}
|
}
|
||||||
|
|
||||||
StackValueCollection* result = new StackValueCollection(length);
|
return addr >= fr.interpreter_frame_tos_address();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stack_locals(StackValueCollection* result,
|
||||||
|
int length,
|
||||||
|
const InterpreterOopMap& oop_mask,
|
||||||
|
const frame& fr) {
|
||||||
|
|
||||||
|
assert(result != NULL, "invariant");
|
||||||
|
|
||||||
|
for (int i = 0; i < length; ++i) {
|
||||||
|
const intptr_t* const addr = fr.interpreter_frame_local_at(i);
|
||||||
|
assert(addr != NULL, "invariant");
|
||||||
|
assert(addr >= fr.sp(), "must be inside the frame");
|
||||||
|
|
||||||
|
StackValue* const sv = create_stack_value_from_oop_map(oop_mask, i, addr);
|
||||||
|
assert(sv != NULL, "sanity check");
|
||||||
|
|
||||||
|
result->add(sv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stack_expressions(StackValueCollection* result,
|
||||||
|
int length,
|
||||||
|
const InterpreterOopMap& oop_mask,
|
||||||
|
const frame& fr) {
|
||||||
|
|
||||||
|
assert(result != NULL, "invariant");
|
||||||
|
|
||||||
|
for (int i = 0; i < length; ++i) {
|
||||||
|
const intptr_t* addr = fr.interpreter_frame_expression_stack_at(i);
|
||||||
|
assert(addr != NULL, "invariant");
|
||||||
|
if (!is_in_expression_stack(fr, addr)) {
|
||||||
|
// Need to ensure no bogus escapes.
|
||||||
|
addr = NULL;
|
||||||
|
}
|
||||||
|
StackValue* const sv = create_stack_value_from_oop_map(oop_mask, i, addr);
|
||||||
|
assert(sv != NULL, "sanity check");
|
||||||
|
|
||||||
|
result->add(sv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StackValueCollection* interpretedVFrame::locals() const {
|
||||||
|
return stack_data(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
StackValueCollection* interpretedVFrame::expressions() const {
|
||||||
|
return stack_data(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Worker routine for fetching references and/or values
|
||||||
|
* for a particular bci in the interpretedVFrame.
|
||||||
|
*
|
||||||
|
* Returns data for either "locals" or "expressions",
|
||||||
|
* using bci relative oop_map (oop_mask) information.
|
||||||
|
*
|
||||||
|
* @param expressions bool switch controlling what data to return
|
||||||
|
(false == locals / true == expression)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
StackValueCollection* interpretedVFrame::stack_data(bool expressions) const {
|
||||||
|
|
||||||
// Get oopmap describing oops and int for current bci
|
|
||||||
InterpreterOopMap oop_mask;
|
InterpreterOopMap oop_mask;
|
||||||
|
// oopmap for current bci
|
||||||
if (TraceDeoptimization && Verbose) {
|
if (TraceDeoptimization && Verbose) {
|
||||||
// need the current JavaThread and not thread()
|
|
||||||
methodHandle m_h(Thread::current(), method());
|
methodHandle m_h(Thread::current(), method());
|
||||||
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
|
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
|
||||||
} else {
|
} else {
|
||||||
method()->mask_for(bci(), &oop_mask);
|
method()->mask_for(bci(), &oop_mask);
|
||||||
}
|
}
|
||||||
// handle locals
|
|
||||||
for(int i=0; i < length; i++) {
|
|
||||||
// Find stack location
|
|
||||||
intptr_t *addr = locals_addr_at(i);
|
|
||||||
|
|
||||||
// Depending on oop/int put it in the right package
|
const int mask_len = oop_mask.number_of_entries();
|
||||||
StackValue *sv;
|
|
||||||
if (oop_mask.is_oop(i)) {
|
// If the method is native, method()->max_locals() is not telling the truth.
|
||||||
// oop value
|
// For our purposes, max locals instead equals the size of parameters.
|
||||||
Handle h(*(oop *)addr);
|
const int max_locals = method()->is_native() ?
|
||||||
sv = new StackValue(h);
|
method()->size_of_parameters() : method()->max_locals();
|
||||||
|
|
||||||
|
assert(mask_len >= max_locals, "invariant");
|
||||||
|
|
||||||
|
const int length = expressions ? mask_len - max_locals : max_locals;
|
||||||
|
assert(length >= 0, "invariant");
|
||||||
|
|
||||||
|
StackValueCollection* const result = new StackValueCollection(length);
|
||||||
|
|
||||||
|
if (0 == length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expressions) {
|
||||||
|
stack_expressions(result, length, oop_mask, fr());
|
||||||
} else {
|
} else {
|
||||||
// integer
|
stack_locals(result, length, oop_mask, fr());
|
||||||
sv = new StackValue(*addr);
|
|
||||||
}
|
|
||||||
assert(sv != NULL, "sanity check");
|
|
||||||
result->add(sv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(length == result->size(), "invariant");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void interpretedVFrame::set_locals(StackValueCollection* values) const {
|
void interpretedVFrame::set_locals(StackValueCollection* values) const {
|
||||||
if (values == NULL || values->size() == 0) return;
|
if (values == NULL || values->size() == 0) return;
|
||||||
|
|
||||||
int length = method()->max_locals();
|
|
||||||
if (method()->is_native()) {
|
|
||||||
// If the method is native, max_locals is not telling the truth.
|
// If the method is native, max_locals is not telling the truth.
|
||||||
// maxlocals then equals the size of parameters
|
// maxlocals then equals the size of parameters
|
||||||
length = method()->size_of_parameters();
|
const int max_locals = method()->is_native() ?
|
||||||
}
|
method()->size_of_parameters() : method()->max_locals();
|
||||||
|
|
||||||
assert(length == values->size(), "Mismatch between actual stack format and supplied data");
|
assert(max_locals == values->size(), "Mismatch between actual stack format and supplied data");
|
||||||
|
|
||||||
// handle locals
|
// handle locals
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < max_locals; i++) {
|
||||||
// Find stack location
|
// Find stack location
|
||||||
intptr_t *addr = locals_addr_at(i);
|
intptr_t *addr = locals_addr_at(i);
|
||||||
|
|
||||||
// Depending on oop/int put it in the right package
|
// Depending on oop/int put it in the right package
|
||||||
StackValue *sv = values->at(i);
|
const StackValue* const sv = values->at(i);
|
||||||
assert(sv != NULL, "sanity check");
|
assert(sv != NULL, "sanity check");
|
||||||
if (sv->type() == T_OBJECT) {
|
if (sv->type() == T_OBJECT) {
|
||||||
*(oop *) addr = (sv->get_obj())();
|
*(oop *) addr = (sv->get_obj())();
|
||||||
@ -329,61 +411,6 @@ void interpretedVFrame::set_locals(StackValueCollection* values) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StackValueCollection* interpretedVFrame::expressions() const {
|
|
||||||
|
|
||||||
InterpreterOopMap oop_mask;
|
|
||||||
|
|
||||||
if (!method()->is_native()) {
|
|
||||||
// Get oopmap describing oops and int for current bci
|
|
||||||
if (TraceDeoptimization && Verbose) {
|
|
||||||
// need the current JavaThread and not thread()
|
|
||||||
methodHandle m_h(Thread::current(), method());
|
|
||||||
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
|
|
||||||
} else {
|
|
||||||
method()->mask_for(bci(), &oop_mask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the bci is a call instruction, i.e. any of the invoke* instructions,
|
|
||||||
// the InterpreterOopMap does not include expression/operand stack liveness
|
|
||||||
// info in the oop_mask/bit_mask. This can lead to a discrepancy of what
|
|
||||||
// is actually on the expression stack compared to what is given by the
|
|
||||||
// oop_map. We need to use the length reported in the oop_map.
|
|
||||||
int length = oop_mask.expression_stack_size();
|
|
||||||
|
|
||||||
assert(fr().interpreter_frame_expression_stack_size() >= length,
|
|
||||||
"error in expression stack!");
|
|
||||||
|
|
||||||
StackValueCollection* result = new StackValueCollection(length);
|
|
||||||
|
|
||||||
if (0 == length) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nof_locals = method()->max_locals();
|
|
||||||
|
|
||||||
// handle expressions
|
|
||||||
for(int i=0; i < length; i++) {
|
|
||||||
// Find stack location
|
|
||||||
intptr_t *addr = fr().interpreter_frame_expression_stack_at(i);
|
|
||||||
|
|
||||||
// Depending on oop/int put it in the right package
|
|
||||||
StackValue *sv;
|
|
||||||
if (oop_mask.is_oop(i + nof_locals)) {
|
|
||||||
// oop value
|
|
||||||
Handle h(*(oop *)addr);
|
|
||||||
sv = new StackValue(h);
|
|
||||||
} else {
|
|
||||||
// integer
|
|
||||||
sv = new StackValue(*addr);
|
|
||||||
}
|
|
||||||
assert(sv != NULL, "sanity check");
|
|
||||||
result->add(sv);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ------------- cChunk --------------
|
// ------------- cChunk --------------
|
||||||
|
|
||||||
entryVFrame::entryVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
|
entryVFrame::entryVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
|
||||||
|
@ -186,7 +186,7 @@ class interpretedVFrame: public javaVFrame {
|
|||||||
private:
|
private:
|
||||||
static const int bcp_offset;
|
static const int bcp_offset;
|
||||||
intptr_t* locals_addr_at(int offset) const;
|
intptr_t* locals_addr_at(int offset) const;
|
||||||
|
StackValueCollection* stack_data(bool expressions) const;
|
||||||
// returns where the parameters starts relative to the frame pointer
|
// returns where the parameters starts relative to the frame pointer
|
||||||
int start_of_parameters() const;
|
int start_of_parameters() const;
|
||||||
|
|
||||||
|
@ -27,21 +27,6 @@
|
|||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "runtime/virtualspace.hpp"
|
#include "runtime/virtualspace.hpp"
|
||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "oops/objArrayKlass.hpp"
|
#include "oops/objArrayKlass.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/jniHandles.hpp"
|
#include "runtime/jniHandles.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/reflectionUtils.hpp"
|
#include "runtime/reflectionUtils.hpp"
|
||||||
#include "runtime/vframe.hpp"
|
#include "runtime/vframe.hpp"
|
||||||
#include "runtime/vmThread.hpp"
|
#include "runtime/vmThread.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -26,22 +26,6 @@
|
|||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
#include "utilities/accessFlags.hpp"
|
#include "utilities/accessFlags.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void AccessFlags::atomic_set_bits(jint bits) {
|
void AccessFlags::atomic_set_bits(jint bits) {
|
||||||
// Atomically update the flags with the bits given
|
// Atomically update the flags with the bits given
|
||||||
|
@ -28,22 +28,6 @@
|
|||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
#include "utilities/bitMap.inline.hpp"
|
#include "utilities/bitMap.inline.hpp"
|
||||||
#include "utilities/copy.hpp"
|
#include "utilities/copy.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
BitMap::BitMap(bm_word_t* map, idx_t size_in_bits) :
|
BitMap::BitMap(bm_word_t* map, idx_t size_in_bits) :
|
||||||
_map(map), _size(size_in_bits), _map_allocator(false)
|
_map(map), _size(size_in_bits), _map_allocator(false)
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
#include "runtime/frame.hpp"
|
#include "runtime/frame.hpp"
|
||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
@ -52,18 +53,6 @@
|
|||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ASSERT
|
#ifndef ASSERT
|
||||||
# ifdef _DEBUG
|
# ifdef _DEBUG
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "memory/allocation.inline.hpp"
|
#include "memory/allocation.inline.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,21 +28,6 @@
|
|||||||
#include "memory/allocation.hpp"
|
#include "memory/allocation.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
#include "utilities/growableArray.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This class provides a framework for collecting various statistics.
|
// This class provides a framework for collecting various statistics.
|
||||||
// The current implementation is oriented towards counting invocations
|
// The current implementation is oriented towards counting invocations
|
||||||
|
@ -27,25 +27,11 @@
|
|||||||
#include "gc_implementation/shared/gcId.hpp"
|
#include "gc_implementation/shared/gcId.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "runtime/arguments.hpp"
|
#include "runtime/arguments.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#include "utilities/xmlstream.hpp"
|
#include "utilities/xmlstream.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "os_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "os_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "os_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_aix
|
|
||||||
# include "os_aix.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "os_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" void jio_print(const char* s); // Declarationtion of jvm method
|
extern "C" void jio_print(const char* s); // Declarationtion of jvm method
|
||||||
|
|
||||||
|
131
hotspot/test/runtime/verifier/OverriderMsg.java
Normal file
131
hotspot/test/runtime/verifier/OverriderMsg.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import jdk.internal.org.objectweb.asm.ClassWriter;
|
||||||
|
import jdk.internal.org.objectweb.asm.MethodVisitor;
|
||||||
|
import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||||
|
import com.oracle.java.testlibrary.*;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test OverriderMsg
|
||||||
|
* @bug 8026894
|
||||||
|
* @library /testlibrary
|
||||||
|
* @compile -XDignore.symbol.file OverriderMsg.java
|
||||||
|
* @run main/othervm OverriderMsg
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This test checks that the super class name is included in the message when
|
||||||
|
// a method is detected overriding a final method in its super class. The
|
||||||
|
// asm part of the test creates these two classes:
|
||||||
|
//
|
||||||
|
// public class HasFinal {
|
||||||
|
// public final void m(String s) { }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public class Overrider extends HasFinal {
|
||||||
|
// public void m(String s) { }
|
||||||
|
// public static void main(String[] args) { }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
public class OverriderMsg {
|
||||||
|
|
||||||
|
public static void dump_HasFinal () throws Exception {
|
||||||
|
|
||||||
|
ClassWriter cw = new ClassWriter(0);
|
||||||
|
MethodVisitor mv;
|
||||||
|
|
||||||
|
cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "HasFinal", null, "java/lang/Object", null);
|
||||||
|
|
||||||
|
{
|
||||||
|
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
|
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
mv.visitInsn(RETURN);
|
||||||
|
mv.visitMaxs(1, 1);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "m", "(Ljava/lang/String;)V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
mv.visitInsn(RETURN);
|
||||||
|
mv.visitMaxs(0, 2);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
cw.visitEnd();
|
||||||
|
try (FileOutputStream fos = new FileOutputStream(new File("HasFinal.class"))) {
|
||||||
|
fos.write(cw.toByteArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void dump_Overrider () throws Exception {
|
||||||
|
|
||||||
|
ClassWriter cw = new ClassWriter(0);
|
||||||
|
MethodVisitor mv;
|
||||||
|
cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "Overrider", null, "HasFinal", null);
|
||||||
|
|
||||||
|
{
|
||||||
|
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
|
mv.visitMethodInsn(INVOKESPECIAL, "HasFinal", "<init>", "()V");
|
||||||
|
mv.visitInsn(RETURN);
|
||||||
|
mv.visitMaxs(1, 1);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mv = cw.visitMethod(ACC_PUBLIC, "m", "(Ljava/lang/String;)V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
mv.visitInsn(RETURN);
|
||||||
|
mv.visitMaxs(0, 2);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
mv.visitInsn(RETURN);
|
||||||
|
mv.visitMaxs(0, 1);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
cw.visitEnd();
|
||||||
|
|
||||||
|
try (FileOutputStream fos = new FileOutputStream(new File("Overrider.class"))) {
|
||||||
|
fos.write(cw.toByteArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
dump_HasFinal();
|
||||||
|
dump_Overrider();
|
||||||
|
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, "-cp", ".", "Overrider");
|
||||||
|
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||||
|
output.shouldContain(
|
||||||
|
"java.lang.VerifyError: class Overrider overrides final method HasFinal.m(Ljava/lang/String;)V");
|
||||||
|
output.shouldHaveExitValue(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user