Deadlock using CoCreateInstance and AfxLoadLibrary
Hello,
I have a simple test app that starts 5-10 threads and each thread
executes the below function. I consistently see deadlocks when one
thread is calling CoCreate call while another thread calls
AfxLoadLibrary:
void CTest_app_tx4ole::OnAction2()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CLSID clsId;
CLSIDFromProgID((CComBSTR)"anyprogid", &clsId);
CString sThread;
sThread.Format("%d", GetCurrentThreadId());
for(int i(0); i<10000; ++i)
{
OutputDebugString((CString)"0 " + sThread + "\n");
HMODULE hLib = AfxLoadLibrary("c:\\program files\\any.dll");
OutputDebugString((CString)"1 " + sThread + "\n");
CComPtr<IUnknown> spPtr; // CoInit/CoUninit is called for each
thread
OutputDebugString((CString)"2 " + sThread + "\n");
spPtr.CoCreateInstance(clsId);
OutputDebugString((CString)"3 " + sThread + "\n");
AfxFreeLibrary(hLib);
OutputDebugString((CString)"4 " + sThread + "\n");
}
}
Windbg shows these locks, I would like to understand what has gone
wrong here!
0:013> !locks
CritSec ntdll!LdrpLoaderLock+0 at 77ce5340
WaiterWoken No
LockCount 2
RecursionCount 2
OwningThread 13fc
EntryCount 0
ContentionCount b
*** Locked
CritSec MFC42!_afxResourceLock+0 at 696d06f0
WaiterWoken No
LockCount 9
RecursionCount 1
OwningThread 1c8
EntryCount 0
ContentionCount a
*** Locked
Scanned 1349 critical sections
Thread 13fc:
ntdll!KiFastSystemCallRet
ntdll!NtWaitForSingleObject+0xc
ntdll!RtlpWaitOnCriticalSection+0x154
ntdll!RtlEnterCriticalSection+0x152
MFC42!AfxLockGlobals+0x73
MFC42!CDynLinkLibrary::CDynLinkLibrary+0x8f
MFC42!AfxCoreInitModule+0x4d
PVFormsData!DllMain+0x1c
PVFormsData!_DllMainCRTStartup+0x50
ntdll!LdrpCallInitRoutine+0x14
ntdll!LdrpRunInitializeRoutines+0x36d
ntdll!LdrpLoadDll+0x437
ntdll!LdrLoadDll+0x1ad
kernel32!LoadLibraryExW+0x253
ole32!CClassCache::CDllPathEntry::LoadDll+0xae
ole32!CClassCache::CDllPathEntry::Create_rl+0x37
ole32!CClassCache::CClassEntry::CreateDllClassEntry_rl+0xd4
ole32!CClassCache::GetClassObjectActivator+0x224
ole32!CClassCache::GetClassObject+0x30
ole32!CServerContextActivator::CreateInstance+0x110
ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
ole32!CApartmentActivator::CreateInstance+0x112
ole32!CProcessActivator::CCICallback+0x6d
ole32!CProcessActivator::AttemptActivation+0x2c
ole32!CProcessActivator::ActivateByContext+0x4f
ole32!CProcessActivator::CreateInstance+0x49
ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
ole32!CClientContextActivator::CreateInstance+0xb0
ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
ole32!ICoCreateInstanceEx+0x403
ole32!CComActivator::DoCreateInstance+0xd9
ole32!CoCreateInstanceEx+0x38
ole32!CoCreateInstance+0x37
test_app_tx4ole!ATL::CComPtr<IUnknown>::CoCreateInstance+0x22
test_app_tx4ole!
CTest_app_tx4oleDlg::OnAction2+0x2e5 // Calls
CoCreate
test_app_tx4ole!CTest_app_tx4oleDlg::DoBackgroundThread+0x13
msvcrt!_endthread+0x52
msvcrt!_endthread+0xdc
kernel32!BaseThreadInitThunk+0xe
ntdll!_RtlUserThreadStart+0x23
Thread 1c8:
ntdll!KiFastSystemCallRet
ntdll!NtWaitForSingleObject+0xc
ntdll!RtlpWaitOnCriticalSection+0x154
ntdll!RtlEnterCriticalSection+0x152
ntdll!LdrLockLoaderLock+0xe1
ntdll!LdrLoadDll+0xdd
kernel32!LoadLibraryExW+0x253
kernel32!LoadLibraryExA+0x1f
kernel32!LoadLibraryA+0xb7
MFC42!AfxLoadLibrary+0x17
test_app_tx4ole!
CTest_app_tx4oleDlg::OnAction2+0x16a // Calls
AfxLoadLibrary
test_app_tx4ole!CTest_app_tx4oleDlg::DoBackgroundThread+0x13
msvcrt!_endthread+0x52
msvcrt!_endthread+0xdc
kernel32!BaseThreadInitThunk+0xe
ntdll!_RtlUserThreadStart+0x23
Thanks,
Jay