Simplify semaphore implementation; acquire semaphore after ack