NPT_Result TaskGroup::startTask(Task *task) { WriteLocker locker(m_stateLock); if (m_state != State_Running) { delete task; return NPT_ERROR_INVALID_STATE; } joinThreads(); task->m_taskGroup = this; { TaskThread *thread = NULL; WriteLocker locker(m_freeThreadListLock); NPT_List<TaskThread*>::Iterator it = m_freeThreadList.GetFirstItem(); if (it) { thread = *it; m_freeThreadList.Erase(it); thread->setTask(task); return NPT_SUCCESS; } } return startNewThread(task); }