[glib] g_simple_async_result_is_valid: fix for NULL source tag



commit 89022761018fd87a19b0c4cf5a9c9fe8575a743a
Author: Dan Winship <danw gnome org>
Date:   Sun Feb 16 09:24:04 2014 -0500

    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();
 }


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