Commit 59abdbd2 authored by Max Kellermann's avatar Max Kellermann

input/soup: wait for _cancel_message() to complete

Add the "complete" attribute, and set it in _session_callback(). _close() waits for it to become true.
parent a6d68738
......@@ -59,6 +59,12 @@ struct input_soup {
bool alive, pause, eof;
/**
* Set when the session callback has been invoked, when it is
* safe to free this object.
*/
bool completed;
GError *postponed_error;
};
......@@ -116,10 +122,14 @@ input_soup_session_callback(G_GNUC_UNUSED SoupSession *session,
struct input_soup *s = user_data;
assert(msg == s->msg);
assert(!s->completed);
g_mutex_lock(s->mutex);
s->base.ready = true;
s->alive = false;
s->completed = true;
g_cond_broadcast(s->cond);
g_mutex_unlock(s->mutex);
}
......@@ -242,6 +252,7 @@ input_soup_open(const char *uri, G_GNUC_UNUSED GError **error_r)
s->alive = true;
s->pause = false;
s->eof = false;
s->completed = false;
s->postponed_error = NULL;
soup_session_queue_message(soup_session, s->msg,
......@@ -257,16 +268,21 @@ input_soup_close(struct input_stream *is)
g_mutex_lock(s->mutex);
if (s->alive) {
assert(s->msg != NULL);
if (!s->completed) {
/* the messages's session callback hasn't been invoked
yet; cancel it and wait for completion */
s->alive = false;
g_mutex_unlock(s->mutex);
soup_session_cancel_message(soup_session, s->msg,
SOUP_STATUS_CANCELLED);
} else
g_mutex_unlock(s->mutex);
g_mutex_lock(s->mutex);
while (!s->completed)
g_cond_wait(s->cond, s->mutex);
}
g_mutex_unlock(s->mutex);
g_mutex_free(s->mutex);
g_cond_free(s->cond);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment