示例#1
0
文件: mutex.c 项目: dns/ArdOS
void OSSignal(OSCond *cond)
{
	OSMakeAtomic();
	if(cond->blockedProcess != 255)
	{
		_tasks[cond->blockedProcess].status &= ~_OS_BLOCKED;
		procEnq(cond->blockedProcess, _tasks, &_ready);
		cond->blockedProcess=255;
		cond->pendingWake=0;
		OSPrioSwap();
	}
	else
		cond->pendingWake=1;
	OSExitAtomic();
}
示例#2
0
文件: mutex.c 项目: dns/ArdOS
void OSTakeMutex(OSMutex *mutex)
{
	OSMakeAtomic();
	if(!mutex->val)
	{
		procEnq(_running, _tasks, &mutex->blocked);
		_tasks[_running].status |= _OS_BLOCKED;
		OSExitAtomic();
		OSSwap();
	}		
	else
		mutex->val=0;
		
	OSExitAtomic();
}
示例#3
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();
}
示例#4
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);
}