From: Dan Winship Date: Thu, 10 May 2012 15:09:52 +0000 (-0400) Subject: gio: add g_async_result_is_tagged() X-Git-Tag: 2.33.4~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=82d914d808c616d14d489c0272c6d5afc4bfbd5a;p=platform%2Fupstream%2Fglib.git gio: add g_async_result_is_tagged() Rather than doing a two step first-check-the-GAsyncResult-subtype-then- check-the-tag, add a GAsyncResult-level method so that you can do them both at once, simplifying the code for "short-circuit" async return values where the vmethod never gets called. https://bugzilla.gnome.org/show_bug.cgi?id=661767 --- diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index f0d4990..e709e83 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -1199,6 +1199,7 @@ GAsyncResultIface GAsyncReadyCallback g_async_result_get_user_data g_async_result_get_source_object +g_async_result_is_tagged g_async_result_legacy_propagate_error G_ASYNC_RESULT diff --git a/gio/gasyncresult.c b/gio/gasyncresult.c index b578efc..8cba495 100644 --- a/gio/gasyncresult.c +++ b/gio/gasyncresult.c @@ -194,3 +194,32 @@ g_async_result_legacy_propagate_error (GAsyncResult *res, else return FALSE; } + +/** + * g_async_result_is_tagged: + * @result: a #GAsyncResult + * @source_tag: an application-defined tag + * + * Checks if @result has the given @source_tag (generally a function + * pointer indicating the function @result was created by). + * + * Returns: %TRUE if @result has the indicated @source_tag, %FALSE if + * not. + * + * Since: 2.34 + **/ +gboolean +g_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag) +{ + GAsyncResultIface *iface; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + + iface = G_ASYNC_RESULT_GET_IFACE (res); + + if (!iface->is_tagged) + return FALSE; + + return (* iface->is_tagged) (res, source_tag); +} diff --git a/gio/gasyncresult.h b/gio/gasyncresult.h index 773d57e..e898401 100644 --- a/gio/gasyncresult.h +++ b/gio/gasyncresult.h @@ -50,6 +50,7 @@ typedef struct _GAsyncResultIface GAsyncResultIface; * @g_iface: The parent interface. * @get_user_data: Gets the user data passed to the callback. * @get_source_object: Gets the source object that issued the asynchronous operation. + * @is_tagged: Checks if a result is tagged with a particular source. * * Interface definition for #GAsyncResult. **/ @@ -61,6 +62,9 @@ struct _GAsyncResultIface gpointer (* get_user_data) (GAsyncResult *res); GObject * (* get_source_object) (GAsyncResult *res); + + gboolean (* is_tagged) (GAsyncResult *res, + gpointer tag); }; GType g_async_result_get_type (void) G_GNUC_CONST; @@ -71,6 +75,9 @@ GObject *g_async_result_get_source_object (GAsyncResult *res); GLIB_AVAILABLE_IN_2_34 gboolean g_async_result_legacy_propagate_error (GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_2_34 +gboolean g_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag); G_END_DECLS diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c index b8e1b11..dd98d98 100644 --- a/gio/gbufferedinputstream.c +++ b/gio/gbufferedinputstream.c @@ -542,7 +542,6 @@ g_buffered_input_stream_fill_finish (GBufferedInputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GBufferedInputStreamClass *class; g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); @@ -550,14 +549,10 @@ g_buffered_input_stream_fill_finish (GBufferedInputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return -1; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_buffered_input_stream_fill_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case read of 0 bytes */ - if (g_simple_async_result_get_source_tag (simple) == g_buffered_input_stream_fill_async) - return 0; + return 0; } class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c index b4f7424..a6db242 100644 --- a/gio/gfileenumerator.c +++ b/gio/gfileenumerator.c @@ -400,21 +400,16 @@ g_file_enumerator_next_files_finish (GFileEnumerator *enumerator, GError **error) { GFileEnumeratorClass *class; - GSimpleAsyncResult *simple; g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); if (g_async_result_legacy_propagate_error (result, error)) return NULL; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) - { - simple = G_SIMPLE_ASYNC_RESULT (result); - + else if (g_async_result_is_tagged (result, g_file_enumerator_next_files_async)) + { /* Special case read of 0 files */ - if (g_simple_async_result_get_source_tag (simple) == g_file_enumerator_next_files_async) - return NULL; + return NULL; } class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); diff --git a/gio/ginputstream.c b/gio/ginputstream.c index db90aeb..7ad7d6f 100644 --- a/gio/ginputstream.c +++ b/gio/ginputstream.c @@ -649,7 +649,6 @@ g_input_stream_read_finish (GInputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GInputStreamClass *class; g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); @@ -657,14 +656,10 @@ g_input_stream_read_finish (GInputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return -1; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_input_stream_read_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case read of 0 bytes */ - if (g_simple_async_result_get_source_tag (simple) == g_input_stream_read_async) - return 0; + return 0; } class = G_INPUT_STREAM_GET_CLASS (stream); @@ -889,7 +884,6 @@ g_input_stream_skip_finish (GInputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GInputStreamClass *class; g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); @@ -897,14 +891,10 @@ g_input_stream_skip_finish (GInputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return -1; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_input_stream_skip_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case skip of 0 bytes */ - if (g_simple_async_result_get_source_tag (simple) == g_input_stream_skip_async) - return 0; + return 0; } class = G_INPUT_STREAM_GET_CLASS (stream); @@ -988,7 +978,6 @@ g_input_stream_close_finish (GInputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GInputStreamClass *class; g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); @@ -996,14 +985,10 @@ g_input_stream_close_finish (GInputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return FALSE; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_input_stream_close_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case already closed */ - if (g_simple_async_result_get_source_tag (simple) == g_input_stream_close_async) - return TRUE; + return TRUE; } class = G_INPUT_STREAM_GET_CLASS (stream); diff --git a/gio/gio.symbols b/gio/gio.symbols index 4025da8..6db9bbd 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -119,6 +119,7 @@ g_desktop_app_info_set_desktop_env g_async_result_get_type g_async_result_get_user_data g_async_result_get_source_object +g_async_result_is_tagged g_async_result_legacy_propagate_error g_buffered_input_stream_get_type g_buffered_input_stream_new diff --git a/gio/giostream.c b/gio/giostream.c index d2f40c4..574eea3 100644 --- a/gio/giostream.c +++ b/gio/giostream.c @@ -515,7 +515,6 @@ g_io_stream_close_finish (GIOStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GIOStreamClass *class; g_return_val_if_fail (G_IS_IO_STREAM (stream), FALSE); @@ -523,14 +522,10 @@ g_io_stream_close_finish (GIOStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return FALSE; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_io_stream_close_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case already closed */ - if (g_simple_async_result_get_source_tag (simple) == g_io_stream_close_async) - return TRUE; + return TRUE; } class = G_IO_STREAM_GET_CLASS (stream); diff --git a/gio/goutputstream.c b/gio/goutputstream.c index a619c05..aaf82f5 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -835,7 +835,6 @@ g_output_stream_write_finish (GOutputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GOutputStreamClass *class; g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); @@ -843,14 +842,10 @@ g_output_stream_write_finish (GOutputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return -1; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_output_stream_write_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case writes of 0 bytes */ - if (g_simple_async_result_get_source_tag (simple) == g_output_stream_write_async) - return 0; + return 0; } class = G_OUTPUT_STREAM_GET_CLASS (stream); @@ -1161,7 +1156,6 @@ g_output_stream_flush_finish (GOutputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GOutputStreamClass *klass; g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); @@ -1169,14 +1163,10 @@ g_output_stream_flush_finish (GOutputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return FALSE; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_output_stream_flush_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case default implementation */ - if (g_simple_async_result_get_source_tag (simple) == g_output_stream_flush_async) - return TRUE; + return 0; } klass = G_OUTPUT_STREAM_GET_CLASS (stream); @@ -1284,7 +1274,6 @@ g_output_stream_close_finish (GOutputStream *stream, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple; GOutputStreamClass *class; g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); @@ -1292,14 +1281,10 @@ g_output_stream_close_finish (GOutputStream *stream, if (g_async_result_legacy_propagate_error (result, error)) return FALSE; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_output_stream_close_async)) { - simple = G_SIMPLE_ASYNC_RESULT (result); - /* Special case already closed */ - if (g_simple_async_result_get_source_tag (simple) == g_output_stream_close_async) - return TRUE; + return TRUE; } class = G_OUTPUT_STREAM_GET_CLASS (stream); diff --git a/gio/gresolver.c b/gio/gresolver.c index 22f815f..1785543 100644 --- a/gio/gresolver.c +++ b/gio/gresolver.c @@ -447,19 +447,14 @@ g_resolver_lookup_by_name_finish (GResolver *resolver, if (g_async_result_legacy_propagate_error (result, error)) return NULL; - - if (G_IS_SIMPLE_ASYNC_RESULT (result)) + else if (g_async_result_is_tagged (result, g_resolver_lookup_by_name_async)) { GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + GInetAddress *addr; /* Handle the stringified-IP-addr case */ - if (g_simple_async_result_get_source_tag (simple) == g_resolver_lookup_by_name_async) - { - GInetAddress *addr; - - addr = g_simple_async_result_get_op_res_gpointer (simple); - return g_list_append (NULL, g_object_ref (addr)); - } + addr = g_simple_async_result_get_op_res_gpointer (simple); + return g_list_append (NULL, g_object_ref (addr)); } addrs = G_RESOLVER_GET_CLASS (resolver)-> diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index 1b95119..cd56b2a 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -457,11 +457,19 @@ g_simple_async_result_get_source_object (GAsyncResult *res) return NULL; } +static gboolean +g_simple_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag) +{ + return G_SIMPLE_ASYNC_RESULT (res)->source_tag == source_tag; +} + static void g_simple_async_result_async_result_iface_init (GAsyncResultIface *iface) { iface->get_user_data = g_simple_async_result_get_user_data; iface->get_source_object = g_simple_async_result_get_source_object; + iface->is_tagged = g_simple_async_result_is_tagged; } /**