[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [Libevent-users] How to break out libevent's dispatch loop



Mark,

You should be registering a  signal based event on that event loop,
and call event_base_break() during that call back.

The way you impement right now it is impossible.

Thanks

On Tue, Mar 24, 2015 at 5:35 PM, Mark Ruys <mark.ruys@xxxxxxxxxxxxxx> wrote:
> Posted also at
> http://stackoverflow.com/questions/29219314/how-to-break-out-libevents-dispatch-loop
>
> I've implemented a tiny webserver in a separate thread using the nice
> libevent library. The webserver runs event_base_dispatch() to process all
> events. What I need is a way to break out this dispatch loop from the main
> thread.
>
> It boils down to the following C++ code:
>
>   #include <stdlib.h>
> #include <signal.h>
> #include <thread>
> #include <evhttp.h>
>
> struct event_base *eb;
> std::thread t;
>
> static volatile sig_atomic_t bailout = false;
>
> void my_signal_handler(int) {
> bailout = true;
> }
>
> void onRequest(evhttp_request *req, void *) {
> struct evbuffer *OutBuf = evhttp_request_get_output_buffer(req);
> evbuffer_add_printf(OutBuf, "<html><body>Testing 1-2-3</body></html>");
> evhttp_send_reply(req, HTTP_OK, "OK", OutBuf);
> }
>
> void dispatch() {
> eb = event_base_new();
> struct evhttp *http = evhttp_new(eb);
> evhttp_set_gencb(http, &onRequest, NULL);
> evhttp_bind_socket_with_handle(http, "0.0.0.0", 5555);
> event_base_dispatch(eb);
> }
>
> int main() {
>
> struct sigaction sigIntHandler;
> sigIntHandler.sa_handler = my_signal_handler;
> sigemptyset(&sigIntHandler.sa_mask);
> sigIntHandler.sa_flags = 0;
> sigaction(SIGINT, &sigIntHandler, NULL);
>
> t = std::thread { &dispatch };
>
> while ( ! bailout ) {
> std::this_thread::sleep_for(std::chrono::seconds(1));
> }
>
> event_base_loopexit(eb, NULL);
>
> t.join();
> }
>
> The behavior is that if you run the program, request a page, abort the
> program by Ctrl-C, the event_base_dispatch() keeps running *until* you fetch
> another web page. Only then the loop aborts and the program terminates. What
> I need is that the dispatch loop is exited immediately, not after the next
> page request. Is this possible?
>
> Thanks,
>
> Mark
>
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.