/* -SPIN.C -Spinlock semaphores */ /******************spin.c stuff*********************************/ void Wait(int *semaphore) { asm(" sei"); /* Test and set is atomic */ while((*semaphore)<=0) /* disabled */ { asm(" cli\n" /* disabled */ " nop\n" /* enabled */ " sei"); /* enabled */ } (*semaphore)--; /* disabled */ asm(" cli"); /* disabled */ } /* enabled */ //NB: for below signal function, disabling interrupts is not // necessary because (*semaphore)++ is an atomic operation // i just disabled interrupts because one might one to debug // using LEDs or other means when signal is called. void Signal(int *semaphore) { asm(" sei"); /* increment is atomic */ (*semaphore)++; asm(" cli"); } /**************************************************************/