Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
1060-minor-memory-leaks-fixes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1060-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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor