aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbtk.c
diff options
context:
space:
mode:
authorMartin Hunt <hunt@redhat.com>1998-03-26 20:24:19 +0000
committerMartin Hunt <hunt@redhat.com>1998-03-26 20:24:19 +0000
commited5fa7c345c95eb39e282f69b391e72b7d3e9939 (patch)
treef5b0b8781115f1df4bb4cebd2e8c6a68cf219b15 /gdb/gdbtk.c
parent8c11394ac605d5e4adaf6755b239dcee7629c889 (diff)
downloadgdb-ed5fa7c345c95eb39e282f69b391e72b7d3e9939.zip
gdb-ed5fa7c345c95eb39e282f69b391e72b7d3e9939.tar.gz
gdb-ed5fa7c345c95eb39e282f69b391e72b7d3e9939.tar.bz2
Thu Mar 26 12:00:35 1998 Martin M. Hunt <hunt@cygnus.com>
* gdbtk.c (gdbtk_fputs): Insert fencepost. (gdb_loc): Correct pc calculation. (gdb_immediate_command): Return if a load is in progress. (gdb_cmd): Return if a load is in progress. (target_stop_wrapper): New function. (gdb_stop): Call target_stop_wrapper. (x_event): Add fencepost and optimize load cancel check. (gdbtk_start_timer): Set up structs only once. (gdbtk_stop_timer): Just use preset structs to set timer parameters. (gdb_loadfile): If file cannot be loaded, return error message. (gdb_loadfile): Add space before tab so that lines without a '-' can later be changed to have one.
Diffstat (limited to 'gdb/gdbtk.c')
-rw-r--r--gdb/gdbtk.c134
1 files changed, 79 insertions, 55 deletions
diff --git a/gdb/gdbtk.c b/gdb/gdbtk.c
index 50d8a5c..f1ee5fc 100644
--- a/gdb/gdbtk.c
+++ b/gdb/gdbtk.c
@@ -89,6 +89,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#endif
static int load_in_progress = 0;
+static int in_fputs = 0;
int gdbtk_load_hash PARAMS ((char *, unsigned long));
int (*ui_load_progress_hook) PARAMS ((char *, unsigned long));
@@ -318,22 +319,22 @@ gdbtk_fputs (ptr, stream)
const char *ptr;
FILE *stream;
{
+ char *merge[2], *command;
+ in_fputs = 1;
+
if (result_ptr)
Tcl_DStringAppend (result_ptr, (char *) ptr, -1);
else if (error_string_ptr != NULL && stream == gdb_stderr)
Tcl_DStringAppend (error_string_ptr, (char *) ptr, -1);
else
{
- Tcl_DString str;
-
- Tcl_DStringInit (&str);
-
- Tcl_DStringAppend (&str, "gdbtk_tcl_fputs", -1);
- Tcl_DStringAppendElement (&str, (char *)ptr);
-
- Tcl_Eval (interp, Tcl_DStringValue (&str));
- Tcl_DStringFree (&str);
+ merge[0] = "gdbtk_tcl_fputs";
+ merge[1] = (char *)ptr;
+ command = Tcl_Merge (2, merge);
+ Tcl_Eval (interp, command);
+ Tcl_Free (command);
}
+ in_fputs = 0;
}
static int
@@ -677,11 +678,12 @@ gdb_loc (clientData, interp, argc, argv)
if (sals.nelts != 1)
error ("Ambiguous line spec");
+
+ pc = sal.pc;
}
else
error ("wrong # args");
- pc = sal.pc;
if (sal.symtab)
Tcl_DStringAppendElement (result_ptr, sal.symtab->filename);
else
@@ -1075,7 +1077,7 @@ gdb_immediate_command (clientData, interp, argc, argv)
if (argc != 2)
error ("wrong # args");
- if (running_now)
+ if (running_now || load_in_progress)
return TCL_OK;
Tcl_DStringAppend (result_ptr, "", -1);
@@ -1106,7 +1108,7 @@ gdb_cmd (clientData, interp, argc, argv)
if (argc != 2)
error ("wrong # args");
- if (running_now)
+ if (running_now || load_in_progress)
return TCL_OK;
/* for the load instruction (and possibly others later) we
@@ -1370,6 +1372,14 @@ gdb_listfuncs (clientData, interp, argc, argv)
}
static int
+target_stop_wrapper (args)
+ char * args;
+{
+ target_stop ();
+ return 1;
+}
+
+static int
gdb_stop (clientData, interp, argc, argv)
ClientData clientData;
Tcl_Interp *interp;
@@ -1377,7 +1387,10 @@ gdb_stop (clientData, interp, argc, argv)
char *argv[];
{
if (target_stop)
- target_stop ();
+ {
+ catch_errors (target_stop_wrapper, NULL, "",
+ RETURN_MASK_ALL);
+ }
else
quit_flag = 1; /* hope something sees this */
@@ -1751,19 +1764,27 @@ static void
x_event (signo)
int signo;
{
+ static int in_x_event = 0;
+ static Tcl_Obj *varname = NULL;
+
+ if (in_x_event || in_fputs)
+ return;
+
+ in_x_event = 1;
+
/* Process pending events */
while (Tcl_DoOneEvent (TCL_DONT_WAIT|TCL_ALL_EVENTS) != 0)
;
-
- /* If we are doing a download, see if the download should be
- cancelled. FIXME: We should use a better variable name. */
if (load_in_progress)
{
- char *val;
-
- val = Tcl_GetVar (interp, "download_cancel_ok", TCL_GLOBAL_ONLY);
- if (val != NULL && atoi (val))
+ int val;
+ if (varname == NULL)
+ {
+ Tcl_Obj *varnamestrobj = Tcl_NewStringObj("download_cancel_ok",-1);
+ varname = Tcl_ObjGetVar2(interp,varnamestrobj,NULL,TCL_GLOBAL_ONLY);
+ }
+ if ((Tcl_GetIntFromObj(interp,varname,&val) == TCL_OK) && val)
{
quit_flag = 1;
#ifdef REQUEST_QUIT
@@ -1774,6 +1795,7 @@ x_event (signo)
#endif
}
}
+ in_x_event = 0;
}
#ifdef __CYGWIN32__
@@ -1782,55 +1804,51 @@ x_event (signo)
messages. FIXME: It would be better to not poll, but to instead
rewrite the target_wait routines to serve as input sources.
Unfortunately, that will be a lot of work. */
+static sigset_t nullsigmask;
+static struct sigaction act1, act2;
+static struct itimerval it_on, it_off;
static void
gdbtk_start_timer ()
{
- sigset_t nullsigmask;
- struct sigaction action;
- struct itimerval it;
+ static int first = 1;
+ /*TclDebug ("Starting timer....");*/
+ if (first)
+ {
+ /* first time called, set up all the structs */
+ first = 0;
+ sigemptyset (&nullsigmask);
- /*TclDebug ("Starting timer....");*/
- sigemptyset (&nullsigmask);
+ act1.sa_handler = x_event;
+ act1.sa_mask = nullsigmask;
+ act1.sa_flags = 0;
- action.sa_handler = x_event;
- action.sa_mask = nullsigmask;
- action.sa_flags = 0;
- sigaction (SIGALRM, &action, NULL);
-
- it.it_interval.tv_sec = 0;
- /* Check for messages twice a second. */
- it.it_interval.tv_usec = 500 * 1000;
- it.it_value.tv_sec = 0;
- it.it_value.tv_usec = 500 * 1000;
+ act2.sa_handler = SIG_IGN;
+ act2.sa_mask = nullsigmask;
+ act2.sa_flags = 0;
- setitimer (ITIMER_REAL, &it, NULL);
+ it_on.it_interval.tv_sec = 0;
+ it_on.it_interval.tv_usec = 500000; /* .5 sec */
+ it_on.it_value.tv_sec = 0;
+ it_on.it_value.tv_usec = 500000;
+ it_off.it_interval.tv_sec = 0;
+ it_off.it_interval.tv_usec = 0;
+ it_off.it_value.tv_sec = 0;
+ it_off.it_value.tv_usec = 0;
+ }
+ sigaction (SIGALRM, &act1, NULL);
+ setitimer (ITIMER_REAL, &it_on, NULL);
gdbtk_timer_going = 1;
}
static void
gdbtk_stop_timer ()
{
- sigset_t nullsigmask;
- struct sigaction action;
- struct itimerval it;
-
gdbtk_timer_going = 0;
-
/*TclDebug ("Stopping timer.");*/
- sigemptyset (&nullsigmask);
-
- action.sa_handler = SIG_IGN;
- action.sa_mask = nullsigmask;
- action.sa_flags = 0;
- sigaction (SIGALRM, &action, NULL);
-
- it.it_interval.tv_sec = 0;
- it.it_interval.tv_usec = 0;
- it.it_value.tv_sec = 0;
- it.it_value.tv_usec = 0;
- setitimer (ITIMER_REAL, &it, NULL);
+ setitimer (ITIMER_REAL, &it_off, NULL);
+ sigaction (SIGALRM, &act2, NULL);
}
#endif
@@ -1977,6 +1995,10 @@ gdbtk_init ( argv0 )
Tcl_FindExecutable (argv0);
interp = Tcl_CreateInterp ();
+#ifdef TCL_MEM_DEBUG
+ Tcl_InitMemory (interp);
+#endif
+
if (!interp)
error ("Tcl_CreateInterp failed");
@@ -3079,6 +3101,8 @@ gdb_loadfile (clientData, interp, objc, objv)
symtab = full_lookup_symtab (file);
if (!symtab)
{
+ sprintf(msg, "File not found");
+ Tcl_SetStringObj ( Tcl_GetObjResult (interp), msg, -1);
fclose (fp);
return TCL_ERROR;
}
@@ -3145,14 +3169,14 @@ gdb_loadfile (clientData, interp, objc, objv)
if (ltable[ln >> 3] & (1 << (ln % 8)))
a[0]->length = sprintf (buf,"%s insert end {-\t%d} break_tag", widget, ln);
else
- a[0]->length = sprintf (buf,"%s insert end {\t%d} \"\"", widget, ln);
+ a[0]->length = sprintf (buf,"%s insert end { \t%d} \"\"", widget, ln);
}
else
{
if (ltable[ln >> 3] & (1 << (ln % 8)))
a[0]->length = sprintf (buf,"%s insert end {-\t} break_tag", widget);
else
- a[0]->length = sprintf (buf,"%s insert end {\t} \"\"", widget);
+ a[0]->length = sprintf (buf,"%s insert end { \t} \"\"", widget);
}
b[0]->length = strlen(b[0]->bytes);
Tcl_SetListObj(a[1],2,b);