From: John Darrington Date: Thu, 7 Mar 2013 13:48:39 +0000 (+0100) Subject: Fewer memory leaks X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=261eabd9113876a12994f7b419cbf3cf1ee98453;p=pspp Fewer memory leaks --- diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 578ff8ab4b..cda95e5378 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -63,6 +63,7 @@ static void gnm_file_casereader_destroy (struct casereader *, void *); static struct ccase *gnm_file_casereader_read (struct casereader *, void *); + static const struct casereader_class gnm_file_casereader_class = { gnm_file_casereader_read, @@ -133,6 +134,23 @@ struct gnumeric_reader }; +void +gnumeric_destroy (struct spreadsheet *s) +{ + struct gnumeric_reader *r = s; + int i; + + for (i = 0; i < s->n_sheets; ++i) + { + xmlFree (r->sheets[i].name); + } + + free (r->sheets); + + free (r); +} + + const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n) { @@ -175,7 +193,6 @@ gnumeric_get_sheet_range (struct spreadsheet *s, int n) static void gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { - int i; struct gnumeric_reader *r = r_; if ( r == NULL) return ; @@ -188,18 +205,9 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) case_unref (r->first_case); caseproto_unref (r->proto); - - for (i = 0; i < r->spreadsheet.n_sheets; ++i) - { - xmlFree (r->sheets[i].name); - } - - free (r->sheets); - - - free (r); } + static void process_node (struct gnumeric_reader *r) { @@ -424,13 +432,6 @@ struct var_spec }; -void -gnumeric_destroy (struct spreadsheet *s) -{ - gnm_file_casereader_destroy (NULL, s); -} - - static void gnumeric_error_handler (void *ctx, const char *mesg, UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc) diff --git a/src/data/gnumeric-reader.h b/src/data/gnumeric-reader.h index e0a5f5cad0..1f5a32e3a4 100644 --- a/src/data/gnumeric-reader.h +++ b/src/data/gnumeric-reader.h @@ -29,10 +29,10 @@ struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors); const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n); char * gnumeric_get_sheet_range (struct spreadsheet *s, int n); -void gnumeric_destroy (struct spreadsheet *); - struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts); +void gnumeric_destroy (struct spreadsheet *r); + #endif diff --git a/src/data/ods-reader.c b/src/data/ods-reader.c index 5f5c0eed93..a36a020a0b 100644 --- a/src/data/ods-reader.c +++ b/src/data/ods-reader.c @@ -67,14 +67,15 @@ ods_open_reader (const struct spreadsheet_read_options *opts, #include "gl/xalloc.h" static void ods_file_casereader_destroy (struct casereader *, void *); - static struct ccase *ods_file_casereader_read (struct casereader *, void *); +static struct casereader *ods_file_casereader_clone (struct casereader *, void *); + static const struct casereader_class ods_file_casereader_class = { ods_file_casereader_read, ods_file_casereader_destroy, - NULL, + ods_file_casereader_clone, NULL, }; @@ -105,6 +106,7 @@ struct ods_reader struct spreadsheet spreadsheet; struct zip_reader *zreader; xmlTextReaderPtr xtr; + int ref_cnt; enum reader_state state; int row; @@ -113,7 +115,7 @@ struct ods_reader int current_sheet; xmlChar *current_sheet_name; - const xmlChar *target_sheet_name; + xmlChar *target_sheet_name; int target_sheet_index; @@ -136,6 +138,26 @@ struct ods_reader struct string ods_errs; }; +void +ods_destroy (struct spreadsheet *s) +{ + struct ods_reader *r = s; + if (--r->ref_cnt == 0) + { + int i; + + for (i = 0; i < r->n_allocated_sheets; ++i) + { + xmlFree (r->sheets[i].name); + } + + zip_reader_destroy (r->zreader); + free (r->sheets); + free (r); + } +} + + static bool reading_target_sheet (const struct ods_reader *r) @@ -206,10 +228,19 @@ ods_get_sheet_range (struct spreadsheet *s, int n) } +static struct casereader * +ods_file_casereader_clone (struct casereader *r_, void *s) +{ + struct ods_reader *r = r_; + + printf ("%s:%d CLONE reffing %p %d\n", __FILE__, __LINE__, s, r->ref_cnt); + + return r_; +} + static void ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { - int i; struct ods_reader *r = r_; if ( r == NULL) return ; @@ -229,16 +260,14 @@ ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) caseproto_unref (r->proto); xmlFree (r->current_sheet_name); + xmlFree (r->target_sheet_name); + + ods_destroy (r); +} + - for (i = 0; i < r->n_allocated_sheets; ++i) - { - xmlFree (r->sheets[i].name); - } - free (r->sheets); - free (r); -} static void process_node (struct ods_reader *r) @@ -483,7 +512,7 @@ get_sheet_count (struct zip_reader *zreader) return -1; mxtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read, - (xmlInputCloseCallback) zip_member_finish, + (xmlInputCloseCallback) NULL, meta, NULL, NULL, 0); while (1 == xmlTextReaderRead (mxtr)) @@ -533,11 +562,10 @@ init_reader (struct ods_reader *r, bool report_errors) if ( content == NULL) return false; - zip_member_ref (content); - if (r->xtr) xmlFreeTextReader (r->xtr); + zip_member_ref (content); xtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read, (xmlInputCloseCallback) zip_member_finish, content, NULL, NULL, @@ -582,6 +610,7 @@ ods_probe (const char *filename, bool report_errors) r = xzalloc (sizeof *r); r->zreader = zr; + r->ref_cnt = 1; if (! init_reader (r, report_errors)) { @@ -622,12 +651,12 @@ ods_make_reader (struct spreadsheet *spreadsheet, assert (r); r->read_names = opts->read_names; ds_init_empty (&r->ods_errs); - + ++r->ref_cnt; if ( !init_reader (r, true)) goto error; - if ( opts->cell_range ) + if (opts->cell_range) { if ( ! convert_cell_ref (opts->cell_range, &r->start_col, &r->start_row, @@ -647,7 +676,7 @@ ods_make_reader (struct spreadsheet *spreadsheet, } r->state = STATE_INIT; - r->target_sheet_name = BAD_CAST opts->sheet_name; + r->target_sheet_name = xmlStrdup (BAD_CAST opts->sheet_name); r->target_sheet_index = opts->sheet_index; r->row = r->col = 0; @@ -825,7 +854,6 @@ ods_make_reader (struct spreadsheet *spreadsheet, break; } - // zip_reader_destroy (zreader); for ( i = 0 ; i < n_var_specs ; ++i ) { @@ -846,8 +874,7 @@ ods_make_reader (struct spreadsheet *spreadsheet, error: - //zip_reader_destroy (zreader); - +#if 0 for ( i = 0 ; i < n_var_specs ; ++i ) { free (var_spec[i].firstval.type); @@ -860,6 +887,7 @@ ods_make_reader (struct spreadsheet *spreadsheet, dict_destroy (r->spreadsheet.dict); r->spreadsheet.dict = NULL; +#endif ods_file_casereader_destroy (NULL, r); diff --git a/src/data/ods-reader.h b/src/data/ods-reader.h index 3d939a8048..4acda231da 100644 --- a/src/data/ods-reader.h +++ b/src/data/ods-reader.h @@ -31,5 +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); + #endif diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index 4a85cb22dd..fc1dfa8dd5 100644 --- a/src/data/spreadsheet-reader.c +++ b/src/data/spreadsheet-reader.c @@ -18,6 +18,7 @@ #include "spreadsheet-reader.h" +#include #include "gnumeric-reader.h" #include "ods-reader.h" @@ -28,9 +29,22 @@ #include #include + void -spreadsheet_close (UNUSED struct spreadsheet *spreadsheet) +spreadsheet_destroy (struct spreadsheet *s) { + switch (s->type) + { + case SPREADSHEET_ODS: + ods_destroy (s); + break; + case SPREADSHEET_GNUMERIC: + gnumeric_destroy (s); + break; + default: + NOT_REACHED (); + break; + } } diff --git a/src/data/spreadsheet-reader.h b/src/data/spreadsheet-reader.h index 960d076b38..9a46b35e9e 100644 --- a/src/data/spreadsheet-reader.h +++ b/src/data/spreadsheet-reader.h @@ -79,7 +79,7 @@ char * spreadsheet_get_sheet_range (struct spreadsheet *s, int n); char *create_cell_ref (int col0, int row0, int coli, int rowi); -void spreadsheet_close (struct spreadsheet *); +void spreadsheet_destroy (struct spreadsheet *); diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c index 70f6c89cbc..daec18f41d 100644 --- a/src/language/data-io/get-data.c +++ b/src/language/data-io/get-data.c @@ -62,7 +62,7 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) lex_force_match (lexer, T_SLASH); if (!lex_force_match_id (lexer, "TYPE")) - return CMD_FAILURE; + goto error; lex_force_match (lexer, T_EQUALS); @@ -102,6 +102,7 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) goto error; reader = ods_make_reader (spreadsheet, &opts); dict = spreadsheet->dict; + ods_destroy (spreadsheet); } free (filename); @@ -111,6 +112,7 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) dataset_set_dict (ds, dict); dataset_set_source (ds, reader); free (tok); + destroy_spreadsheet_read_info (&opts); return CMD_SUCCESS; } } @@ -118,8 +120,6 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) msg (SE, _("Unsupported TYPE %s."), tok); - - error: destroy_spreadsheet_read_info (&opts); free (tok); diff --git a/src/libpspp/zip-reader.c b/src/libpspp/zip-reader.c index 985b0a9027..a36bd6f25f 100644 --- a/src/libpspp/zip-reader.c +++ b/src/libpspp/zip-reader.c @@ -126,7 +126,9 @@ zip_reader_destroy (struct zip_reader *zr) if (zr == NULL) return; - fclose (zr->fr); + if (zr->fr != NULL) + fclose (zr->fr); + free (zr->filename); for (i = 0; i < zr->n_members; ++i)