mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-03 06:32:10 +01:00
GInputStream: fix default g_input_stream_skip_async() logic
g_input_stream_real_skip_async() wants to use read_async() normally, but will use skip() in a thread instead if it sees that read_async() will end up using threads. Except that the test for "will read_async() use threads" never got updated to know about the GPollableInputStream support in read_async(), so it was doing the wrong thing in that case. Fix. Also remove a small bit of pre-GTask cruft noticed nearby. https://bugzilla.gnome.org/show_bug.cgi?id=691489
This commit is contained in:
parent
e9661331ba
commit
1738d5f1ef
@ -1136,6 +1136,11 @@ read_async_pollable (GPollableInputStream *stream,
|
||||
/* g_input_stream_real_read_async() unrefs task */
|
||||
}
|
||||
|
||||
#define CAN_DO_NONBLOCKING_READS(stream) \
|
||||
(G_IS_POLLABLE_INPUT_STREAM (stream) && \
|
||||
g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (stream)))
|
||||
|
||||
|
||||
static void
|
||||
g_input_stream_real_read_async (GInputStream *stream,
|
||||
void *buffer,
|
||||
@ -1155,8 +1160,7 @@ g_input_stream_real_read_async (GInputStream *stream,
|
||||
op->buffer = buffer;
|
||||
op->count = count;
|
||||
|
||||
if (G_IS_POLLABLE_INPUT_STREAM (stream) &&
|
||||
g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (stream)))
|
||||
if (CAN_DO_NONBLOCKING_READS (stream))
|
||||
read_async_pollable (G_POLLABLE_INPUT_STREAM (stream), task);
|
||||
else
|
||||
g_task_run_in_thread (task, read_async_thread);
|
||||
@ -1200,8 +1204,6 @@ typedef struct {
|
||||
char buffer[8192];
|
||||
gsize count;
|
||||
gsize count_skipped;
|
||||
gpointer user_data;
|
||||
GAsyncReadyCallback callback;
|
||||
} SkipFallbackAsyncData;
|
||||
|
||||
static void
|
||||
@ -1266,7 +1268,8 @@ g_input_stream_real_skip_async (GInputStream *stream,
|
||||
task = g_task_new (stream, cancellable, callback, user_data);
|
||||
g_task_set_priority (task, io_priority);
|
||||
|
||||
if (class->read_async == g_input_stream_real_read_async)
|
||||
if (class->read_async == g_input_stream_real_read_async &&
|
||||
!CAN_DO_NONBLOCKING_READS (stream))
|
||||
{
|
||||
/* Read is thread-using async fallback.
|
||||
* Make skip use threads too, so that we can use a possible sync skip
|
||||
@ -1284,8 +1287,6 @@ g_input_stream_real_skip_async (GInputStream *stream,
|
||||
data = g_new (SkipFallbackAsyncData, 1);
|
||||
data->count = count;
|
||||
data->count_skipped = 0;
|
||||
data->callback = callback;
|
||||
data->user_data = user_data;
|
||||
g_task_set_task_data (task, data, g_free);
|
||||
g_task_set_check_cancellable (task, FALSE);
|
||||
class->read_async (stream, data->buffer, MIN (8192, count), io_priority, cancellable,
|
||||
|
Loading…
x
Reference in New Issue
Block a user