There is no busy wait in the above implementation of semaphores it's just that the methods wait() and signal() are accessing shared variable value,
s->value-- in wait() method and s->value++ in signal() method.
So this also becomes a critical section problem which would be resolved again. So in a way, we have reduced busy waiting to the wait() and signal() methods.