miniobject: free qdata array when the last qdata is removed
authorDavid Svensson Fors <davidsf@axis.com>
Tue, 3 Sep 2019 08:38:13 +0000 (10:38 +0200)
committerDavid Svensson Fors <davidsf@axis.com>
Wed, 4 Sep 2019 14:31:53 +0000 (16:31 +0200)
In cases with many long-lived buffers that have qdata only very
briefly, the memory overhead of keeping an array of 16 GstQData
structs for each buffer can be significant. We free the array when
the last qdata is removed, like it was done in 1.14.

Fixes #436

gst/gstminiobject.c

index c6dd87dd11efa424cffcab288831704143718ffe..ef0028baad91986569617cafb4a4fe2272006e7f 100644 (file)
@@ -506,7 +506,12 @@ remove_notify (GstMiniObject * object, gint index)
 
   /* remove item */
   priv_data->n_qdata--;
-  if (index != priv_data->n_qdata) {
+  if (priv_data->n_qdata == 0) {
+    /* we don't shrink but free when everything is gone */
+    g_free (priv_data->qdata);
+    priv_data->qdata = NULL;
+    priv_data->n_qdata_len = 0;
+  } else if (index != priv_data->n_qdata) {
     QDATA (priv_data, index) = QDATA (priv_data, priv_data->n_qdata);
   }
 }