From: John Darrington Date: Sat, 27 Jun 2020 15:36:48 +0000 (+0200) Subject: Introduce reference counting for variables. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc8bf17d5f839d6745eed040b7a28cea22b02ef5;p=pspp Introduce reference counting for variables. Necessary for upcomming commit. --- diff --git a/src/data/dictionary.c b/src/data/dictionary.c index ceea10ed68..3902f4ced5 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -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); } diff --git a/src/data/variable.c b/src/data/variable.c index 3ad9eccdb0..2b0dd2579d 100644 --- a/src/data/variable.c +++ b/src/data/variable.c @@ -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); } + + /* Variable names. */ diff --git a/src/data/variable.h b/src/data/variable.h index 6347d8173c..a17470f26b 100644 --- a/src/data/variable.h +++ b/src/data/variable.h @@ -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 *); diff --git a/src/output/charts/scatterplot.c b/src/output/charts/scatterplot.c index 5073a5a71b..69b53b6751 100644 --- a/src/output/charts/scatterplot.c +++ b/src/output/charts/scatterplot.c @@ -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); }