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.
This commit is contained in:
		| @@ -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 * | static struct input_stream * | ||||||
| input_soup_open(const char *uri, G_GNUC_UNUSED GError **error_r) | 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->completed = false; | ||||||
| 	s->postponed_error = NULL; | 	s->postponed_error = NULL; | ||||||
|  |  | ||||||
| 	soup_session_queue_message(soup_session, s->msg, | 	io_thread_call(input_soup_queue, s); | ||||||
| 				   input_soup_session_callback, s); |  | ||||||
|  |  | ||||||
| 	return &s->base; | 	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 | static void | ||||||
| input_soup_close(struct input_stream *is) | input_soup_close(struct input_stream *is) | ||||||
| { | { | ||||||
| @@ -274,8 +296,7 @@ input_soup_close(struct input_stream *is) | |||||||
|  |  | ||||||
| 		g_mutex_unlock(s->mutex); | 		g_mutex_unlock(s->mutex); | ||||||
|  |  | ||||||
| 		soup_session_cancel_message(soup_session, s->msg, | 		io_thread_call(input_soup_cancel, s); | ||||||
| 					    SOUP_STATUS_CANCELLED); |  | ||||||
|  |  | ||||||
| 		g_mutex_lock(s->mutex); | 		g_mutex_lock(s->mutex); | ||||||
| 		while (!s->completed) | 		while (!s->completed) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann