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(); }
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(); }
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(); }
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); }