There is a race between manual event_active and natural event activation. If both happen at the same time on the same FD, they would both be protected by the same event base lock except for 1 LoC where the fields of struct event are read without any kind of lock. Instead, the patch below for src/event.c (against 2.0.21-stable) does those reads into local variables inside the lock and then invokes the callback with those local arguments outside the lock. A similar change has been partially made in head on github, but that is incomplete (only saves the callback function pointer inside the lock).