BACKPORT: 8205965: SIGSEGV on write to NativeCallStack::EMPTY_STACK
Summary: Made EMPTY_STACK non-const, so it will not be placed in read-only BSS section.
Reviewed-by: stuefe, martin
Change-Id: I4f12a640f2aa1dfab1ac531911227e6a2c0ad846
diff --git a/src/share/vm/services/mallocSiteTable.hpp b/src/share/vm/services/mallocSiteTable.hpp
index 7ded2d2..8b85be9 100644
--- a/src/share/vm/services/mallocSiteTable.hpp
+++ b/src/share/vm/services/mallocSiteTable.hpp
@@ -39,7 +39,7 @@
class MallocSite : public AllocationSite<MemoryCounter> {
public:
MallocSite() :
- AllocationSite<MemoryCounter>(NativeCallStack::EMPTY_STACK) { }
+ AllocationSite<MemoryCounter>(NativeCallStack::empty_stack()) { }
MallocSite(const NativeCallStack& stack) :
AllocationSite<MemoryCounter>(stack) { }
diff --git a/src/share/vm/services/memTracker.hpp b/src/share/vm/services/memTracker.hpp
index 1682cb9..22e903a 100644
--- a/src/share/vm/services/memTracker.hpp
+++ b/src/share/vm/services/memTracker.hpp
@@ -31,8 +31,8 @@
#if !INCLUDE_NMT
-#define CURRENT_PC NativeCallStack::EMPTY_STACK
-#define CALLER_PC NativeCallStack::EMPTY_STACK
+#define CURRENT_PC NativeCallStack::empty_stack()
+#define CALLER_PC NativeCallStack::empty_stack()
class Tracker : public StackObj {
public:
@@ -82,9 +82,9 @@
extern volatile bool NMT_stack_walkable;
#define CURRENT_PC ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ? \
- NativeCallStack(0, true) : NativeCallStack::EMPTY_STACK)
+ NativeCallStack(0, true) : NativeCallStack::empty_stack())
#define CALLER_PC ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ? \
- NativeCallStack(1, true) : NativeCallStack::EMPTY_STACK)
+ NativeCallStack(1, true) : NativeCallStack::empty_stack())
class MemBaseline;
class Mutex;
diff --git a/src/share/vm/services/virtualMemoryTracker.cpp b/src/share/vm/services/virtualMemoryTracker.cpp
index c21aa54..43466c6 100644
--- a/src/share/vm/services/virtualMemoryTracker.cpp
+++ b/src/share/vm/services/virtualMemoryTracker.cpp
@@ -165,7 +165,7 @@
// higher part
address high_base = addr + sz;
size_t high_size = top - high_base;
- CommittedMemoryRegion high_rgn(high_base, high_size, NativeCallStack::EMPTY_STACK);
+ CommittedMemoryRegion high_rgn(high_base, high_size, NativeCallStack::empty_stack());
return add_committed_region(high_rgn);
} else {
return false;
diff --git a/src/share/vm/services/virtualMemoryTracker.hpp b/src/share/vm/services/virtualMemoryTracker.hpp
index 02d21bd..eb52aca 100644
--- a/src/share/vm/services/virtualMemoryTracker.hpp
+++ b/src/share/vm/services/virtualMemoryTracker.hpp
@@ -304,7 +304,7 @@
ReservedMemoryRegion(address base, size_t size) :
- VirtualMemoryRegion(base, size), _stack(NativeCallStack::EMPTY_STACK), _flag(mtNone),
+ VirtualMemoryRegion(base, size), _stack(NativeCallStack::empty_stack()), _flag(mtNone),
_all_committed(false) { }
// Copy constructor
diff --git a/src/share/vm/utilities/nativeCallStack.cpp b/src/share/vm/utilities/nativeCallStack.cpp
index b606f9e..3acb836 100644
--- a/src/share/vm/utilities/nativeCallStack.cpp
+++ b/src/share/vm/utilities/nativeCallStack.cpp
@@ -27,7 +27,7 @@
#include "utilities/globalDefinitions.hpp"
#include "utilities/nativeCallStack.hpp"
-const NativeCallStack NativeCallStack::EMPTY_STACK(0, false);
+NativeCallStack NativeCallStack::EMPTY_STACK(0, false);
NativeCallStack::NativeCallStack(int toSkip, bool fillStack) :
_hash_value(0) {
@@ -119,4 +119,3 @@
}
}
}
-
diff --git a/src/share/vm/utilities/nativeCallStack.hpp b/src/share/vm/utilities/nativeCallStack.hpp
index 673d493..cb58f94 100644
--- a/src/share/vm/utilities/nativeCallStack.hpp
+++ b/src/share/vm/utilities/nativeCallStack.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, 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
@@ -51,18 +51,23 @@
* 2. The class is strict stack object, no heap or virtual memory can be allocated
* from it.
*/
-class NativeCallStack : public StackObj {
- public:
- static const NativeCallStack EMPTY_STACK;
+class MemTracker;
- private:
+class NativeCallStack : public StackObj {
+ friend class MemTracker;
+
+private:
address _stack[NMT_TrackingStackDepth];
unsigned int _hash_value;
- public:
+ static NativeCallStack EMPTY_STACK;
+public:
NativeCallStack(int toSkip = 0, bool fillStack = false);
NativeCallStack(address* pc, int frameCount);
+ static inline const NativeCallStack& empty_stack() {
+ return EMPTY_STACK;
+ }
// if it is an empty stack
inline bool is_empty() const {