Posted also at 
http://stackoverflow.com/questions/29219314/how-to-break-out-libevents-dispatch-loop
 
<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

Reply via email to