diff options
author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2022-12-20 02:09:09 +0100 |
---|---|---|
committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2022-12-20 17:48:21 +0100 |
commit | bc59ed8fba0f171399967e692153e72ac911b7d0 (patch) | |
tree | aa19a78afb11eefe652fa4ede22b918463c270eb | |
parent | cbee90b8a4a0d4de40425f11ba15300db5284b5e (diff) | |
download | glib-bc59ed8fba0f171399967e692153e72ac911b7d0.tar.gz |
gobject: Avoid the ref/unref dance if assigning the same to a value
g_value_set_object could lead to perform unneeded ref/unref operations in
case we were trying to set again an object to a GValue
-rw-r--r-- | gobject/gobject.c | 5 | ||||
-rw-r--r-- | gobject/tests/value.c | 1 |
2 files changed, 5 insertions, 1 deletions
diff --git a/gobject/gobject.c b/gobject/gobject.c index 8930fde06..5a3b70b5f 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -4502,8 +4502,11 @@ g_value_set_object (GValue *value, g_return_if_fail (G_VALUE_HOLDS_OBJECT (value)); + if G_UNLIKELY (value->data[0].v_pointer == v_object) + return; + old = value->data[0].v_pointer; - + if (v_object) { g_return_if_fail (G_IS_OBJECT (v_object)); diff --git a/gobject/tests/value.c b/gobject/tests/value.c index c294020ed..73a5de650 100644 --- a/gobject/tests/value.c +++ b/gobject/tests/value.c @@ -719,6 +719,7 @@ test_value_transform_object (void) g_value_init (&src, types[s]); g_value_set_object (&src, object); + g_value_set_object (&src, g_value_get_object (&src)); for (d = 0; d < G_N_ELEMENTS (types); d++) { |