]> git.sesse.net Git - nageru/commitdiff
Fix leaking of streams in HTTPD.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 3 May 2016 16:40:18 +0000 (18:40 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 3 May 2016 16:40:18 +0000 (18:40 +0200)
httpd.cpp
httpd.h

index d0be7a3bfd47faacbebb950ba5c915c174ade57e..c6a233deae66f6dca2eecc5476ec275a5928ca98 100644 (file)
--- a/httpd.cpp
+++ b/httpd.cpp
@@ -38,7 +38,7 @@ void HTTPD::start(int port)
                               port,
                               nullptr, nullptr,
                               &answer_to_connection_thunk, this,
-                              MHD_OPTION_NOTIFY_COMPLETED, &request_completed_thunk, this,
+                              MHD_OPTION_NOTIFY_COMPLETED, nullptr, this,
                               MHD_OPTION_END);
 }
 
@@ -72,7 +72,7 @@ int HTTPD::answer_to_connection(MHD_Connection *connection,
                framing = HTTPD::Stream::FRAMING_RAW;
        }
 
-       HTTPD::Stream *stream = new HTTPD::Stream(framing);
+       HTTPD::Stream *stream = new HTTPD::Stream(this, framing);
        stream->add_data(header.data(), header.size(), Stream::DATA_TYPE_HEADER);
        {
                unique_lock<mutex> lock(streams_mutex);
@@ -89,36 +89,19 @@ int HTTPD::answer_to_connection(MHD_Connection *connection,
                MHD_add_response_header(response, "Content-encoding", "metacube");
        }
        int ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
-       //MHD_destroy_response(response);
+       MHD_destroy_response(response);  // Only decreases the refcount; actual free is after the request is done.
 
        return ret;
 }
 
 void HTTPD::free_stream(void *cls)
 {
-       // FIXME: When is this actually called, if ever?
-       // Also, shouldn't we remove it from streams?
        HTTPD::Stream *stream = (HTTPD::Stream *)cls;
-       delete stream;
-}
-
-void HTTPD::request_completed_thunk(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
-{
-       HTTPD *httpd = (HTTPD *)cls;
-       return httpd->request_completed(connection, con_cls, toe);
-}
-
-void HTTPD::request_completed(struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
-{
-       if (con_cls == nullptr) {
-               // Request was never set up.
-               return;
-       }
-       HTTPD::Stream *stream = (HTTPD::Stream *)*con_cls;
+       HTTPD *httpd = stream->get_parent();
        {
-               unique_lock<mutex> lock(streams_mutex);
+               unique_lock<mutex> lock(httpd->streams_mutex);
                delete stream;
-               streams.erase(stream);
+               httpd->streams.erase(stream);
        }
 }
 
diff --git a/httpd.h b/httpd.h
index 314a34a4a1cd377b2c942b934ca99f2d1dfefee2..73410fd427e642cb178f83ba5095318216223ba0 100644 (file)
--- a/httpd.h
+++ b/httpd.h
@@ -43,10 +43,6 @@ private:
 
        static void free_stream(void *cls);
 
-       static void request_completed_thunk(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe);
-
-       void request_completed(struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe);
-
 
        class Stream {
        public:
@@ -54,7 +50,7 @@ private:
                        FRAMING_RAW,
                        FRAMING_METACUBE
                };
-               Stream(Framing framing) : framing(framing) {}
+               Stream(HTTPD *parent, Framing framing) : parent(parent), framing(framing) {}
 
                static ssize_t reader_callback_thunk(void *cls, uint64_t pos, char *buf, size_t max);
                ssize_t reader_callback(uint64_t pos, char *buf, size_t max);
@@ -66,8 +62,10 @@ private:
                };
                void add_data(const char *buf, size_t size, DataType data_type);
                void stop();
+               HTTPD *get_parent() const { return parent; }
 
        private:
+               HTTPD *parent;
                Framing framing;
 
                std::mutex buffer_mutex;