diff options
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/mi/mi-main.c | 19 | ||||
-rw-r--r-- | gdb/osdata.c | 97 | ||||
-rw-r--r-- | gdb/osdata.h | 1 | ||||
-rw-r--r-- | gdb/target.h | 6 |
5 files changed, 83 insertions, 54 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 345766f..834c5a5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2008-12-02 Pedro Alves <pedro@codesourcery.com> + + * target.h (target_get_osdata): Describe. + * osdata.h (make_cleanup_osdata_free): Declare. + * osdata.c (osdata_item_clear): Define even if HAVE_LIBEXPAT is + not defined. + (osdata_free_cleanup): New. + (make_cleanup_osdata_free): New. + (get_osdata): Fix leak. + (info_osdata_command): Use make_cleanup_osdata_free. + (info_processes_command): Delete. + (_initialize_osdata): Drop undocumented "info processes" alias. + * mi/mi-main.c (mi_cmd_list_thread_groups): Fix leak. + 2008-12-02 Jan Kratochvil <jan.kratochvil@redhat.com> Fix resolving external references to TLS variables. diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index ed92559..e1db010 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -377,7 +377,7 @@ mi_cmd_list_thread_groups (char *command, char **argv, int argc) if (argc > 0) id = argv[0]; - back_to = make_cleanup (&null_cleanup, NULL); + back_to = make_cleanup (null_cleanup, NULL); if (available && id) { @@ -385,18 +385,21 @@ mi_cmd_list_thread_groups (char *command, char **argv, int argc) } else if (available) { - struct osdata *data = get_osdata ("processes"); + struct osdata *data; struct osdata_item *item; int ix_items; + data = get_osdata ("processes"); + make_cleanup_osdata_free (data); + make_cleanup_ui_out_list_begin_end (uiout, "groups"); - + for (ix_items = 0; - VEC_iterate (osdata_item_s, data->items, - ix_items, item); + VEC_iterate (osdata_item_s, data->items, + ix_items, item); ix_items++) { - struct cleanup *back_to = + struct cleanup *back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); const char *pid = get_osdata_column (item, "pid"); @@ -409,8 +412,8 @@ mi_cmd_list_thread_groups (char *command, char **argv, int argc) ui_out_field_string (uiout, "description", cmd); if (user) ui_out_field_string (uiout, "user", user); - - do_cleanups (back_to); + + do_cleanups (back_to); } } else if (id) diff --git a/gdb/osdata.c b/gdb/osdata.c index 761f34b..77aa40d8 100644 --- a/gdb/osdata.c +++ b/gdb/osdata.c @@ -54,26 +54,6 @@ struct osdata_parsing_data char *property_name; }; -static void -osdata_item_clear (struct osdata_item *item) -{ - if (item->columns != NULL) - { - struct osdata_column *col; - int ix; - for (ix = 0; - VEC_iterate (osdata_column_s, item->columns, - ix, col); - ix++) - { - xfree (col->name); - xfree (col->value); - } - VEC_free (osdata_column_s, item->columns); - item->columns = NULL; - } -} - /* Handle the start of a <osdata> element. */ static void @@ -205,6 +185,26 @@ osdata_parse (const char *xml) } #endif +static void +osdata_item_clear (struct osdata_item *item) +{ + if (item->columns != NULL) + { + struct osdata_column *col; + int ix; + for (ix = 0; + VEC_iterate (osdata_column_s, item->columns, + ix, col); + ix++) + { + xfree (col->name); + xfree (col->value); + } + VEC_free (osdata_column_s, item->columns); + item->columns = NULL; + } +} + void osdata_free (struct osdata *osdata) { @@ -226,18 +226,36 @@ osdata_free (struct osdata *osdata) xfree (osdata); } -struct osdata *get_osdata (const char *type) +static void +osdata_free_cleanup (void *arg) +{ + struct osdata *osdata = arg; + osdata_free (osdata); +} + +struct cleanup * +make_cleanup_osdata_free (struct osdata *data) +{ + return make_cleanup (osdata_free_cleanup, data); +} + +struct osdata * +get_osdata (const char *type) { - struct osdata * osdata = NULL; + struct osdata *osdata = NULL; char *xml = target_get_osdata (type); if (xml) { + struct cleanup *old_chain = make_cleanup (xfree, xml); + if (xml[0] == '\0') warning (_("Empty data returned by target. Wrong osdata type?")); - - osdata = osdata_parse (xml); + else + osdata = osdata_parse (xml); + + do_cleanups (old_chain); } - + if (!osdata) error (_("Can not fetch data now.\n")); @@ -263,9 +281,9 @@ get_osdata_column (struct osdata_item *item, const char *name) void info_osdata_command (char *type, int from_tty) { - struct osdata * osdata = NULL; - struct cleanup *proc_tbl_chain; + struct osdata *osdata = NULL; struct osdata_item *last; + struct cleanup *old_chain; int ncols; int nprocs; @@ -274,6 +292,7 @@ info_osdata_command (char *type, int from_tty) error (_("Argument required.")); osdata = get_osdata (type); + old_chain = make_cleanup_osdata_free (osdata); nprocs = VEC_length (osdata_item_s, osdata->items); @@ -283,9 +302,8 @@ info_osdata_command (char *type, int from_tty) else ncols = 0; - proc_tbl_chain - = make_cleanup_ui_out_table_begin_end (uiout, ncols, nprocs, - "OSDataTable"); + make_cleanup_ui_out_table_begin_end (uiout, ncols, nprocs, + "OSDataTable"); if (last && last->columns) { @@ -310,14 +328,14 @@ info_osdata_command (char *type, int from_tty) ix_items, item); ix_items++) { - struct cleanup *old_chain, *chain; + struct cleanup *old_chain; struct ui_stream *stb; int ix_cols; struct osdata_column *col; stb = ui_out_stream_new (uiout); old_chain = make_cleanup_ui_out_stream_delete (stb); - chain = make_cleanup_ui_out_tuple_begin_end (uiout, "item"); + make_cleanup_ui_out_tuple_begin_end (uiout, "item"); for (ix_cols = 0; VEC_iterate (osdata_column_s, item->columns, @@ -325,22 +343,13 @@ info_osdata_command (char *type, int from_tty) ix_cols++) ui_out_field_string (uiout, col->name, col->value); - do_cleanups (chain); do_cleanups (old_chain); ui_out_text (uiout, "\n"); } } - do_cleanups (proc_tbl_chain); - - osdata_free (osdata); -} - -static void -info_processes_command (char *args, int from_tty) -{ - info_osdata_command ("processes", from_tty); + do_cleanups (old_chain); } extern initialize_file_ftype _initialize_osdata; /* -Wmissing-prototypes */ @@ -350,8 +359,4 @@ _initialize_osdata (void) { add_info ("os", info_osdata_command, _("Show OS data ARG.")); - - /* An alias for "info osdata processes". */ - add_info ("processes", info_processes_command, - _("List running processes on the target.")); } diff --git a/gdb/osdata.h b/gdb/osdata.h index a48dca2..879285c 100644 --- a/gdb/osdata.h +++ b/gdb/osdata.h @@ -46,6 +46,7 @@ DEF_VEC_P(osdata_p); struct osdata *osdata_parse (const char *xml); void osdata_free (struct osdata *); +struct cleanup *make_cleanup_osdata_free (struct osdata *data); struct osdata *get_osdata (const char *type); const char *get_osdata_column (struct osdata_item *item, const char *name); diff --git a/gdb/target.h b/gdb/target.h index 65201eb..36dc14e 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1286,6 +1286,12 @@ extern int target_resize_to_sections (struct target_ops *target, extern void remove_target_sections (bfd *abfd); +/* Read OS data object of type TYPE from the target, and return it in + XML format. The result is NUL-terminated and returned as a string, + allocated using xmalloc. If an error occurs or the transfer is + unsupported, NULL is returned. Empty objects are returned as + allocated but empty strings. */ + extern char *target_get_osdata (const char *type); |