Introduce reference counting for variables.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 27 Jun 2020 15:36:48 +0000 (17:36 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 27 Jun 2020 15:36:48 +0000 (17:36 +0200)
Necessary for upcomming commit.

src/data/dictionary.c
src/data/variable.c
src/data/variable.h
src/output/charts/scatterplot.c

index ceea10ed6851314aaff8f20a571fa990dce9a3f0..3902f4ced52545155343aba26167afeacdc22d5d 100644 (file)
@@ -133,7 +133,7 @@ reindex_var (struct dictionary *d, struct vardict_info *vardict, bool skip_callb
       if (old)
         {
           d->callbacks->var_changed (d, var_get_dict_index (var), VAR_TRAIT_POSITION, old, d->cb_data);
-          var_destroy (old);
+          var_unref (old);
         }
     }
 }
@@ -466,7 +466,7 @@ dict_delete_var__ (struct dictionary *d, struct variable *v, bool skip_callbacks
     }
 
   invalidate_proto (d);
-  var_destroy (v);
+  var_unref (v);
 }
 
 /* Deletes variable V from dictionary D and frees V.
@@ -569,7 +569,7 @@ dict_delete_consecutive_vars (struct dictionary *d, size_t idx, size_t count)
       var_clear_vardict (dv->var);
       if (d->callbacks &&  d->callbacks->var_deleted)
         d->callbacks->var_deleted (d, dv->var, vi, dv->case_index, d->cb_data);
-      var_destroy (dv->var);
+      var_unref (dv->var);
       free (dv);
     }
 }
@@ -988,7 +988,7 @@ dict_try_rename_var (struct dictionary *d, struct variable *v,
   if (d->callbacks &&  d->callbacks->var_changed)
     d->callbacks->var_changed (d, var_get_dict_index (v), VAR_TRAIT_NAME, old, d->cb_data);
 
-  var_destroy (old);
+  var_unref (old);
 
   return true;
 }
@@ -1799,7 +1799,7 @@ dict_var_changed (const struct variable *v, unsigned int what, struct variable *
       if (d->callbacks && d->callbacks->var_changed)
         d->callbacks->var_changed (d, var_get_dict_index (v), what, oldvar, d->cb_data);
     }
-  var_destroy (oldvar);
+  var_unref (oldvar);
 }
 
 
index 3ad9eccdb07c05548d4bc87664ff35d1e191b1e9..2b0dd2579dc49c39a228755faff72fb57b060a9b 100644 (file)
@@ -1,5 +1,6 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013,
+   2014, 2016, 2020 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -82,6 +83,7 @@ const GEnumValue role[] =
 /* A variable. */
 struct variable
   {
+    int ref_cnt;
     /* Dictionary information. */
     char *name;                 /* Variable name.  Mixed case. */
     int width;                 /* 0 for numeric, otherwise string width. */
@@ -145,28 +147,43 @@ var_create (const char *name, int width)
   attrset_init (&v->attributes);
   ds_init_empty (&v->name_and_label);
 
+  v->ref_cnt = 1;
+
   return v;
 }
 
 /* Destroys variable V.
    V must not belong to a dictionary.  If it does, use
    dict_delete_var instead. */
+static void
+var_destroy__ (struct variable *v)
+{
+  assert (!var_has_vardict (v));
+  mv_destroy (&v->miss);
+  var_clear_short_names (v);
+  val_labs_destroy (v->val_labs);
+  var_set_label_quiet (v, NULL);
+  attrset_destroy (var_get_attributes (v));
+  free (v->name);
+  ds_destroy (&v->name_and_label);
+  free (v);
+}
+
+struct variable *
+var_ref (struct variable *v)
+{
+  v->ref_cnt++;
+  return v;
+}
+
 void
-var_destroy (struct variable *v)
+var_unref (struct variable *v)
 {
-  if (v != NULL)
-    {
-      assert (!var_has_vardict (v));
-      mv_destroy (&v->miss);
-      var_clear_short_names (v);
-      val_labs_destroy (v->val_labs);
-      var_set_label_quiet (v, NULL);
-      attrset_destroy (var_get_attributes (v));
-      free (v->name);
-      ds_destroy (&v->name_and_label);
-      free (v);
-    }
+  if (--v->ref_cnt == 0)
+    var_destroy__ (v);
 }
+
+
 \f
 /* Variable names. */
 
index 6347d8173cd38356a3b4ee6796dfab3db701b409..a17470f26b41c6227e9107fca297911821aafecf 100644 (file)
@@ -1,5 +1,6 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013,
+   2014, 2020 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -50,7 +51,8 @@ union value;
    instead. */
 struct variable *var_create (const char *name, int width);
 struct variable *var_clone (const struct variable *);
-void var_destroy (struct variable *);
+struct variable * var_ref (struct variable *) WARN_UNUSED_RESULT;
+void var_unref (struct variable *);
 
 /* Variable names. */
 const char *var_get_name (const struct variable *);
index 5073a5a71b7e5e5b600905b2f97edafd9d82b5dc..69b53b6751a04c1ed3ed6fdec5f9916129abf7af 100644 (file)
@@ -66,7 +66,7 @@ scatterplot_chart_destroy (struct chart_item *chart_item)
   free (spc->xlabel);
   free (spc->ylabel);
   if (spc->byvar)
-    var_destroy (spc->byvar);
+    var_unref (spc->byvar);
   free (spc);
 }