mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-03 14:42:10 +01:00
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
This commit is contained in:
parent
9c135707cb
commit
8902276101
@ -907,8 +907,8 @@ g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple,
|
|||||||
/**
|
/**
|
||||||
* g_simple_async_result_is_valid:
|
* g_simple_async_result_is_valid:
|
||||||
* @result: the #GAsyncResult passed to the _finish function.
|
* @result: the #GAsyncResult passed to the _finish function.
|
||||||
* @source: the #GObject passed to the _finish function.
|
* @source: (allow-none): the #GObject passed to the _finish function.
|
||||||
* @source_tag: the asynchronous function.
|
* @source_tag: (allow-none): the asynchronous function.
|
||||||
*
|
*
|
||||||
* Ensures that the data passed to the _finish function of an async
|
* Ensures that the data passed to the _finish function of an async
|
||||||
* operation is consistent. Three checks are performed.
|
* 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
|
* First, @result is checked to ensure that it is really a
|
||||||
* #GSimpleAsyncResult. Second, @source is checked to ensure that it
|
* #GSimpleAsyncResult. Second, @source is checked to ensure that it
|
||||||
* matches the source object of @result. Third, @source_tag is
|
* 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
|
* checked to ensure that it is equal to the @source_tag argument given
|
||||||
* created by g_simple_async_report_error_in_idle() or
|
* to g_simple_async_result_new() (which, by convention, is a pointer
|
||||||
* g_simple_async_report_gerror_in_idle()) or equal to the
|
* to the _async function corresponding to the _finish function from
|
||||||
* @source_tag argument given to g_simple_async_result_new() (which, by
|
* which this function is called). (Alternatively, if either
|
||||||
* convention, is a pointer to the _async function corresponding to the
|
* @source_tag or @result's source tag is %NULL, then the source tag
|
||||||
* _finish function from which this function is called).
|
* check is skipped.)
|
||||||
*
|
*
|
||||||
* Returns: #TRUE if all checks passed or #FALSE if any failed.
|
* 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;
|
GSimpleAsyncResult *simple;
|
||||||
GObject *cmp_source;
|
GObject *cmp_source;
|
||||||
|
gpointer result_source_tag;
|
||||||
|
|
||||||
if (!G_IS_SIMPLE_ASYNC_RESULT (result))
|
if (!G_IS_SIMPLE_ASYNC_RESULT (result))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -949,8 +950,9 @@ g_simple_async_result_is_valid (GAsyncResult *result,
|
|||||||
if (cmp_source != NULL)
|
if (cmp_source != NULL)
|
||||||
g_object_unref (cmp_source);
|
g_object_unref (cmp_source);
|
||||||
|
|
||||||
return source_tag == NULL ||
|
result_source_tag = g_simple_async_result_get_source_tag (simple);
|
||||||
source_tag == g_simple_async_result_get_source_tag (simple);
|
return source_tag == NULL || result_source_tag == NULL ||
|
||||||
|
source_tag == result_source_tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -119,12 +119,77 @@ test_simple_async (void)
|
|||||||
ensure_destroyed (b);
|
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
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
g_test_init (&argc, &argv, NULL);
|
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/test", test_simple_async);
|
||||||
|
g_test_add_func ("/gio/simple-async-result/valid", test_valid);
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user