STDMETHODIMP DDTaskManager::CreateTask(/* in */ DWORD dwStackSize, /* in */ LPTHREAD_START_ROUTINE pStartAddress, /* in */ PVOID pParameter, /* out */ IHostTask **ppTask) { DWORD dwThreadId; HANDLE hThread = CreateThread( NULL, dwStackSize, pStartAddress, pParameter, CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, &dwThreadId); IHostTask* task = new DDTask(hThread); if (!task) { _ASSERTE(!"Failed to allocate task"); *ppTask = NULL; return E_OUTOFMEMORY; } m_pThreadMapCrst->Enter(); m_pThreadMap->insert(map<DWORD, IHostTask*>::value_type(dwThreadId, task)); ThreadInfo info; info.threadHandle = hThread; info.threadId = dwThreadId; m_pContext->GetTasksList()->insert(m_pContext->GetTasksList()->begin(), list<ThreadInfo>::value_type(info)); m_pThreadMapCrst->Exit(); task->AddRef(); *ppTask = task; return S_OK; }
STDMETHODIMP DHTaskManager::CreateTask(/* in */ DWORD dwStackSize, /* in */ LPTHREAD_START_ROUTINE pStartAddress, /* in */ PVOID pParameter, /* out */ IHostTask **ppTask) { DWORD dwThreadId; HANDLE hThread = CreateThread( NULL, dwStackSize, pStartAddress, pParameter, CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, &dwThreadId); IHostTask* task = new DHTask(this, hThread); if (!task) { _ASSERTE(!"Failed to allocate task"); *ppTask = NULL; return E_OUTOFMEMORY; } CrstLock crst(m_pThreadMapCrst); m_pThreadMap->insert(map<DWORD, IHostTask*>::value_type(dwThreadId, task)); crst.Exit(); task->AddRef(); *ppTask = task; return S_OK; }