Add g_binding_dup_target() and g_binding_dup_source()

These new getters prevent the source/target from simply disappearing if
they're finalized from another thread in the meantime.
This commit is contained in:
Sebastian Dröge 2020-10-19 13:55:12 +03:00
parent 51ee5cf1c2
commit c8c829fa42
3 changed files with 60 additions and 0 deletions

View File

@ -978,8 +978,10 @@ g_io_condition_get_type
GBinding
GBindingFlags
g_binding_get_source
g_binding_dup_source
g_binding_get_source_property
g_binding_get_target
g_binding_dup_target
g_binding_get_target_property
g_binding_get_flags
g_binding_unbind

View File

@ -793,6 +793,10 @@ g_binding_get_flags (GBinding *binding)
* strong reference to the source. If the source is destroyed before the
* binding then this function will return %NULL.
*
* Use g_binding_dup_source() if the source or binding are used from different
* threads as otherwise the pointer returned from this function might become
* invalid if the source is finalized from another thread in the meantime.
*
* Returns: (transfer none) (nullable): the source #GObject, or %NULL if the
* source does not exist any more.
*
@ -814,6 +818,29 @@ g_binding_get_source (GBinding *binding)
return source;
}
/**
* g_binding_dup_source:
* @binding: a #GBinding
*
* Retrieves the #GObject instance used as the source of the binding.
*
* A #GBinding can outlive the source #GObject as the binding does not hold a
* strong reference to the source. If the source is destroyed before the
* binding then this function will return %NULL.
*
* Returns: (transfer full) (nullable): the source #GObject, or %NULL if the
* source does not exist any more.
*
* Since: 2.68
*/
GObject *
g_binding_dup_source (GBinding *binding)
{
g_return_val_if_fail (G_IS_BINDING (binding), NULL);
return g_weak_ref_get (&binding->source);
}
/**
* g_binding_get_target:
* @binding: a #GBinding
@ -824,6 +851,10 @@ g_binding_get_source (GBinding *binding)
* strong reference to the target. If the target is destroyed before the
* binding then this function will return %NULL.
*
* Use g_binding_dup_target() if the target or binding are used from different
* threads as otherwise the pointer returned from this function might become
* invalid if the target is finalized from another thread in the meantime.
*
* Returns: (transfer none) (nullable): the target #GObject, or %NULL if the
* target does not exist any more.
*
@ -845,6 +876,29 @@ g_binding_get_target (GBinding *binding)
return target;
}
/**
* g_binding_dup_target:
* @binding: a #GBinding
*
* Retrieves the #GObject instance used as the target of the binding.
*
* A #GBinding can outlive the target #GObject as the binding does not hold a
* strong reference to the target. If the target is destroyed before the
* binding then this function will return %NULL.
*
* Returns: (transfer full) (nullable): the target #GObject, or %NULL if the
* target does not exist any more.
*
* Since: 2.68
*/
GObject *
g_binding_dup_target (GBinding *binding)
{
g_return_val_if_fail (G_IS_BINDING (binding), NULL);
return g_weak_ref_get (&binding->target);
}
/**
* g_binding_get_source_property:
* @binding: a #GBinding

View File

@ -110,8 +110,12 @@ GLIB_AVAILABLE_IN_ALL
GBindingFlags g_binding_get_flags (GBinding *binding);
GLIB_AVAILABLE_IN_ALL
GObject * g_binding_get_source (GBinding *binding);
GLIB_AVAILABLE_IN_2_68
GObject * g_binding_dup_source (GBinding *binding);
GLIB_AVAILABLE_IN_ALL
GObject * g_binding_get_target (GBinding *binding);
GLIB_AVAILABLE_IN_2_68
GObject * g_binding_dup_target (GBinding *binding);
GLIB_AVAILABLE_IN_ALL
const gchar * g_binding_get_source_property (GBinding *binding);
GLIB_AVAILABLE_IN_ALL