mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-28 10:07:13 +02: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:
@@ -1136,6 +1136,11 @@ read_async_pollable (GPollableInputStream *stream,
|
|||||||
/* g_input_stream_real_read_async() unrefs task */
|
/* 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
|
static void
|
||||||
g_input_stream_real_read_async (GInputStream *stream,
|
g_input_stream_real_read_async (GInputStream *stream,
|
||||||
void *buffer,
|
void *buffer,
|
||||||
@@ -1155,8 +1160,7 @@ g_input_stream_real_read_async (GInputStream *stream,
|
|||||||
op->buffer = buffer;
|
op->buffer = buffer;
|
||||||
op->count = count;
|
op->count = count;
|
||||||
|
|
||||||
if (G_IS_POLLABLE_INPUT_STREAM (stream) &&
|
if (CAN_DO_NONBLOCKING_READS (stream))
|
||||||
g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (stream)))
|
|
||||||
read_async_pollable (G_POLLABLE_INPUT_STREAM (stream), task);
|
read_async_pollable (G_POLLABLE_INPUT_STREAM (stream), task);
|
||||||
else
|
else
|
||||||
g_task_run_in_thread (task, read_async_thread);
|
g_task_run_in_thread (task, read_async_thread);
|
||||||
@@ -1200,8 +1204,6 @@ typedef struct {
|
|||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
gsize count;
|
gsize count;
|
||||||
gsize count_skipped;
|
gsize count_skipped;
|
||||||
gpointer user_data;
|
|
||||||
GAsyncReadyCallback callback;
|
|
||||||
} SkipFallbackAsyncData;
|
} SkipFallbackAsyncData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1266,7 +1268,8 @@ g_input_stream_real_skip_async (GInputStream *stream,
|
|||||||
task = g_task_new (stream, cancellable, callback, user_data);
|
task = g_task_new (stream, cancellable, callback, user_data);
|
||||||
g_task_set_priority (task, io_priority);
|
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.
|
/* Read is thread-using async fallback.
|
||||||
* Make skip use threads too, so that we can use a possible sync skip
|
* 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 = g_new (SkipFallbackAsyncData, 1);
|
||||||
data->count = count;
|
data->count = count;
|
||||||
data->count_skipped = 0;
|
data->count_skipped = 0;
|
||||||
data->callback = callback;
|
|
||||||
data->user_data = user_data;
|
|
||||||
g_task_set_task_data (task, data, g_free);
|
g_task_set_task_data (task, data, g_free);
|
||||||
g_task_set_check_cancellable (task, FALSE);
|
g_task_set_check_cancellable (task, FALSE);
|
||||||
class->read_async (stream, data->buffer, MIN (8192, count), io_priority, cancellable,
|
class->read_async (stream, data->buffer, MIN (8192, count), io_priority, cancellable,
|
||||||
|
Reference in New Issue
Block a user