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