changeset 20364:c6211b707068

8055007: NMT2: emptyStack missing in minimal build Summary: Refactored emptyStack to a static member of NativeCallStack, which is accessible in minimal build. Reviewed-by: coleenp, dholmes
author zgu
date Tue, 19 Aug 2014 08:34:25 -0400
parents 36c9011aaead
children 3adc0e278f49
files src/share/vm/services/mallocSiteTable.hpp src/share/vm/services/memTracker.cpp src/share/vm/services/memTracker.hpp src/share/vm/services/nmtCommon.hpp src/share/vm/services/virtualMemoryTracker.cpp src/share/vm/services/virtualMemoryTracker.hpp src/share/vm/utilities/nativeCallStack.cpp src/share/vm/utilities/nativeCallStack.hpp
diffstat 8 files changed, 17 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/services/mallocSiteTable.hpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/mallocSiteTable.hpp	Tue Aug 19 08:34:25 2014 -0400
@@ -32,13 +32,14 @@
 #include "services/allocationSite.hpp"
 #include "services/mallocTracker.hpp"
 #include "services/nmtCommon.hpp"
+#include "utilities/nativeCallStack.hpp"
 
 // MallocSite represents a code path that eventually calls
 // os::malloc() to allocate memory
 class MallocSite : public AllocationSite<MemoryCounter> {
  public:
   MallocSite() :
-    AllocationSite<MemoryCounter>(emptyStack) { }
+    AllocationSite<MemoryCounter>(NativeCallStack::EMPTY_STACK) { }
 
   MallocSite(const NativeCallStack& stack) :
     AllocationSite<MemoryCounter>(stack) { }
--- a/src/share/vm/services/memTracker.cpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/memTracker.cpp	Tue Aug 19 08:34:25 2014 -0400
@@ -39,8 +39,6 @@
 volatile NMT_TrackingLevel MemTracker::_tracking_level = NMT_unknown;
 NMT_TrackingLevel MemTracker::_cmdline_tracking_level = NMT_unknown;
 
-NativeCallStack emptyStack(0, false);
-
 MemBaseline MemTracker::_baseline;
 Mutex*      MemTracker::_query_lock = NULL;
 bool MemTracker::_is_nmt_env_valid = true;
@@ -69,6 +67,10 @@
     os::unsetenv(buf);
   }
 
+  // Construct NativeCallStack::EMPTY_STACK. It may get constructed twice,
+  // but it is benign, the results are the same.
+  ::new ((void*)&NativeCallStack::EMPTY_STACK) NativeCallStack(0, false);
+
   if (!MallocTracker::initialize(level) ||
       !VirtualMemoryTracker::initialize(level)) {
     level = NMT_off;
--- a/src/share/vm/services/memTracker.hpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/memTracker.hpp	Tue Aug 19 08:34:25 2014 -0400
@@ -26,14 +26,13 @@
 #define SHARE_VM_SERVICES_MEM_TRACKER_HPP
 
 #include "services/nmtCommon.hpp"
+#include "utilities/nativeCallStack.hpp"
 
-class NativeCallStack;
-extern NativeCallStack emptyStack;
 
 #if !INCLUDE_NMT
 
-#define CURRENT_PC   emptyStack
-#define CALLER_PC    emptyStack
+#define CURRENT_PC   NativeCallStack::EMPTY_STACK
+#define CALLER_PC    NativeCallStack::EMPTY_STACK
 
 class Tracker : public StackObj {
  public:
@@ -83,9 +82,9 @@
 extern volatile bool NMT_stack_walkable;
 
 #define CURRENT_PC ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ? \
-                    NativeCallStack(0, true) : emptyStack)
+                    NativeCallStack(0, true) : NativeCallStack::EMPTY_STACK)
 #define CALLER_PC  ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ?  \
-                    NativeCallStack(1, true) : emptyStack)
+                    NativeCallStack(1, true) : NativeCallStack::EMPTY_STACK)
 
 class MemBaseline;
 class Mutex;
--- a/src/share/vm/services/nmtCommon.hpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/nmtCommon.hpp	Tue Aug 19 08:34:25 2014 -0400
@@ -50,9 +50,6 @@
 // build time decision.
 const int NMT_TrackingStackDepth = 4;
 
-class NativeCallStack;
-extern NativeCallStack emptyStack;
-
 // A few common utilities for native memory tracking
 class NMTUtil : AllStatic {
  public:
--- a/src/share/vm/services/virtualMemoryTracker.cpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/virtualMemoryTracker.cpp	Tue Aug 19 08:34:25 2014 -0400
@@ -167,7 +167,7 @@
           // higher part
           address high_base = addr + sz;
           size_t  high_size = top - high_base;
-          CommittedMemoryRegion high_rgn(high_base, high_size, emptyStack);
+          CommittedMemoryRegion high_rgn(high_base, high_size, NativeCallStack::EMPTY_STACK);
           return add_committed_region(high_rgn);
         } else {
           return false;
--- a/src/share/vm/services/virtualMemoryTracker.hpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/services/virtualMemoryTracker.hpp	Tue Aug 19 08:34:25 2014 -0400
@@ -320,7 +320,7 @@
 
 
   ReservedMemoryRegion(address base, size_t size) :
-    VirtualMemoryRegion(base, size), _stack(emptyStack), _flag(mtNone),
+    VirtualMemoryRegion(base, size), _stack(NativeCallStack::EMPTY_STACK), _flag(mtNone),
     _all_committed(false) { }
 
   // Copy constructor
--- a/src/share/vm/utilities/nativeCallStack.cpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/utilities/nativeCallStack.cpp	Tue Aug 19 08:34:25 2014 -0400
@@ -27,6 +27,7 @@
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/nativeCallStack.hpp"
 
+const NativeCallStack NativeCallStack::EMPTY_STACK(0, false);
 
 NativeCallStack::NativeCallStack(int toSkip, bool fillStack) :
   _hash_value(0) {
--- a/src/share/vm/utilities/nativeCallStack.hpp	Thu Aug 14 09:02:51 2014 -0400
+++ b/src/share/vm/utilities/nativeCallStack.hpp	Tue Aug 19 08:34:25 2014 -0400
@@ -52,6 +52,9 @@
  *    from it.
  */
 class NativeCallStack : public StackObj {
+ public:
+  static const NativeCallStack EMPTY_STACK;
+
  private:
   address   _stack[NMT_TrackingStackDepth];
   int       _hash_value;