use a thread local rather than a queue so events are in the right order