From: John Darrington Date: Tue, 15 Sep 2015 16:17:19 +0000 (+0200) Subject: Ref count struct spreadsheet X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ec18587c5a81ed4cac8d458412c5c08ba68a6b1;p=pspp Ref count struct spreadsheet struct spreadsheet is a base class for which all current derivations are ref counted. It makes sense then to have the base class refcounted instead of the more derived ones --- diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 8faffe6676..e0e95069b6 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -149,7 +149,6 @@ state_data_destroy (struct state_data *sd) struct gnumeric_reader { struct spreadsheet spreadsheet; - int ref_cnt; struct state_data rsd; struct state_data msd; @@ -174,11 +173,11 @@ struct gnumeric_reader void -gnumeric_destroy (struct spreadsheet *s) +gnumeric_unref (struct spreadsheet *s) { struct gnumeric_reader *r = (struct gnumeric_reader *) s; - if (0 == --r->ref_cnt) + if (0 == --s->ref_cnt) { int i; @@ -250,7 +249,7 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) if (r->proto) caseproto_unref (r->proto); - gnumeric_destroy (&r->spreadsheet); + gnumeric_unref (&r->spreadsheet); } @@ -573,7 +572,8 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro sd->row = sd->col = -1; sd->state = STATE_PRE_INIT; sd->xtr = xtr; - r->ref_cnt++; + r->spreadsheet.ref_cnt++; + /* Advance to the start of the workbook. This gives us some confidence that we are actually dealing with a gnumeric diff --git a/src/data/gnumeric-reader.h b/src/data/gnumeric-reader.h index 1f5a32e3a4..edec2b66c4 100644 --- a/src/data/gnumeric-reader.h +++ b/src/data/gnumeric-reader.h @@ -32,7 +32,7 @@ char * gnumeric_get_sheet_range (struct spreadsheet *s, int n); struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts); -void gnumeric_destroy (struct spreadsheet *r); +void gnumeric_unref (struct spreadsheet *r); #endif diff --git a/src/data/ods-reader.c b/src/data/ods-reader.c index 1b828d1e36..01ff6cf115 100644 --- a/src/data/ods-reader.c +++ b/src/data/ods-reader.c @@ -127,7 +127,7 @@ struct ods_reader { struct spreadsheet spreadsheet; struct zip_reader *zreader; - int ref_cnt; + int target_sheet_index; xmlChar *target_sheet_name; @@ -157,11 +157,11 @@ struct ods_reader }; void -ods_destroy (struct spreadsheet *s) +ods_unref (struct spreadsheet *s) { struct ods_reader *r = (struct ods_reader *) s; - if (--r->ref_cnt == 0) + if (--s->ref_cnt == 0) { int i; @@ -276,7 +276,7 @@ ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) r->target_sheet_name = NULL; - ods_destroy (&r->spreadsheet); + ods_unref (&r->spreadsheet); } @@ -632,7 +632,7 @@ ods_probe (const char *filename, bool report_errors) sheet_count = get_sheet_count (zr); r->zreader = zr; - r->ref_cnt = 1; + r->spreadsheet.ref_cnt = 1; xtr = init_reader (r, report_errors); if (xtr == NULL) @@ -679,7 +679,7 @@ ods_make_reader (struct spreadsheet *spreadsheet, assert (r); r->read_names = opts->read_names; ds_init_empty (&r->ods_errs); - ++r->ref_cnt; + ++r->spreadsheet.ref_cnt; xtr = init_reader (r, true); if ( xtr == NULL) diff --git a/src/data/ods-reader.h b/src/data/ods-reader.h index 4acda231da..f31304d224 100644 --- a/src/data/ods-reader.h +++ b/src/data/ods-reader.h @@ -31,7 +31,7 @@ struct spreadsheet *ods_probe (const char *filename, bool report_errors); struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts); -void ods_destroy (struct spreadsheet *s); +void ods_unref (struct spreadsheet *s); #endif diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index 3c5de65822..f5a138064e 100644 --- a/src/data/spreadsheet-reader.c +++ b/src/data/spreadsheet-reader.c @@ -42,18 +42,24 @@ const bool GNM_READING_SUPPORTED = false; #endif void -spreadsheet_destroy (struct spreadsheet *s) +spreadsheet_ref (struct spreadsheet *s) +{ + s->ref_cnt++; +} + +void +spreadsheet_unref (struct spreadsheet *s) { switch (s->type) { case SPREADSHEET_ODS: assert (ODF_READING_SUPPORTED); - ods_destroy (s); + ods_unref (s); break; case SPREADSHEET_GNUMERIC: assert (GNM_READING_SUPPORTED); - gnumeric_destroy (s); + gnumeric_unref (s); break; default: NOT_REACHED (); diff --git a/src/data/spreadsheet-reader.h b/src/data/spreadsheet-reader.h index 5e7eaa6e46..314376379c 100644 --- a/src/data/spreadsheet-reader.h +++ b/src/data/spreadsheet-reader.h @@ -68,6 +68,8 @@ struct spreadsheet /* The dictionary */ struct dictionary *dict; + + int ref_cnt; }; @@ -80,7 +82,8 @@ char * spreadsheet_get_sheet_range (struct spreadsheet *s, int n); char * create_cell_ref (int col0, int row0); char *create_cell_range (int col0, int row0, int coli, int rowi); -void spreadsheet_destroy (struct spreadsheet *); +void spreadsheet_unref (struct spreadsheet *); +void spreadsheet_ref (struct spreadsheet *); diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c index 01817179b8..3458b39e41 100644 --- a/src/language/data-io/get-data.c +++ b/src/language/data-io/get-data.c @@ -114,7 +114,7 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) goto error; reader = gnumeric_make_reader (spreadsheet, &opts); dict = spreadsheet->dict; - gnumeric_destroy (spreadsheet); + gnumeric_unref (spreadsheet); } else if ( odf_read_support && 0 == strncasecmp (tok, "ODS", 3)) { @@ -123,7 +123,7 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) goto error; reader = ods_make_reader (spreadsheet, &opts); dict = spreadsheet->dict; - ods_destroy (spreadsheet); + ods_unref (spreadsheet); } free (filename); diff --git a/src/ui/gui/spreadsheet-test.c b/src/ui/gui/spreadsheet-test.c index 8e4299cd31..b702270083 100644 --- a/src/ui/gui/spreadsheet-test.c +++ b/src/ui/gui/spreadsheet-test.c @@ -192,7 +192,7 @@ main (int argc, char *argv[] ) gtk_main (); - spreadsheet_destroy (stuff.sp); + spreadsheet_unref (stuff.sp); return 0; }