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)