[Cmake-commits] CMake branch, next, updated. v3.5.1-926-g273c68fe

Brad King brad.king at kitware.com
Wed Apr 13 10:48:21 EDT 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  273c68fe269b62f07081208763f77e7d2dbb8b5b (commit)
       via  6620b020665c65153146ac6ea87ed06046db4244 (commit)
       via  5db66c80eb39bf0113c60984a33f77d8e6f4d729 (commit)
      from  8c2d200d987eaf4f4261e65990b2feee41c328b3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=273c68fe269b62f07081208763f77e7d2dbb8b5b
commit 273c68fe269b62f07081208763f77e7d2dbb8b5b
Merge: 8c2d200 6620b02
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Wed Apr 13 10:48:20 2016 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Wed Apr 13 10:48:20 2016 -0400

    Merge topic 'refactor-cmListFileBacktrace' into next
    
    6620b020 cmState: Avoid accumulating snapshot storage for backtraces
    5db66c80 cmState: Add Snapshot method to get bottom of call stack


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6620b020665c65153146ac6ea87ed06046db4244
commit 6620b020665c65153146ac6ea87ed06046db4244
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Tue Apr 12 17:07:08 2016 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed Apr 13 10:00:59 2016 -0400

    cmState: Avoid accumulating snapshot storage for backtraces
    
    Changes during post-3.3/pre-3.4 development refactored storage of most
    configure-time information, including variable bindings and function
    scopes.  All scopes (even short-lived) were kept persistently for
    possible future debugging features, causing huge accumulated memory
    usage.  This was mostly addressed by commit v3.4.1~4^2 (cmState: Avoid
    accumulating snapshot storage for short-lived scopes, 2015-11-24).
    
    Since then we still keep short-lived scopes when they are needed for a
    backtrace.  This is because since commit v3.4.0-rc1~378^2
    (cmListFileBacktrace: Implement in terms of cmState::Snapshot,
    2015-05-29) backtraces have been lightweight objects that simply point
    into the snapshot tree.  While the intention of this approach was to
    avoid duplicating the call stack file path strings, the cost turned out
    to be holding on to the entire call stack worth of scope snapshots,
    which is much worse.
    
    Furthermore, since commit v3.4.0-rc2~1^2 (cmIfCommand: Issue CMP0054
    warning with appropriate context, 2015-10-20) all conditions used in
    `if()` commands hold a backtrace for use in diagnostic messages.  Even
    though the backtrace is short-lived it still causes the scope snapshot
    to be kept.  This means that code like
    
        function(foo)
          if(0)
          endif()
        endfunction()
    
        foreach(i RANGE 1000000)
          foo()
        endforeach()
    
    accumulates storage for the function call scope snapshots.
    
    Fix this by partially reverting commit v3.4.0-rc1~378^2 and saving the
    entire call stack during cmListFileBacktrace construction.  This way
    we can avoid keeping short-lived scope snapshot storage in all cases.

diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx
index d5d0184..f198ac3 100644
--- a/Source/cmListFileCache.cxx
+++ b/Source/cmListFileCache.cxx
@@ -400,13 +400,40 @@ bool cmListFileParser::AddArgument(cmListFileLexer_Token* token,
 
 cmListFileBacktrace::cmListFileBacktrace(cmState::Snapshot snapshot,
                                          cmCommandContext const& cc)
-  : Context(cc)
-  , Snapshot(snapshot)
+  : Snapshot(snapshot)
 {
-  if (this->Snapshot.IsValid())
+  if (!this->Snapshot.IsValid())
+    {
+    return;
+    }
+
+  // Record the entire call stack now so that the `Snapshot` we
+  // save for later refers to a long-lived scope.  This avoids
+  // having to keep short-lived scopes around just to extract
+  // their backtrace information later.
+
+  cmListFileContext lfc =
+    cmListFileContext::FromCommandContext(
+      cc, this->Snapshot.GetExecutionListFile());
+  this->push_back(lfc);
+
+  cmState::Snapshot parent = this->Snapshot.GetCallStackParent();
+  while (parent.IsValid())
     {
-    this->Snapshot.Keep();
+    lfc.Name = this->Snapshot.GetEntryPointCommand();
+    lfc.Line = this->Snapshot.GetEntryPointLine();
+    lfc.FilePath = parent.GetExecutionListFile();
+    if (lfc.FilePath.empty())
+      {
+      break;
+      }
+    this->push_back(lfc);
+
+    this->Snapshot = parent;
+    parent = parent.GetCallStackParent();
     }
+
+  this->Snapshot = this->Snapshot.GetCallStackBottom();
 }
 
 cmListFileBacktrace::~cmListFileBacktrace()
@@ -415,48 +442,30 @@ cmListFileBacktrace::~cmListFileBacktrace()
 
 void cmListFileBacktrace::PrintTitle(std::ostream& out) const
 {
-  if (!this->Snapshot.IsValid())
+  if (this->empty())
     {
     return;
     }
   cmOutputConverter converter(this->Snapshot);
-  cmListFileContext lfc =
-      cmListFileContext::FromCommandContext(
-        this->Context, this->Snapshot.GetExecutionListFile());
+  cmListFileContext lfc = this->front();
   lfc.FilePath = converter.Convert(lfc.FilePath, cmOutputConverter::HOME);
   out << (lfc.Line ? " at " : " in ") << lfc;
 }
 
 void cmListFileBacktrace::PrintCallStack(std::ostream& out) const
 {
-  if (!this->Snapshot.IsValid())
-    {
-    return;
-    }
-  cmState::Snapshot parent = this->Snapshot.GetCallStackParent();
-  if (!parent.IsValid() || parent.GetExecutionListFile().empty())
+  if (this->size() <= 1)
     {
     return;
     }
+  out << "Call Stack (most recent call first):\n";
 
   cmOutputConverter converter(this->Snapshot);
-  std::string commandName = this->Snapshot.GetEntryPointCommand();
-  long commandLine = this->Snapshot.GetEntryPointLine();
-
-  out << "Call Stack (most recent call first):\n";
-  while(parent.IsValid())
+  for (const_iterator i = this->begin() + 1; i != this->end(); ++i)
     {
-    cmListFileContext lfc;
-    lfc.Name = commandName;
-    lfc.Line = commandLine;
-
-    lfc.FilePath = converter.Convert(parent.GetExecutionListFile(),
-                                     cmOutputConverter::HOME);
+    cmListFileContext lfc = *i;
+    lfc.FilePath = converter.Convert(lfc.FilePath, cmOutputConverter::HOME);
     out << "  " << lfc << "\n";
-
-    commandName = parent.GetEntryPointCommand();
-    commandLine = parent.GetEntryPointLine();
-    parent = parent.GetCallStackParent();
     }
 }
 
diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h
index 4d3055f..d3cab22 100644
--- a/Source/cmListFileCache.h
+++ b/Source/cmListFileCache.h
@@ -87,7 +87,7 @@ struct cmListFileFunction: public cmCommandContext
   std::vector<cmListFileArgument> Arguments;
 };
 
