From 89022761018fd87a19b0c4cf5a9c9fe8575a743a Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Sun, 16 Feb 2014 09:24:04 -0500 Subject: [PATCH] g_simple_async_result_is_valid: fix for NULL source tag If a GSimpleAsyncResult has a NULL source tag, allow it to compare valid to a non-NULL source tag in g_simple_async_result_is_valid(), to simplify cases where, eg, g_simple_async_result_new() and g_simple_async_result_report_error_in_idle() are both used. https://bugzilla.gnome.org/show_bug.cgi?id=721458 --- gio/gsimpleasyncresult.c | 22 +++++++------- gio/tests/simple-async-result.c | 65 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 10 deletions(-) diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index 63ad6f5..ee30da2 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -907,8 +907,8 @@ g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple, /** * g_simple_async_result_is_valid: * @result: the #GAsyncResult passed to the _finish function. - * @source: the #GObject passed to the _finish function. - * @source_tag: the asynchronous function. + * @source: (allow-none): the #GObject passed to the _finish function. + * @source_tag: (allow-none): the asynchronous function. * * Ensures that the data passed to the _finish function of an async * operation is consistent. Three checks are performed. @@ -916,12 +916,12 @@ g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple, * First, @result is checked to ensure that it is really a * #GSimpleAsyncResult. Second, @source is checked to ensure that it * matches the source object of @result. Third, @source_tag is - * checked to ensure that it is either %NULL (as it is when the result was - * created by g_simple_async_report_error_in_idle() or - * g_simple_async_report_gerror_in_idle()) or equal to the - * @source_tag argument given to g_simple_async_result_new() (which, by - * convention, is a pointer to the _async function corresponding to the - * _finish function from which this function is called). + * checked to ensure that it is equal to the @source_tag argument given + * to g_simple_async_result_new() (which, by convention, is a pointer + * to the _async function corresponding to the _finish function from + * which this function is called). (Alternatively, if either + * @source_tag or @result's source tag is %NULL, then the source tag + * check is skipped.) * * Returns: #TRUE if all checks passed or #FALSE if any failed. * @@ -934,6 +934,7 @@ g_simple_async_result_is_valid (GAsyncResult *result, { GSimpleAsyncResult *simple; GObject *cmp_source; + gpointer result_source_tag; if (!G_IS_SIMPLE_ASYNC_RESULT (result)) return FALSE; @@ -949,8 +950,9 @@ g_simple_async_result_is_valid (GAsyncResult *result, if (cmp_source != NULL) g_object_unref (cmp_source); - return source_tag == NULL || - source_tag == g_simple_async_result_get_source_tag (simple); + result_source_tag = g_simple_async_result_get_source_tag (simple); + return source_tag == NULL || result_source_tag == NULL || + source_tag == result_source_tag; } /** diff --git a/gio/tests/simple-async-result.c b/gio/tests/simple-async-result.c index e9b089e..7506004 100644 --- a/gio/tests/simple-async-result.c +++ b/gio/tests/simple-async-result.c @@ -119,12 +119,77 @@ test_simple_async (void) ensure_destroyed (b); } +static void +test_valid (void) +{ + GAsyncResult *result; + GObject *a, *b; + + a = g_object_new (G_TYPE_OBJECT, NULL); + b = g_object_new (G_TYPE_OBJECT, NULL); + + /* Without source or tag */ + result = (GAsyncResult *) g_simple_async_result_new (NULL, NULL, NULL, NULL); + g_assert_true (g_simple_async_result_is_valid (result, NULL, NULL)); + g_assert_true (g_simple_async_result_is_valid (result, NULL, test_valid)); + g_assert_true (g_simple_async_result_is_valid (result, NULL, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, a, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, a, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async)); + g_object_unref (result); + + /* Without source, with tag */ + result = (GAsyncResult *) g_simple_async_result_new (NULL, NULL, NULL, test_valid); + g_assert_true (g_simple_async_result_is_valid (result, NULL, NULL)); + g_assert_true (g_simple_async_result_is_valid (result, NULL, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, a, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, a, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async)); + g_object_unref (result); + + /* With source, without tag */ + result = (GAsyncResult *) g_simple_async_result_new (a, NULL, NULL, NULL); + g_assert_true (g_simple_async_result_is_valid (result, a, NULL)); + g_assert_true (g_simple_async_result_is_valid (result, a, test_valid)); + g_assert_true (g_simple_async_result_is_valid (result, a, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, b, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, b, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, b, test_simple_async)); + g_object_unref (result); + + /* With source and tag */ + result = (GAsyncResult *) g_simple_async_result_new (a, NULL, NULL, test_valid); + g_assert_true (g_simple_async_result_is_valid (result, a, test_valid)); + g_assert_true (g_simple_async_result_is_valid (result, a, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async)); + g_assert_false (g_simple_async_result_is_valid (result, b, NULL)); + g_assert_false (g_simple_async_result_is_valid (result, b, test_valid)); + g_assert_false (g_simple_async_result_is_valid (result, b, test_simple_async)); + g_object_unref (result); + + /* Non-GSimpleAsyncResult */ + result = (GAsyncResult *) g_task_new (NULL, NULL, NULL, NULL); + g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL)); + g_object_unref (result); + + g_object_unref (a); + g_object_unref (b); +} + int main (int argc, char **argv) { g_test_init (&argc, &argv, NULL); g_test_add_func ("/gio/simple-async-result/test", test_simple_async); + g_test_add_func ("/gio/simple-async-result/valid", test_valid); return g_test_run(); } -- 2.7.4