extracted FastSemaphore into separate file to reuse in queue and executor