<div dir="ltr"><p><br>---<br> modules/demux/adaptive/http/Downloader.cpp | 24 +++++++++++++++++++++---<br> modules/demux/adaptive/http/Downloader.hpp |  4 ++++<br> 2 files changed, 25 insertions(+), 3 deletions(-)</p><p>diff --git a/modules/demux/adaptive/http/Downloader.cpp b/modules/demux/adaptive/http/Downloader.cpp<br>index b2e64ef..877e2eb 100644<br>--- a/modules/demux/adaptive/http/Downloader.cpp<br>+++ b/modules/demux/adaptive/http/Downloader.cpp<br>@@ -31,21 +31,33 @@ using namespace adaptive::http;<br> Downloader::Downloader() :<br>     thread_handle_valid(false),<br>     killed(false),<br>-    pending_requests(0)<br>+    pending_requests(0),<br>+    interrupt(NULL)<br> {<br>     vlc_mutex_init(&lock);<br>     vlc_cond_init(&waitcond);<br>+    interrupt_data[0] = NULL;<br>+    interrupt_data[1] = NULL;<br> }<br> <br> bool Downloader::start()<br> {<br>-    if(!thread_handle_valid &&<br>-       vlc_clone(&thread_handle, downloaderThread,<br>+    if(thread_handle_valid)<br>+       return true;<br>+<br>+    interrupt = vlc_interrupt_create();<br>+    if(unlikely(interrupt == NULL))<br>+        return false;<br>+<br>+    if(vlc_clone(&thread_handle, downloaderThread,<br>                  static_cast<void *>(this), VLC_THREAD_PRIORITY_INPUT))<br>     {<br>+        vlc_interrupt_destroy(interrupt);<br>+        interrupt = NULL;<br>         return false;<br>     }<br>     thread_handle_valid = true;<br>+    vlc_interrupt_forward_start(interrupt, interrupt_data);<br>     return true;<br> }<br> <br>@@ -60,6 +72,11 @@ Downloader::~Downloader()<br>         vlc_join(thread_handle, NULL);<br>     vlc_mutex_destroy(&lock);<br>     vlc_cond_destroy(&waitcond);<br>+    if(interrupt)<br>+    {<br>+        vlc_interrupt_forward_stop(interrupt_data);<br>+        vlc_interrupt_destroy(interrupt);<br>+    }<br> }<br> void Downloader::schedule(HTTPChunkBufferedSource *source)<br> {<br>@@ -86,6 +103,7 @@ void Downloader::cancel(HTTPChunkBufferedSource *source)<br> void * Downloader::downloaderThread(void *opaque)<br> {<br>     Downloader *instance = static_cast<Downloader *>(opaque);<br>+    vlc_interrupt_set(instance->interrupt);<br>     int canc = vlc_savecancel();<br>     instance->Run();<br>     vlc_restorecancel( canc );<br>diff --git a/modules/demux/adaptive/http/Downloader.hpp b/modules/demux/adaptive/http/Downloader.hpp<br>index ec76b3f..e4cc26f 100644<br>--- a/modules/demux/adaptive/http/Downloader.hpp<br>+++ b/modules/demux/adaptive/http/Downloader.hpp<br>@@ -23,6 +23,8 @@<br> #include "Chunk.h"<br> <br> #include <vlc_common.h><br>+#include <vlc_interrupt.h><br>+<br> #include <atomic><br> #include <list><br> <br>@@ -52,6 +54,8 @@ namespace adaptive<br>                 std::atomic_bool killed;<br>                 std::atomic_int pending_requests;<br>                 std::list<HTTPChunkBufferedSource *> chunks;<br>+                vlc_interrupt_t *interrupt;<br>+                void *interrupt_data[2];<br>         };<br> <br>     }<br>-- <br>2.7.4<span><span><br></span></span></p></div>