mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 23:34:02 +08:00
* 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.
This commit is contained in:
parent
e0740f779c
commit
e0665bc852
@ -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.
|
||||
|
@ -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)
|
||||
|
97
gdb/osdata.c
97
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 = NULL;
|
||||
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;
|
||||
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."));
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user