Commit 65dfd901 authored by Max Kellermann's avatar Max Kellermann

input/soup: move libsoup calls to the I/O thread

libsoup's asynchronous API is not thread safe. By moving the calls into the I/O thread, several crash bugs will be fixed.
parent 59abdbd2
......@@ -220,6 +220,17 @@ input_soup_wait_data(struct input_soup *s)
}
}
static gpointer
input_soup_queue(gpointer data)
{
struct input_soup *s = data;
soup_session_queue_message(soup_session, s->msg,
input_soup_session_callback, s);
return NULL;
}
static struct input_stream *
input_soup_open(const char *uri, G_GNUC_UNUSED GError **error_r)
{
......@@ -255,12 +266,23 @@ input_soup_open(const char *uri, G_GNUC_UNUSED GError **error_r)
s->completed = false;
s->postponed_error = NULL;
soup_session_queue_message(soup_session, s->msg,
input_soup_session_callback, s);
io_thread_call(input_soup_queue, s);
return &s->base;
}
static gpointer
input_soup_cancel(gpointer data)
{
struct input_soup *s = data;
if (!s->completed)
soup_session_cancel_message(soup_session, s->msg,
SOUP_STATUS_CANCELLED);
return NULL;
}
static void
input_soup_close(struct input_stream *is)
{
......@@ -274,8 +296,7 @@ input_soup_close(struct input_stream *is)
g_mutex_unlock(s->mutex);
soup_session_cancel_message(soup_session, s->msg,
SOUP_STATUS_CANCELLED);
io_thread_call(input_soup_cancel, s);
g_mutex_lock(s->mutex);
while (!s->completed)
......
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