mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-22 09:57:52 +02:00
gio: use GPollable* to implement fallback read_async/write_async
If a GInputStream does not provide a read_async() implementation, but does implement GPollableInputStream, then instead of doing read-synchronously-in-a-thread, just use g_pollable_input_stream_read_nonblocking() and g_pollable_input_stream_create_source() to implement an async read in the same thread. Similarly for GOutputStream. Remove a bunch of existing read_async()/write_async() implementations that are basically equivalent to the new fallback method. https://bugzilla.gnome.org/show_bug.cgi?id=673997
This commit is contained in:
@@ -132,95 +132,6 @@ g_socket_input_stream_read (GInputStream *stream,
|
||||
cancellable, error);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
g_socket_input_stream_read_ready (GSocket *socket,
|
||||
GIOCondition condition,
|
||||
GSocketInputStream *stream)
|
||||
{
|
||||
GSimpleAsyncResult *simple;
|
||||
GError *error = NULL;
|
||||
gssize result;
|
||||
|
||||
result = g_socket_receive_with_blocking (stream->priv->socket,
|
||||
stream->priv->buffer,
|
||||
stream->priv->count,
|
||||
FALSE,
|
||||
stream->priv->cancellable,
|
||||
&error);
|
||||
|
||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
|
||||
return TRUE;
|
||||
|
||||
simple = stream->priv->result;
|
||||
stream->priv->result = NULL;
|
||||
|
||||
if (result >= 0)
|
||||
g_simple_async_result_set_op_res_gssize (simple, result);
|
||||
|
||||
if (error)
|
||||
g_simple_async_result_take_error (simple, error);
|
||||
|
||||
if (stream->priv->cancellable)
|
||||
g_object_unref (stream->priv->cancellable);
|
||||
|
||||
g_simple_async_result_complete (simple);
|
||||
g_object_unref (simple);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
g_socket_input_stream_read_async (GInputStream *stream,
|
||||
void *buffer,
|
||||
gsize count,
|
||||
gint io_priority,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (stream);
|
||||
GSource *source;
|
||||
|
||||
g_assert (input_stream->priv->result == NULL);
|
||||
|
||||
input_stream->priv->result =
|
||||
g_simple_async_result_new (G_OBJECT (stream), callback, user_data,
|
||||
g_socket_input_stream_read_async);
|
||||
if (cancellable)
|
||||
g_object_ref (cancellable);
|
||||
input_stream->priv->cancellable = cancellable;
|
||||
input_stream->priv->buffer = buffer;
|
||||
input_stream->priv->count = count;
|
||||
|
||||
source = g_socket_create_source (input_stream->priv->socket,
|
||||
G_IO_IN | G_IO_HUP | G_IO_ERR,
|
||||
cancellable);
|
||||
g_source_set_callback (source,
|
||||
(GSourceFunc) g_socket_input_stream_read_ready,
|
||||
g_object_ref (input_stream), g_object_unref);
|
||||
g_source_attach (source, g_main_context_get_thread_default ());
|
||||
g_source_unref (source);
|
||||
}
|
||||
|
||||
static gssize
|
||||
g_socket_input_stream_read_finish (GInputStream *stream,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
GSimpleAsyncResult *simple;
|
||||
gssize count;
|
||||
|
||||
g_return_val_if_fail (G_IS_SOCKET_INPUT_STREAM (stream), -1);
|
||||
|
||||
simple = G_SIMPLE_ASYNC_RESULT (result);
|
||||
|
||||
g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_input_stream_read_async);
|
||||
|
||||
count = g_simple_async_result_get_op_res_gssize (simple);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
g_socket_input_stream_pollable_is_readable (GPollableInputStream *pollable)
|
||||
{
|
||||
@@ -282,8 +193,6 @@ g_socket_input_stream_class_init (GSocketInputStreamClass *klass)
|
||||
gobject_class->set_property = g_socket_input_stream_set_property;
|
||||
|
||||
ginputstream_class->read_fn = g_socket_input_stream_read;
|
||||
ginputstream_class->read_async = g_socket_input_stream_read_async;
|
||||
ginputstream_class->read_finish = g_socket_input_stream_read_finish;
|
||||
|
||||
g_object_class_install_property (gobject_class, PROP_SOCKET,
|
||||
g_param_spec_object ("socket",
|
||||
|
Reference in New Issue
Block a user