Exemple #1
0
static void* task1(void* arg)
{
	static volatile long res = 1;
	for (long i = 0; i < 10000000; ++i) {
		res ^= (i + 1) * 3 >> 2;
	}
	return doneTask(arg);
}
Exemple #2
0
static void* task2(void* arg)
{
	static volatile long res = 1;
	for (long i = 0; i < 1000000; ++i) {
		res ^= (i + 1) * 3 >> 2;
		if (i % 100000 != 0) {
			continue;
		}
		if (*static_cast<bool*>(arg)) {
			pth_yield(NULL);
		} else {
			sched_yield();
		}
	}
	return doneTask(arg);
}
Exemple #3
0
// Manage TaskQueue
void CTaskManager::run(void)
{
	IRunnable *runnableTask;
	float priorityTask = 0.f;
	while(_ThreadRunning)
	{
		{
			CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
			if(acces.value().empty())
			{
				runnableTask = NULL;
			}
			else
			{
				// Update task priorities
				changeTaskPriority ();

				// Get the best task
				list<CWaitingTask> &taskList = acces.value();
				list<CWaitingTask>::iterator ite = taskList.begin();
				list<CWaitingTask>::iterator bestIte = ite;
				while (ite != taskList.end())
				{
					if (ite->Priority < bestIte->Priority)
						bestIte = ite;

					// Next task;
					ite++;
				}

				_IsTaskRunning = true;
				runnableTask = bestIte->Task;
				priorityTask = bestIte->Priority;
				taskList.erase (bestIte);
			}
		}
		if(runnableTask)
		{
			{
				CSynchronized<string>::CAccessor currentTask(&_RunningTask);
				string temp;
				runnableTask->getName(temp);
				currentTask.value () = temp + " " + toString (priorityTask);
			}
			runnableTask->run();
			{
				CSynchronized<string>::CAccessor currentTask(&_RunningTask);
				CSynchronized<deque<string> >::CAccessor doneTask(&_DoneTaskQueue);
				doneTask.value().push_front (currentTask.value ());
				currentTask.value () = "";
				if (doneTask.value().size () > NLMISC_DONE_TASK_SIZE)
					doneTask.value().resize (NLMISC_DONE_TASK_SIZE);
			}

			_IsTaskRunning = false;
		}
		else
		{
			sleepTask();
		}
	}
	CBigFile::getInstance().currentThreadFinished();
	_ThreadRunning = true;
}
Exemple #4
0
static void* task3(void* arg)
{
	return doneTask(arg);
}