-class cmListFileBacktrace
+class cmListFileBacktrace: private std::vector<cmListFileContext>
 {
   public:
     cmListFileBacktrace(cmState::Snapshot snapshot = cmState::Snapshot(),
@@ -97,7 +97,6 @@ class cmListFileBacktrace
     void PrintTitle(std::ostream& out) const;
     void PrintCallStack(std::ostream& out) const;
   private:
-    cmCommandContext Context;
     cmState::Snapshot Snapshot;
 };
 
diff --git a/Source/cmState.cxx b/Source/cmState.cxx
index c48f9b1..bec5682 100644
--- a/Source/cmState.cxx
+++ b/Source/cmState.cxx
@@ -1098,11 +1098,6 @@ void cmState::Directory::SetCurrentBinary(std::string const& dir)
   this->Snapshot_.SetDefinition("CMAKE_CURRENT_BINARY_DIR", loc.c_str());
 }
 
-void cmState::Snapshot::Keep()
-{
-  this->Position->Keep = true;
-}
-
 void cmState::Snapshot::SetListFile(const std::string& listfile)
 {
   *this->Position->ExecutionListFile = listfile;
diff --git a/Source/cmState.h b/Source/cmState.h
index 0cce644..507d500 100644
--- a/Source/cmState.h
+++ b/Source/cmState.h
@@ -63,7 +63,6 @@ public:
     std::vector<std::string> ClosureKeys() const;
     bool RaiseScope(std::string const& var, const char* varDef);
 
-    void Keep();
     void SetListFile(std::string const& listfile);
 
     std::string GetExecutionListFile() const;

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5db66c80eb39bf0113c60984a33f77d8e6f4d729
commit 5db66c80eb39bf0113c60984a33f77d8e6f4d729
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Wed Apr 13 09:41:24 2016 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed Apr 13 09:59:46 2016 -0400

    cmState: Add Snapshot method to get bottom of call stack
    
    The bottom of the call stack is always a long-lived snapshot and can be
    saved for later use with cmOutputConverter.

diff --git a/Source/cmState.cxx b/Source/cmState.cxx
index be8e418..c48f9b1 100644
--- a/Source/cmState.cxx
+++ b/Source/cmState.cxx
@@ -1213,6 +1213,21 @@ cmState::Snapshot cmState::Snapshot::GetCallStackParent() const
   return snapshot;
 }
 
+cmState::Snapshot cmState::Snapshot::GetCallStackBottom() const
+{
+  assert(this->State);
+  assert(this->Position != this->State->SnapshotData.Root());
+
+  PositionType pos = this->Position;
+  while (pos->SnapshotType != cmState::BaseType &&
+         pos->SnapshotType != cmState::BuildsystemDirectoryType &&
+         pos != this->State->SnapshotData.Root())
+    {
+    ++pos;
+    }
+  return Snapshot(this->State, pos);
+}
+
 void cmState::Snapshot::PushPolicy(cmPolicies::PolicyMap entry, bool weak)
 {
   PositionType pos = this->Position;
diff --git a/Source/cmState.h b/Source/cmState.h
index ef61406..0cce644 100644
--- a/Source/cmState.h
+++ b/Source/cmState.h
@@ -75,6 +75,7 @@ public:
     bool IsValid() const;
     Snapshot GetBuildsystemDirectoryParent() const;
     Snapshot GetCallStackParent() const;
+    Snapshot GetCallStackBottom() const;
     SnapshotType GetType() const;
 
     void SetPolicy(cmPolicies::PolicyID id, cmPolicies::PolicyStatus status);

-----------------------------------------------------------------------

Summary of changes:
 Source/cmListFileCache.cxx |   67 +++++++++++++++++++++++++-------------------
 Source/cmListFileCache.h   |    3 +-
 Source/cmState.cxx         |   20 +++++++++----
 Source/cmState.h           |    2 +-
 4 files changed, 55 insertions(+), 37 deletions(-)


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list