[RFC] Free memory allocated for ManagedStaticMutex


In llvm_shutdown function we destroy all objects in the StaticList. This procedure as well as RegisterManagedStatic are guarded by ManagedStaticMutex which is a static pointer visible only in ManagedStatic.cpp. Memory for the mutex is allocated at initializeMutex function and we never free this memory. From my experience this can cause a memory leak problem if we create a dll linked with LLVM libraries and the dll gets loaded(LoadLibrary Windows API) and unload(FreeLibrary Windows API) at runtime many times.

My proposal is to provide deleteManagedStaticMutex LLVM API, so we can deallocate the mutex from DllMain on Windows. Please take a look at https://reviews.llvm.org/D52425

I also think it’s worth adding deleteManagedStaticMutex to llvm_shutdown_obj’s destructor. I have attached valgrind logs with and without deleting ManagedStaticMutex.

Best regards.

Alexey Sotkin.

Original.txt (4.83 KB)

MutexDeleted.txt (2.38 KB)

Let’s not do this. It’s really best for global mutexes to live for the entire process lifetime. Initializing them and deinitializing them just asks for races. Perhaps you can avoid this problem by pinning your LLVM DLL in memory by LoadLibrary’ing it and dropping the reference.

Hi Reid,

Thanks for the feedback. Could you elaborate on pinning and dropping topic. I don’t quite understand what do you mean.


Alexey Sotkin

How does keeping the DLL in-memory help with not leaking the mutex? Or is the recommendation to just ignore the leak?

The leak is that when the DLL is reloaded, it is allocated again. If you prevent the DLL from ever being unloaded, there’s no accumulation, just some memory that lives for the entire process lifetime.