diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2010-01-20 14:23:07 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2010-01-20 14:23:07 +0000 |
commit | 3f81c18a86568f2d36fda242e9221a3526550f64 (patch) | |
tree | 7a69a7d908e74eb4b02ba02e4f89f65089e9b347 /gdb/infcmd.c | |
parent | 760f3a89bc848e34713cbbe356c1dfb5af2514ba (diff) | |
download | gdb-3f81c18a86568f2d36fda242e9221a3526550f64.zip gdb-3f81c18a86568f2d36fda242e9221a3526550f64.tar.gz gdb-3f81c18a86568f2d36fda242e9221a3526550f64.tar.bz2 |
Per-inferior args and tty and environment.
* infcmd.c (inferior_args): Rename to ...
(inferior_args_scratch): ... this.
(inferior_io_terminal): Rename to ...
(inferior_io_terminal_scratch): ... this.
(inferior_argc, inferior_argv): Remove.
(set_inferior_io_terminal, get_inferior_io_terminal): Store
inside current_inferior().
(set_inferior_tty_command, show_inferior_tty_command): New.
(get_inferior_args, set_inferior_args): Store inside
current_inferior().
(notice_args_set): Likewise and rename to...
(set_args_command): ... this.
(set_inferior_args_vector): Likewise.
(notice_args_read): Rename to...
(show_args_command): ...new.
(tty_command): Remove.
(run_command_1): Don't free old args, as they are freed by
set_inferior_arg now.
(run_no_args_command): Likewise.
(inferior_environ): Remove.
(run_command_1): Use environment of the current inferior.
(environment_info, set_environment_command)
(unset_environment_command, path_info, path_command): Likewise.
(_initialize_infcmd): Adjust for function and variable renames.
Do not init inferior_environ.
* inferior.h (set_inferior_arg): Adjust prototype.
(struct inferior): New fields args, argc, argv, terminal, environment.
(inferior_environ): Remove declaration.
* inferior.c (free_inferior): Free new fields.
(add_inferior_silent): Initialize 'environment' field.
* main.c (captured_main): Set arguments only after the initial
inferior has been created. Set set_inferior_io_terminal,
not tty_command.
* mi/mi-main.c (mi_cmd_env_path): Use environment of the current
inferior.
(_initialize_mi_cmd_env): Adjust for disappearance of global
inferior_environ.
* solib.c (solib_find): Use environment of the current inferior.
Diffstat (limited to 'gdb/infcmd.c')
-rw-r--r-- | gdb/infcmd.c | 161 |
1 files changed, 81 insertions, 80 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 21a2233..f99a4ae 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -126,20 +126,17 @@ void _initialize_infcmd (void); #define ERROR_NO_INFERIOR \ if (!target_has_execution) error (_("The program is not being run.")); -/* String containing arguments to give to the program, separated by spaces. - Empty string (pointer to '\0') means no args. */ +/* Scratch area where string containing arguments to give to the program will be + stored by 'set args'. As soon as anything is stored, notice_args_set will + move it into per-inferior storage. Arguments are separated by spaces. Empty + string (pointer to '\0') means no args. */ -static char *inferior_args; +static char *inferior_args_scratch; -/* The inferior arguments as a vector. If INFERIOR_ARGC is nonzero, - then we must compute INFERIOR_ARGS from this (via the target). */ +/* Scratch area where 'set inferior-tty' will store user-provided value. + We'll immediate copy it into per-inferior storage. */ -static int inferior_argc; -static char **inferior_argv; - -/* File name for default use for standard in/out in the inferior. */ - -static char *inferior_io_terminal; +static char *inferior_io_terminal_scratch; /* Pid of our debugged inferior, or 0 if no inferior now. Since various parts of infrun.c test this to see whether there is a program @@ -166,80 +163,97 @@ int stop_stack_dummy; int stopped_by_random_signal; -/* Environment to use for running inferior, - in format described in environ.h. */ - -struct gdb_environ *inferior_environ; /* Accessor routines. */ +/* Set the io terminal for the current inferior. Ownership of + TERMINAL_NAME is not transferred. */ + void set_inferior_io_terminal (const char *terminal_name) { - if (inferior_io_terminal) - xfree (inferior_io_terminal); - - if (!terminal_name) - inferior_io_terminal = NULL; - else - inferior_io_terminal = xstrdup (terminal_name); + xfree (current_inferior ()->terminal); + current_inferior ()->terminal = terminal_name ? xstrdup (terminal_name) : 0; } const char * get_inferior_io_terminal (void) { - return inferior_io_terminal; + return current_inferior ()->terminal; +} + +static void +set_inferior_tty_command (char *args, int from_tty, + struct cmd_list_element *c) +{ + /* CLI has assigned the user-provided value to inferior_io_terminal_scratch. + Now route it to current inferior. */ + set_inferior_io_terminal (inferior_io_terminal_scratch); +} + +static void +show_inferior_tty_command (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + /* Note that we ignore the passed-in value in favor of computing it + directly. */ + fprintf_filtered (gdb_stdout, + _("argument list to give program being debugged when " + "it is started is %s"), + get_inferior_io_terminal ()); } char * get_inferior_args (void) { - if (inferior_argc != 0) + if (current_inferior ()->argc != 0) { - char *n, *old; + char *n; - n = construct_inferior_arguments (inferior_argc, inferior_argv); - old = set_inferior_args (n); - xfree (old); + n = construct_inferior_arguments (current_inferior ()->argc, + current_inferior ()->argv); + set_inferior_args (n); + xfree (n); } - if (inferior_args == NULL) - inferior_args = xstrdup (""); + if (current_inferior ()->args == NULL) + current_inferior ()->args = xstrdup (""); - return inferior_args; + return current_inferior ()->args; } -char * +/* Set the arguments for the current inferior. Ownership of + NEWARGS is not transferred. */ + +void set_inferior_args (char *newargs) { - char *saved_args = inferior_args; - - inferior_args = newargs; - inferior_argc = 0; - inferior_argv = 0; - - return saved_args; + xfree (current_inferior ()->args); + current_inferior ()->args = newargs ? xstrdup (newargs) : NULL; + current_inferior ()->argc = 0; + current_inferior ()->argv = 0; } void set_inferior_args_vector (int argc, char **argv) { - inferior_argc = argc; - inferior_argv = argv; + current_inferior ()->argc = argc; + current_inferior ()->argv = argv; } /* Notice when `set args' is run. */ static void -notice_args_set (char *args, int from_tty, struct cmd_list_element *c) +set_args_command (char *args, int from_tty, struct cmd_list_element *c) { - inferior_argc = 0; - inferior_argv = 0; + /* CLI has assigned the user-provided value to inferior_args_scratch. + Now route it to current inferior. */ + set_inferior_args (inferior_args_scratch); } /* Notice when `show args' is run. */ static void -notice_args_read (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) +show_args_command (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { /* Note that we ignore the passed-in value in favor of computing it directly. */ @@ -369,15 +383,6 @@ strip_bg_char (char **args) return 0; } -void -tty_command (char *file, int from_tty) -{ - if (file == 0) - error_no_arg (_("terminal name for running target process")); - - set_inferior_io_terminal (file); -} - /* Common actions to take after creating any sort of inferior, by any means (running, attaching, connecting, et cetera). The target should be stopped. */ @@ -536,10 +541,7 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) /* If there were other args, beside '&', process them. */ if (args) - { - char *old_args = set_inferior_args (xstrdup (args)); - xfree (old_args); - } + set_inferior_args (args); } if (from_tty) @@ -559,7 +561,7 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) /* We call get_inferior_args() because we might need to compute the value now. */ target_create_inferior (exec_file, get_inferior_args (), - environ_vector (inferior_environ), from_tty); + environ_vector (current_inferior ()->environment), from_tty); /* We're starting off a new process. When we get out of here, in non-stop mode, finish the state of all threads of that process, @@ -594,8 +596,7 @@ run_command (char *args, int from_tty) static void run_no_args_command (char *args, int from_tty) { - char *old_args = set_inferior_args (xstrdup ("")); - xfree (old_args); + set_inferior_args (""); } @@ -1699,7 +1700,7 @@ environment_info (char *var, int from_tty) { if (var) { - char *val = get_in_environ (inferior_environ, var); + char *val = get_in_environ (current_inferior ()->environment, var); if (val) { puts_filtered (var); @@ -1716,7 +1717,7 @@ environment_info (char *var, int from_tty) } else { - char **vector = environ_vector (inferior_environ); + char **vector = environ_vector (current_inferior ()->environment); while (*vector) { puts_filtered (*vector++); @@ -1781,10 +1782,10 @@ set_environment_command (char *arg, int from_tty) printf_filtered (_("\ Setting environment variable \"%s\" to null value.\n"), var); - set_in_environ (inferior_environ, var, ""); + set_in_environ (current_inferior ()->environment, var, ""); } else - set_in_environ (inferior_environ, var, val); + set_in_environ (current_inferior ()->environment, var, val); xfree (var); } @@ -1797,12 +1798,12 @@ unset_environment_command (char *var, int from_tty) Ask for confirmation if reading from the terminal. */ if (!from_tty || query (_("Delete all environment variables? "))) { - free_environ (inferior_environ); - inferior_environ = make_environ (); + free_environ (current_inferior ()->environment); + current_inferior ()->environment = make_environ (); } } else - unset_in_environ (inferior_environ, var); + unset_in_environ (current_inferior ()->environment, var); } /* Handle the execution path (PATH variable) */ @@ -1813,7 +1814,7 @@ static void path_info (char *args, int from_tty) { puts_filtered ("Executable and object file path: "); - puts_filtered (get_in_environ (inferior_environ, path_var_name)); + puts_filtered (get_in_environ (current_inferior ()->environment, path_var_name)); puts_filtered ("\n"); } @@ -1825,13 +1826,13 @@ path_command (char *dirname, int from_tty) char *exec_path; char *env; dont_repeat (); - env = get_in_environ (inferior_environ, path_var_name); + env = get_in_environ (current_inferior ()->environment, path_var_name); /* Can be null if path is not set */ if (!env) env = ""; exec_path = xstrdup (env); mod_path (dirname, &exec_path); - set_in_environ (inferior_environ, path_var_name, exec_path); + set_in_environ (current_inferior ()->environment, path_var_name, exec_path); xfree (exec_path); if (from_tty) path_info ((char *) NULL, from_tty); @@ -2646,19 +2647,22 @@ _initialize_infcmd (void) /* add the filename of the terminal connected to inferior I/O */ add_setshow_filename_cmd ("inferior-tty", class_run, - &inferior_io_terminal, _("\ + &inferior_io_terminal_scratch, _("\ Set terminal for future runs of program being debugged."), _("\ Show terminal for future runs of program being debugged."), _("\ -Usage: set inferior-tty /dev/pts/1"), NULL, NULL, &setlist, &showlist); +Usage: set inferior-tty /dev/pts/1"), + set_inferior_tty_command, + show_inferior_tty_command, + &setlist, &showlist); add_com_alias ("tty", "set inferior-tty", class_alias, 0); add_setshow_optional_filename_cmd ("args", class_run, - &inferior_args, _("\ + &inferior_args_scratch, _("\ Set argument list to give program being debugged when it is started."), _("\ Show argument list to give program being debugged when it is started."), _("\ Follow this command with any number of args, to be passed to the program."), - notice_args_set, - notice_args_read, + set_args_command, + show_args_command, &setlist, &showlist); c = add_cmd ("environment", no_class, environment_info, _("\ @@ -2855,7 +2859,4 @@ Register name as argument means describe only that register.")); add_info ("vector", vector_info, _("Print the status of the vector unit\n")); - - inferior_environ = make_environ (); - init_environ (inferior_environ); } |