File 0439-minor-memory-leaks-fixes.patch of Package erlang
From 3d2b7b65e17d01850204994fd3707494a66ad6e3 Mon Sep 17 00:00:00 2001
From: Maxim Fedorov <maximfca@gmail.com>
Date: Sat, 15 May 2021 21:12:11 -0700
Subject: [PATCH] minor memory leaks fixes
erl_process: do not repeat init_misc_aux_work call, avoids small memory leak for misc_aux_work_queues.
erl_async: clean up thread progress data on exit
---
erts/emulator/asan/suppress | 5 -----
erts/emulator/beam/erl_async.c | 8 +++++++-
erts/emulator/beam/erl_process.c | 3 ---
erts/emulator/beam/erl_thr_progress.c | 16 ++++++++++++++++
erts/emulator/beam/erl_thr_progress.h | 1 +
5 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/erts/emulator/asan/suppress b/erts/emulator/asan/suppress
index 26ba649522..71db30c040 100644
--- a/erts/emulator/asan/suppress
+++ b/erts/emulator/asan/suppress
@@ -1,8 +1,3 @@
-leak:erts_alloc_permanent_cache_aligned
-
-# Harmless leak of ErtsThrPrgrData from async threads in exiting emulator
-leak:erts_thr_progress_register_unmanaged_thread
-
# Block passed to sigaltstack()
leak:sys_thread_init_signal_stack
diff --git a/erts/emulator/beam/erl_async.c b/erts/emulator/beam/erl_async.c
index 1cb7463493..3e3dc3a29d 100644
--- a/erts/emulator/beam/erl_async.c
+++ b/erts/emulator/beam/erl_async.c
@@ -368,7 +368,12 @@ static ERTS_INLINE void async_reply(ErtsAsync *a, ErtsThrQPrepEnQ_t *prep_enq)
static void
async_wakeup(void *vtse)
{
- erts_tse_set((erts_tse_t *) vtse);
+ /*
+ * 'vtse' might be NULL if we are called after an async thread
+ * has unregistered from thread progress prior to termination.
+ */
+ if (vtse)
+ erts_tse_set((erts_tse_t *) vtse);
}
static erts_tse_t *async_thread_init(ErtsAsyncQ *aq)
@@ -430,6 +435,7 @@ static void *async_main(void* arg)
async_reply(a, prep_enq);
}
+ erts_thr_progress_unregister_unmanaged_thread();
return NULL;
}
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 17780a7e87..1871b13260 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -6290,9 +6290,6 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online, int no_poll_th
erts_atomic32_set_nob(&schdlr_sspnd.changing,
set_schdlr_sspnd_change_flags);
- init_misc_aux_work();
-
-
/* init port tasks */
erts_port_task_init();
diff --git a/erts/emulator/beam/erl_thr_progress.c b/erts/emulator/beam/erl_thr_progress.c
index 639ebde424..5901c5b8b6 100644
--- a/erts/emulator/beam/erl_thr_progress.c
+++ b/erts/emulator/beam/erl_thr_progress.c
@@ -554,6 +554,22 @@ erts_thr_progress_register_unmanaged_thread(ErtsThrPrgrCallbacks *callbacks)
intrnl->unmanaged.callbacks[tpd->id] = *callbacks;
}
+void
+erts_thr_progress_unregister_unmanaged_thread(void)
+{
+ /*
+ * If used, the previously registered wakeup callback
+ * must be prepared for NULL passed as argument. This since
+ * the callback might be called after this unregistration
+ * in case of an outstanding wakeup request when unregistration
+ * is made.
+ */
+ ErtsThrPrgrData* tpd = erts_thr_progress_data();
+ ASSERT(tpd->id >= 0);
+ intrnl->unmanaged.callbacks[tpd->id].arg = NULL;
+ erts_free(ERTS_ALC_T_THR_PRGR_DATA, tpd);
+}
+
ErtsThrPrgrData *
erts_thr_progress_register_managed_thread(ErtsSchedulerData *esdp,
diff --git a/erts/emulator/beam/erl_thr_progress.h b/erts/emulator/beam/erl_thr_progress.h
index 82a5f1811d..3adc8e32c6 100644
--- a/erts/emulator/beam/erl_thr_progress.h
+++ b/erts/emulator/beam/erl_thr_progress.h
@@ -127,6 +127,7 @@ void erts_thr_progress_init(int no_schedulers, int managed, int unmanaged);
ErtsThrPrgrData *erts_thr_progress_register_managed_thread(
ErtsSchedulerData *esdp, ErtsThrPrgrCallbacks *, int, int);
void erts_thr_progress_register_unmanaged_thread(ErtsThrPrgrCallbacks *);
+void erts_thr_progress_unregister_unmanaged_thread(void);
void erts_thr_progress_active(ErtsThrPrgrData *, int on);
void erts_thr_progress_wakeup(ErtsThrPrgrData *,
ErtsThrPrgrVal value);
--
2.35.3