From 8e8d8592c0fd51b011c30ae56a3c5f314510c024 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Thu, 6 Aug 2020 13:08:26 +0200
Subject: [PATCH] Concurrent.Promise: Improved behavior for CONCURRENT_DEBUG.

Don't store raw backtraces, they may contain references to stuff
that the user doesn't expect to get extra references.
---
 lib/modules/Concurrent.pmod | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/lib/modules/Concurrent.pmod b/lib/modules/Concurrent.pmod
index 1a4b65a7ea..a50e8c0416 100644
--- a/lib/modules/Concurrent.pmod
+++ b/lib/modules/Concurrent.pmod
@@ -884,9 +884,6 @@ class Promise
 
   final int _materialised;
   final AggregateState _astate;
-#if CONCURRENT_DEBUG
-  array(Pike.BacktraceFrame) createdat;
-#endif
 
   //! Creates a new promise, optionally initialised from a traditional callback
   //! driven method via @expr{executor(success, failure, @@extra)@}.
@@ -897,9 +894,6 @@ class Promise
    function(function(mixed:void),
             function(mixed:void), mixed ...:void) executor, mixed ... extra)
   {
-#if CONCURRENT_DEBUG
-    createdat = backtrace()[..<1];
-#endif
     state = STATE_NO_FUTURE;
     if (executor)
       executor(success, failure, @extra);
@@ -1201,15 +1195,21 @@ class Promise
     return max_failures(-1);
   }
 
+  private string orig_backtrace =
+#ifdef CONCURRENT_DEBUG
+    sprintf("%s\n------\n", describe_backtrace(backtrace()))
+#else
+    ""
+#endif
+    ;
+
   protected void destroy()
   {
     // NB: Don't complain about dropping STATE_NO_FUTURE on the floor.
     if (state == STATE_PENDING)
-      try_failure(({ sprintf("%O: Promise broken.\n", this),
-#if CONCURRENT_DEBUG
-                     this->createdat ||
-#endif
-                     backtrace() }));
+      try_failure(({ sprintf("%O: Promise broken.\n%s",
+			     this, orig_backtrace),
+		     backtrace() }));
     if ((state == STATE_REJECTED) && global_on_failure)
       call_callback(global_on_failure, result);
     result = UNDEFINED;
-- 
GitLab