gstvalue: Avoid temporary allocation
authorEdward Hervey <edward@centricular.com>
Sat, 21 Mar 2020 12:05:33 +0000 (13:05 +0100)
committerSebastian Dröge <slomo@coaxion.net>
Tue, 5 May 2020 10:17:49 +0000 (10:17 +0000)
The problem is that:
* g_value_init will end up allocating an internal list/array
* g_value_copy *clears* the existing value by calling the free func
  and then the copy function (creating it again)

To avoid that alloc/free/alloc cycle, directly call the appropriate
function

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/453>

gst/gstvalue.c

index 5a4c652..a3578f0 100644 (file)
@@ -6358,10 +6358,24 @@ gst_value_register (const GstValueTable * table)
 void
 gst_value_init_and_copy (GValue * dest, const GValue * src)
 {
+  GType type;
+
   g_return_if_fail (G_IS_VALUE (src));
   g_return_if_fail (dest != NULL);
 
-  g_value_init (dest, G_VALUE_TYPE (src));
+  type = G_VALUE_TYPE (src);
+  /* We need to shortcut GstValueList/GstValueArray copying because:
+   * * g_value_init would end up allocating something
+   * * which g_value_copy would then free and re-alloc.
+   *
+   * Instead directly call the copy */
+  if (type == GST_TYPE_LIST || type == GST_TYPE_ARRAY) {
+    dest->g_type = type;
+    gst_value_copy_list_or_array (src, dest);
+    return;
+  }
+
+  g_value_init (dest, type);
   g_value_copy (src, dest);
 }