this ensures all bus transfers are only done by the thread that owns the semaphore
this is based on initial work by Sid, reset here for easier merging