From: Steinar H. Gunderson Date: Tue, 3 May 2016 00:09:16 +0000 (+0200) Subject: Shutdown microhttpd on shutdown. X-Git-Tag: 1.3.0~29 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=12958b47efa45a14a1a31a32cd281b86787f1aee Shutdown microhttpd on shutdown. --- diff --git a/httpd.cpp b/httpd.cpp index 1e40054..d0be7a3 100644 --- a/httpd.cpp +++ b/httpd.cpp @@ -23,14 +23,23 @@ HTTPD::HTTPD() { } +HTTPD::~HTTPD() +{ + MHD_quiesce_daemon(mhd); + for (Stream *stream : streams) { + stream->stop(); + } + MHD_stop_daemon(mhd); +} + void HTTPD::start(int port) { - MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION | MHD_USE_POLL_INTERNALLY | MHD_USE_DUAL_STACK, - port, - nullptr, nullptr, - &answer_to_connection_thunk, this, - MHD_OPTION_NOTIFY_COMPLETED, &request_completed_thunk, this, - MHD_OPTION_END); + mhd = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION | MHD_USE_POLL_INTERNALLY | MHD_USE_DUAL_STACK, + port, + nullptr, nullptr, + &answer_to_connection_thunk, this, + MHD_OPTION_NOTIFY_COMPLETED, &request_completed_thunk, this, + MHD_OPTION_END); } void HTTPD::add_data(const char *buf, size_t size, bool keyframe) @@ -122,7 +131,10 @@ ssize_t HTTPD::Stream::reader_callback_thunk(void *cls, uint64_t pos, char *buf, ssize_t HTTPD::Stream::reader_callback(uint64_t pos, char *buf, size_t max) { unique_lock lock(buffer_mutex); - has_buffered_data.wait(lock, [this]{ return !buffered_data.empty(); }); + has_buffered_data.wait(lock, [this]{ return should_quit || !buffered_data.empty(); }); + if (should_quit) { + return 0; + } ssize_t ret = 0; while (max > 0 && !buffered_data.empty()) { @@ -182,3 +194,9 @@ void HTTPD::Stream::add_data(const char *buf, size_t buf_size, HTTPD::Stream::Da has_buffered_data.notify_all(); } +void HTTPD::Stream::stop() +{ + unique_lock lock(buffer_mutex); + should_quit = true; + has_buffered_data.notify_all(); +} diff --git a/httpd.h b/httpd.h index 94de031..314a34a 100644 --- a/httpd.h +++ b/httpd.h @@ -15,10 +15,12 @@ #include struct MHD_Connection; +struct MHD_Daemon; class HTTPD { public: HTTPD(); + ~HTTPD(); // Should be called before start(). void set_header(const std::string &data) { @@ -63,17 +65,20 @@ private: DATA_TYPE_OTHER }; void add_data(const char *buf, size_t size, DataType data_type); + void stop(); private: Framing framing; std::mutex buffer_mutex; + bool should_quit = false; // Under . std::condition_variable has_buffered_data; - std::deque buffered_data; // Protected by . + std::deque buffered_data; // Protected by . size_t used_of_buffered_data = 0; // How many bytes of the first element of that is already used. Protected by . size_t seen_keyframe = false; }; + MHD_Daemon *mhd = nullptr; std::mutex streams_mutex; std::set streams; // Not owned. std::string header;