I was dealing with threads and have a potential deadlock problem. Someone mentioned to me about a loader lock.
I couldn't find much information online. Can someone please help me and explain, "What is a Loader Lock" ?
For example, review this question:
Loader lock error
The general idea of loader lock: The system runs the code in
DllMain
inside a lock (as in - synchronization lock). Therefore, running non-trivial code insideDllMain
is "asking for a deadlock"
Answer I've mentioned is based on this article:
Another reason not to do anything scary in your DllMain
: Inadvertent deadlock
Your DllMain function runs inside the loader lock, one of the few times the OS lets you run code while one of its internal locks is held. This means that you must be extra careful not to violate a lock hierarchy in your
DllMain
; otherwise, you are asking for a deadlock.The loader lock is taken by any function that needs to access the list of DLLs loaded into the process. This includes functions like
GetModuleHandle
andGetModuleFileName
. If yourDllMain
enters a critical section or waits on a synchronization object, and that critical section or synchronization object is owned by some code that is in turn waiting for the loader lock, you just created a deadlock:
// global variable
CRITICAL_SECTION g_csGlobal;
// some code somewhere
EnterCriticalSection(&g_csGlobal);
... GetModuleFileName(MyInstance, ..);
LeaveCriticalSection(&g_csGlobal);
BOOL WINAPI
DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved)
{
switch (fdwReason) {
...
case DLL_THREAD_DETACH:
EnterCriticalSection(&g_csGlobal);
...
}
...
}
Please review the whole article for full understanding.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With