void procEnq(int pid, tTCB *tasklist, tQueue *q) { #if OSSCHED_TYPE==OS_PRIORITY prioEnq(pid, tasklist, q); #elif OSSCHED_TYPE==OS_RR enq(pid, q); #endif }
void OSTakeSema(TOSSema *sema) { unsigned char sreg; OSMakeAtomic(&sreg); if(sema->semaval>0) sema->semaval--; else { // Block current process _tasks[_running].status |= _OS_BLOCKED; // Enqueue this task prioEnq(_running, _tasks, &sema->taskQ); OSExitAtomic(sreg); // Call scheduler. OSSwap(); } OSExitAtomic(sreg); }