https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89893
--- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> ---
So I was able to track that to a single function:
diff --git a/src/node_platform.cc b/src/node_platform.cc
index fd8d045..ba344ba 100644
--- a/src/node_platform.cc
+++ b/src/node_platform.cc
@@ -346,6 +346,7 @@ void
PerIsolatePlatformData::DeleteFromScheduledTasks(DelayedTask* task) {
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 +367,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;
@@ -385,16 +388,20 @@ bool
PerIsolatePlatformData::FlushForegroundTasksInternal() {
[](DelayedTask* delayed) {
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));
Using that version I see:
...
RegExp : 7291
----
Score (version 9): 7291
duration 0 seconds
(node:19073) [DEP0016] DeprecationWarning: 'GLOBAL' is deprecated, use 'global'
foreground_delayed_tasks_ called: 0x1de23b0
foreground_tasks_ called: 0x1dd6ee8
foreground_tasks_ called: 0x1da3d88
while commenting out the '#pragma GCC optimize ("O2")' line one can see:
...
foreground_delayed_tasks_ called: 0x1d7e900
foreground_tasks_ called: 0x1ddc268
foreground_tasks_ called: 0x1dc53c8
run fore 0x1d7e900
run fore 0x1d7e900
So void PerIsolatePlatformData::RunForegroundTask(uv_timer_t* handle) is called
and delayed->task == NULL.
I'm not much familiar with unique_ptr, but first loop in
FlushForegroundTasksInternal calls
delayed.release() and there's quite a lot of casting as well.
Can you 康 珊 investigate that?