streams: add private 'async close via threads' API
authorRyan Lortie <desrt@desrt.ca>
Tue, 20 Jan 2015 13:09:33 +0000 (08:09 -0500)
committerRyan Lortie <desrt@desrt.ca>
Tue, 17 Feb 2015 21:17:01 +0000 (16:17 -0500)
Add an internal helper to find out if close_async() is implemented via
threads using the default implementation in the base class.

We will use this to decide if we should do a 'pure async' close of a
GIOStream or not.

https://bugzilla.gnome.org/show_bug.cgi?id=741630

gio/ginputstream.c
gio/gioprivate.h
gio/goutputstream.c

index 16a03c0..8030256 100644 (file)
@@ -1253,6 +1253,26 @@ g_input_stream_async_read_is_via_threads (GInputStream *stream)
         g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (stream))));
 }
 
+/*< internal >
+ * g_input_stream_async_close_is_via_threads:
+ * @stream: input stream
+ *
+ * Checks if an input stream's close_async function uses threads.
+ *
+ * Returns: %TRUE if @stream's close_async function uses threads.
+ **/
+gboolean
+g_input_stream_async_close_is_via_threads (GInputStream *stream)
+{
+  GInputStreamClass *class;
+
+  g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE);
+
+  class = G_INPUT_STREAM_GET_CLASS (stream);
+
+  return class->close_async == g_input_stream_real_close_async;
+}
+
 /********************************************
  *   Default implementation of async ops    *
  ********************************************/
index 076259c..b3f65bf 100644 (file)
@@ -27,7 +27,9 @@
 G_BEGIN_DECLS
 
 gboolean g_input_stream_async_read_is_via_threads (GInputStream *stream);
+gboolean g_input_stream_async_close_is_via_threads (GInputStream *stream);
 gboolean g_output_stream_async_write_is_via_threads (GOutputStream *stream);
+gboolean g_output_stream_async_close_is_via_threads (GOutputStream *stream);
 
 void g_socket_connection_set_cached_remote_address (GSocketConnection *connection,
                                                     GSocketAddress    *address);
index ea05b41..035465d 100644 (file)
@@ -1705,6 +1705,25 @@ g_output_stream_async_write_is_via_threads (GOutputStream *stream)
         g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (stream))));
 }
 
+/*< internal >
+ * g_output_stream_async_close_is_via_threads:
+ * @stream: output stream
+ *
+ * Checks if an output stream's close_async function uses threads.
+ *
+ * Returns: %TRUE if @stream's close_async function uses threads.
+ **/
+gboolean
+g_output_stream_async_close_is_via_threads (GOutputStream *stream)
+{
+  GOutputStreamClass *class;
+
+  g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
+
+  class = G_OUTPUT_STREAM_GET_CLASS (stream);
+
+  return class->close_async == g_output_stream_real_close_async;
+}
 
 /********************************************
  *   Default implementation of async ops    *