Seems to work.
Tests pass. Need to do more test though.
It’s the M&S queue, with atomics removed, and it’s “odd” in that although the dequeuer gets key/value pairs as he dequeues, it’s actually the enqueue thread which gets the dequeued queue elements out of the queue for reuse/free (when you call enqueue, or if you explicitly flush – there’s a function call for it) the emptied (i.e. dequeued) queue elements, which are at that point still in the queue, come back to the user via a callback).