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" ?
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:
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.
running non-trivial code
? What would classify as non-trivial ? Why will it cause deadlock ? –
Ambala Loader refers to the OS (module) loader. Loader Lock is a system lock used by the loader to synchronize calls to DllMain. This way, the loader ensures that initialization / cleanup tasks required by DLLs are performed in a thread-safe manner.
This system lock is used for static initialization, static destruction and thread creation. It is also shared by various Win32 APIs.
Preventing Hangs in Windows Applications
(...) the operating system has its own internal process-specific lock that sometimes is held while your code executes. This lock is acquired when DLLs are loaded into the process, and is therefore called the 'loader lock.' The DllMain function always executes under the loader lock; (...)
Calling certain Win32 APIs might also acquire the loader lock on your behalf - functions like LoadLibraryEx, GetModuleHandle, and especially CoCreateInstance
© 2022 - 2024 — McMap. All rights reserved.
LoaderLock
. Is it a special lock or what – Ambala