예제 #1
0
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);
}