int pendingIo = 1; bool stopFlag = false; bool stopEvent = false; bool stopped = false; program stopper: int main() { stop(); } void stop() { stopFlag = true; dec(); while(!stopEvent) { nop; } stopped = true; } int inc() { int status; atomic { pendingIo = pendingIo + 1; } if(stopFlag) { dec(); status = 0; } else { status = 1; } return status; } void dec() { int pio; atomic { pendingIo=pendingIo - 1; pio = pendingIo; } if(pio==0) { stopEvent = true; } else { nop; } } program adder1: void main() { add(); } void add() { int status; status = inc(); if(status>0) { assert(!stopped); /* Perform IO */ } else { nop; } dec(); } int inc() { int status; atomic { pendingIo = pendingIo + 1; } if(stopFlag) { dec(); status = 0; } else { status = 1; } return status; } void dec() { int pio; atomic { pendingIo=pendingIo - 1; pio = pendingIo; } if(pio==0) { stopEvent = true; } else { nop; } } program adder2: void main() { add(); } void add() { int status; status = inc(); if(status>0) { assert(!stopped); /* Perform IO */ } else { nop; } dec(); } int inc() { int status; atomic { pendingIo = pendingIo + 1; } if(stopFlag) { dec(); status = 0; } else { status = 1; } return status; } void dec() { int pio; atomic { pendingIo=pendingIo - 1; pio = pendingIo; } if(pio==0) { stopEvent = true; } else { nop; } }