Пример #1
0
Файл: mutex.c Проект: dns/ArdOS
void OSGiveMutex(OSMutex *mutex)
{
	OSMakeAtomic();
	unsigned char wakeProc=procDeq(&mutex->blocked);
	
	if(wakeProc!=255)
	{
		_tasks[wakeProc].status &= ~_OS_BLOCKED;
		procEnq(wakeProc, _tasks, &_ready);
		OSExitAtomic();
		OSPrioSwap();	
	}	
	else
		mutex->val=1;
	
	OSExitAtomic();
}
Пример #2
0
void OSGiveSema(TOSSema *sema)
{
	unsigned char sreg;
	OSMakeAtomic(&sreg);

	unsigned char tsk=procDeq(&sema->taskQ);
	
	if(tsk != 255)
	{
		// Removed blocked flag
		_tasks[tsk].status &= ~(_OS_BLOCKED);
		procEnq(tsk, _tasks, &_ready);
		
		// Call scheduler
		OSExitAtomic(sreg);
		OSPrioSwap();
	}
	else
		if(sema->isBinary)
			sema->semaval=1;
		else
			sema->semaval++;
	OSExitAtomic(sreg);
}