[glib] Add g_simple_async_report_take_gerror_in_idle



commit ba45e36932206f30bb439f27c49529d934207fd1
Author: Christian Persch <chpe gnome org>
Date:   Thu Sep 23 13:47:13 2010 +0200

    Add g_simple_async_report_take_gerror_in_idle
    
    ... and use it where appropriate. Saves an extra GError copy.
    
    Bug #633686.

 docs/reference/gio/gio-sections.txt |    1 +
 gio/gbufferedinputstream.c          |    3 +--
 gio/gfileinputstream.c              |    3 +--
 gio/gfileiostream.c                 |    3 +--
 gio/gfileoutputstream.c             |    3 +--
 gio/ginputstream.c                  |    9 +++------
 gio/gio.symbols                     |    1 +
 gio/giostream.c                     |    3 +--
 gio/goutputstream.c                 |   12 ++++--------
 gio/gsimpleasyncresult.c            |   34 +++++++++++++++++++++++++++++++++-
 gio/gsimpleasyncresult.h            |    6 +++++-
 gio/gsocketclient.c                 |    6 ++----
 gio/gsocketconnection.c             |    3 +--
 gio/gsocketlistener.c               |    3 +--
 14 files changed, 56 insertions(+), 34 deletions(-)
---
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index 061a4c3..1b5f84b 100644
--- a/docs/reference/gio/gio-sections.txt
+++ b/docs/reference/gio/gio-sections.txt
@@ -1172,6 +1172,7 @@ g_simple_async_result_set_error
 g_simple_async_result_set_error_va
 g_simple_async_report_error_in_idle
 g_simple_async_report_gerror_in_idle
+g_simple_async_report_take_gerror_in_idle
 <SUBSECTION Standard>
 GSimpleAsyncResultClass
 G_SIMPLE_ASYNC_RESULT
diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c
index 78e61cb..f79787c 100644
--- a/gio/gbufferedinputstream.c
+++ b/gio/gbufferedinputstream.c
@@ -496,11 +496,10 @@ g_buffered_input_stream_fill_async (GBufferedInputStream *stream,
 
   if (!g_input_stream_set_pending (G_INPUT_STREAM (stream), &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
                                             callback,
                                             user_data,
                                             error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/gfileinputstream.c b/gio/gfileinputstream.c
index 74b17ba..685d768 100644
--- a/gio/gfileinputstream.c
+++ b/gio/gfileinputstream.c
@@ -215,11 +215,10 @@ g_file_input_stream_query_info_async (GFileInputStream    *stream,
   
   if (!g_input_stream_set_pending (input_stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/gfileiostream.c b/gio/gfileiostream.c
index 3af27fd..1e5f17f 100644
--- a/gio/gfileiostream.c
+++ b/gio/gfileiostream.c
@@ -227,11 +227,10 @@ g_file_io_stream_query_info_async (GFileIOStream     *stream,
 
   if (!g_io_stream_set_pending (io_stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/gfileoutputstream.c b/gio/gfileoutputstream.c
index 735b6d8..ce09eb8 100644
--- a/gio/gfileoutputstream.c
+++ b/gio/gfileoutputstream.c
@@ -225,11 +225,10 @@ g_file_output_stream_query_info_async (GFileOutputStream     *stream,
  
   if (!g_output_stream_set_pending (output_stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/ginputstream.c b/gio/ginputstream.c
index 7535bfa..3071a47 100644
--- a/gio/ginputstream.c
+++ b/gio/ginputstream.c
@@ -560,11 +560,10 @@ g_input_stream_read_async (GInputStream        *stream,
 
   if (!g_input_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
@@ -685,11 +684,10 @@ g_input_stream_skip_async (GInputStream        *stream,
 
   if (!g_input_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
@@ -784,11 +782,10 @@ g_input_stream_close_async (GInputStream        *stream,
 
   if (!g_input_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
   
diff --git a/gio/gio.symbols b/gio/gio.symbols
index cccb488..eb79b70 100644
--- a/gio/gio.symbols
+++ b/gio/gio.symbols
@@ -810,6 +810,7 @@ g_simple_async_result_set_error_va
 g_simple_async_result_is_valid
 g_simple_async_report_error_in_idle
 g_simple_async_report_gerror_in_idle
+g_simple_async_report_take_gerror_in_idle
 #endif
 #endif
 
diff --git a/gio/giostream.c b/gio/giostream.c
index 3f601a8..7c5bdf0 100644
--- a/gio/giostream.c
+++ b/gio/giostream.c
@@ -497,11 +497,10 @@ g_io_stream_close_async (GIOStream           *stream,
 
   if (!g_io_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/goutputstream.c b/gio/goutputstream.c
index 9bdc408..5152de5 100644
--- a/gio/goutputstream.c
+++ b/gio/goutputstream.c
@@ -730,11 +730,10 @@ g_output_stream_write_async (GOutputStream       *stream,
 
   if (!g_output_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
   
@@ -853,11 +852,10 @@ g_output_stream_splice_async (GOutputStream            *stream,
   
   if (!g_output_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
@@ -936,11 +934,10 @@ g_output_stream_flush_async (GOutputStream       *stream,
 
   if (!g_output_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
@@ -1048,11 +1045,10 @@ g_output_stream_close_async (GOutputStream       *stream,
 
   if (!g_output_stream_set_pending (stream, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback,
 					    user_data,
 					    error);
-      g_error_free (error);
       return;
     }
   
diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c
index 554387e..68cd02e 100644
--- a/gio/gsimpleasyncresult.c
+++ b/gio/gsimpleasyncresult.c
@@ -987,7 +987,7 @@ void
 g_simple_async_report_gerror_in_idle (GObject *object,
 				      GAsyncReadyCallback callback,
 				      gpointer user_data,
-				      GError *error)
+				      const GError *error)
 {
   GSimpleAsyncResult *simple;
  
@@ -1001,3 +1001,35 @@ g_simple_async_report_gerror_in_idle (GObject *object,
   g_simple_async_result_complete_in_idle (simple);
   g_object_unref (simple);
 }
+
+/**
+ * g_simple_async_report_take_gerror_in_idle:
+ * @object: a #GObject.
+ * @callback: a #GAsyncReadyCallback.
+ * @user_data: user data passed to @callback.
+ * @error: the #GError to report
+ *
+ * Reports an error in an idle function. Similar to
+ * g_simple_async_report_gerror_in_idle(), but takes over the caller's
+ * ownership of @error, so the caller does not have to free it any more.
+ *
+ * Since: 2.28
+ **/
+void
+g_simple_async_report_take_gerror_in_idle (GObject *object,
+                                           GAsyncReadyCallback callback,
+                                           gpointer user_data,
+                                           GError *error)
+{
+  GSimpleAsyncResult *simple;
+
+  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (error != NULL);
+
+  simple = g_simple_async_result_new_take_error (object,
+                                                 callback,
+                                                 user_data,
+                                                 error);
+  g_simple_async_result_complete_in_idle (simple);
+  g_object_unref (simple);
+}
diff --git a/gio/gsimpleasyncresult.h b/gio/gsimpleasyncresult.h
index 0abbd67..6d99c7a 100644
--- a/gio/gsimpleasyncresult.h
+++ b/gio/gsimpleasyncresult.h
@@ -122,7 +122,11 @@ void g_simple_async_report_error_in_idle  (GObject            *object,
 void g_simple_async_report_gerror_in_idle (GObject            *object,
 					   GAsyncReadyCallback callback,
 					   gpointer            user_data,
-					   GError             *error);
+					   const GError       *error);
+void g_simple_async_report_take_gerror_in_idle (GObject            *object,
+                                                GAsyncReadyCallback callback,
+                                                gpointer            user_data,
+                                                GError             *error);
 
 G_END_DECLS
 
diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c
index b2cbcee..982dedc 100644
--- a/gio/gsocketclient.c
+++ b/gio/gsocketclient.c
@@ -1279,9 +1279,8 @@ g_socket_client_connect_to_host_async (GSocketClient        *client,
 					 &error);
   if (connectable == NULL)
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (client),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
 					    callback, user_data, error);
-      g_error_free (error);
     }
   else
     {
@@ -1355,9 +1354,8 @@ g_socket_client_connect_to_uri_async (GSocketClient        *client,
   connectable = g_network_address_parse_uri (uri, default_port, &error);
   if (connectable == NULL)
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (client),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
 					    callback, user_data, error);
-      g_error_free (error);
     }
   else
     {
diff --git a/gio/gsocketconnection.c b/gio/gsocketconnection.c
index e67237f..495f81c 100644
--- a/gio/gsocketconnection.c
+++ b/gio/gsocketconnection.c
@@ -332,10 +332,9 @@ g_socket_connection_close_async (GIOStream           *stream,
   if (class->close_fn &&
       !class->close_fn (stream, cancellable, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream),
 					    callback, user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 
diff --git a/gio/gsocketlistener.c b/gio/gsocketlistener.c
index 503fa31..babefcd 100644
--- a/gio/gsocketlistener.c
+++ b/gio/gsocketlistener.c
@@ -747,10 +747,9 @@ g_socket_listener_accept_socket_async (GSocketListener     *listener,
 
   if (!check_listener (listener, &error))
     {
-      g_simple_async_report_gerror_in_idle (G_OBJECT (listener),
+      g_simple_async_report_take_gerror_in_idle (G_OBJECT (listener),
 					    callback, user_data,
 					    error);
-      g_error_free (error);
       return;
     }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]