Yes, I did the event_add. Was trying to type out from memory.
I didn't realise that event_base_dispatch() doesn't return until all events are finished (which is never, in my case, since all of my events are persistent and never get deleted). I have three groups of events that I was using, two on timeouts and one like the above. I was using three different event_base's for them, but did a little combing through old threads and found out that's not necessary unless you're multithreading (i'm not), so I consolidated them to one base. With this method, the timeout events are firing, but we're still not getting past the call to event_base_dispatch. but if I understand you correctly, that's good behaviour. I've got event_base_dispatch called in the middle of my initialization function, but I suppose moving it to the bottom (ie, the very last thing I do before letting the events drive the program) would do the trick?
That still doesn't answer why the loops were "breaking" prematurely, but it could have something to do with my signal handler - I have one set up for seg faults to break all the loops before exiting, but I'm not sure that was being called before...