On Tue, Feb 20, 2018 at 02:03:41PM +0300, Egor Tensin wrote: > Hello, > > Hopefully you can help me with a libevent issue that I'm stuck on. I > have two threads, one of which produces data, and the other runs > event_base_dispatch (receiving the data from the first thread, > processing it and sending it somewhere else). They communicate using a > pair of bufferevents (over a local socket pair). The issue is, the > first thread might be done with producing the data, program > termination being the next logical step. But I want to wait for the > second thread to 1) receive _all_ the data the first thread sent, 2) > process it and 3) send it to the final destination. I can't figure out > how to accomplish that, because if I call event_base_loopexit after > the first thread stops, it looks like the second thread exits right > after executing the current round of callbacks, discarding the latest > data that might have been sent by the first thread. Can somebody > please explain to me how to fix this? I can set a random timeout for > event_base_loopexit, but this is unreliable, isn't it?
Can you share an example? Do you have two event_base, i.e. one loop per thread? In this case if you stops the producer's loop you have to do this only once it send all data, and if you use event_base_loopexit() (and not event_base_loopbreak()) then it is likely that all data will be sent, since the loopexit handle all queued events before exit. And so after, you should event_base_loopexit() of the consumer's thread, once it receives all data (I don't know), and basically most of the time it will be enough to just call event_base_loopexit() again. But not always, since there can be some data pending, so maybe you want to implement some logical exit, i.e. once you receive *complete message*. And like Aaron suggests it can be enough to call loop with EVLOOP_ONCE, but sometimes it will hang the program (in case you don't have data to process, i.e. very fast exit) Regards, Azat. *********************************************************************** To unsubscribe, send an e-mail to [email protected] with unsubscribe libevent-users in the body.
