https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89893

--- Comment #6 from Martin Liška <marxin at gcc dot gnu.org> ---
One more debugging patch:

diff --git a/src/node_platform.cc b/src/node_platform.cc
index fd8d045..b19f541 100644
--- a/src/node_platform.cc
+++ b/src/node_platform.cc
@@ -342,10 +342,13 @@ void
PerIsolatePlatformData::DeleteFromScheduledTasks(DelayedTask* task) {
       });
   CHECK_NE(it, scheduled_delayed_tasks_.end());
   scheduled_delayed_tasks_.erase(it);
+  __builtin_printf ("erasing: %p\n", task);
+  __builtin_printf ("lenght: %d\n", scheduled_delayed_tasks_.size());
 }

 void PerIsolatePlatformData::RunForegroundTask(uv_timer_t* handle) {
   DelayedTask* delayed = static_cast<DelayedTask*>(handle->data);
+  __builtin_printf ("run fore %p\n", delayed);
   RunForegroundTask(std::move(delayed->task));
   delayed->platform_data->DeleteFromScheduledTasks(delayed);
 }
@@ -366,11 +369,13 @@ void NodePlatform::DrainBackgroundTasks(Isolate* isolate)
{
   } while (per_isolate->FlushForegroundTasksInternal());
 }

+//#pragma GCC optimize ("O2")
 bool PerIsolatePlatformData::FlushForegroundTasksInternal() {
   bool did_work = false;

   while (std::unique_ptr<DelayedTask> delayed =
       foreground_delayed_tasks_.Pop()) {
+    __builtin_printf ("foreground_delayed_tasks_ called: %p\n",
delayed.get());
     did_work = true;
     uint64_t delay_millis =
         static_cast<uint64_t>(delayed->timeout + 0.5) * 1000;
@@ -383,18 +388,23 @@ bool
PerIsolatePlatformData::FlushForegroundTasksInternal() {

     scheduled_delayed_tasks_.emplace_back(delayed.release(),
                                           [](DelayedTask* delayed) {
+                              __builtin_printf ("lambda called\n");
       uv_close(reinterpret_cast<uv_handle_t*>(&delayed->timer),
                [](uv_handle_t* handle) {
-        delete static_cast<DelayedTask*>(handle->data);
+        DelayedTask *dt = static_cast<DelayedTask*>(handle->data);
+        __builtin_printf ("deleting %p\n", dt);
+        delete dt;
       });
     });
   }
+
   // Move all foreground tasks into a separate queue and flush that queue.
   // This way tasks that are posted while flushing the queue will be run on
the
   // next call of FlushForegroundTasksInternal.
   std::queue<std::unique_ptr<Task>> tasks = foreground_tasks_.PopAll();
   while (!tasks.empty()) {
     std::unique_ptr<Task> task = std::move(tasks.front());
+    __builtin_printf ("foreground_tasks_ called: %p\n", task.get());
     tasks.pop();
     did_work = true;
     RunForegroundTask(std::move(task));

With that I see:
foreground_delayed_tasks_ called: 0x1d7d000
foreground_tasks_ called: 0x1ddce18
foreground_tasks_ called: 0x1dbd458
run fore 0x1d7d000
lambda called
erasing: 0x1d7d000
lenght: 0
run fore 0x1d7d000
Segmentation fault (core dumped)

Reply via email to