aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/input/AsyncInputStream.cxx10
-rw-r--r--src/input/AsyncInputStream.hxx2
-rw-r--r--src/input/plugins/CurlInputPlugin.cxx7
3 files changed, 16 insertions, 3 deletions
diff --git a/src/input/AsyncInputStream.cxx b/src/input/AsyncInputStream.cxx
index 169a9e8e4..f2e0320c4 100644
--- a/src/input/AsyncInputStream.cxx
+++ b/src/input/AsyncInputStream.cxx
@@ -63,6 +63,16 @@ AsyncInputStream::Pause()
paused = true;
}
+void
+AsyncInputStream::PostponeError(Error &&error)
+{
+ assert(io_thread_inside());
+
+ seek_state = SeekState::NONE;
+ postponed_error = std::move(error);
+ cond.broadcast();
+}
+
inline void
AsyncInputStream::Resume()
{
diff --git a/src/input/AsyncInputStream.hxx b/src/input/AsyncInputStream.hxx
index a2945be81..c2055c17d 100644
--- a/src/input/AsyncInputStream.hxx
+++ b/src/input/AsyncInputStream.hxx
@@ -86,6 +86,8 @@ protected:
open = false;
}
+ void PostponeError(Error &&error);
+
bool IsBufferEmpty() const {
return buffer.IsEmpty();
}
diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx
index 2450c8754..46961d08f 100644
--- a/src/input/plugins/CurlInputPlugin.cxx
+++ b/src/input/plugins/CurlInputPlugin.cxx
@@ -777,9 +777,10 @@ CurlInputStream::DoSeek(offset_type new_offset)
return;
}
+ Error error;
if (!InitEasy(postponed_error)) {
mutex.lock();
- SeekDone();
+ PostponeError(std::move(error));
return;
}
@@ -790,9 +791,9 @@ CurlInputStream::DoSeek(offset_type new_offset)
curl_easy_setopt(easy, CURLOPT_RANGE, range);
}
- if (!input_curl_easy_add_indirect(this, postponed_error)) {
+ if (!input_curl_easy_add_indirect(this, error)) {
mutex.lock();
- SeekDone();
+ PostponeError(std::move(error));
return;
}