/* User Interface Events.
- Copyright 1999 Free Software Foundation, Inc.
+
+ Copyright (C) 1999, 2001, 2002, 2004, 2005, 2007, 2008
+ Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Work in progress */
If editing this file, please also run gdb-events.sh and merge any
changes into that script. Conversely, when making sweeping changes
to this file, modifying gdb-events.sh and using its output may
- prove easier. */
+ prove easier. */
#include "defs.h"
#include "gdb-events.h"
#include "gdbcmd.h"
-#undef XMALLOC
-#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
-
-#if WITH_GDB_EVENTS
static struct gdb_events null_event_hooks;
static struct gdb_events queue_event_hooks;
static struct gdb_events *current_event_hooks = &null_event_hooks;
-#endif
int gdb_events_debug;
+static void
+show_gdb_events_debug (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("Event debugging is %s.\n"), value);
+}
-#if WITH_GDB_EVENTS
void
breakpoint_create_event (int b)
current_event_hooks->breakpoint_modify (b);
}
-#endif
+void
+tracepoint_create_event (int number)
+{
+ if (gdb_events_debug)
+ fprintf_unfiltered (gdb_stdlog, "tracepoint_create_event\n");
+ if (!current_event_hooks->tracepoint_create)
+ return;
+ current_event_hooks->tracepoint_create (number);
+}
+
+void
+tracepoint_delete_event (int number)
+{
+ if (gdb_events_debug)
+ fprintf_unfiltered (gdb_stdlog, "tracepoint_delete_event\n");
+ if (!current_event_hooks->tracepoint_delete)
+ return;
+ current_event_hooks->tracepoint_delete (number);
+}
+
+void
+tracepoint_modify_event (int number)
+{
+ if (gdb_events_debug)
+ fprintf_unfiltered (gdb_stdlog, "tracepoint_modify_event\n");
+ if (!current_event_hooks->tracepoint_modify)
+ return;
+ current_event_hooks->tracepoint_modify (number);
+}
+
+void
+architecture_changed_event (void)
+{
+ if (gdb_events_debug)
+ fprintf_unfiltered (gdb_stdlog, "architecture_changed_event\n");
+ if (!current_event_hooks->architecture_changed)
+ return;
+ current_event_hooks->architecture_changed ();
+}
-#if WITH_GDB_EVENTS
struct gdb_events *
-set_gdb_event_hooks (struct gdb_events *vector)
+deprecated_set_gdb_event_hooks (struct gdb_events *vector)
{
struct gdb_events *old_events = current_event_hooks;
if (vector == NULL)
current_event_hooks = vector;
return old_events;
}
-#endif
+
+void
+clear_gdb_event_hooks (void)
+{
+ deprecated_set_gdb_event_hooks (&null_event_hooks);
+}
enum gdb_event
{
breakpoint_create,
breakpoint_delete,
breakpoint_modify,
+ tracepoint_create,
+ tracepoint_delete,
+ tracepoint_modify,
+ architecture_changed,
nr_gdb_events
};
int b;
};
+struct tracepoint_create
+ {
+ int number;
+ };
+
+struct tracepoint_delete
+ {
+ int number;
+ };
+
+struct tracepoint_modify
+ {
+ int number;
+ };
+
struct event
{
enum gdb_event type;
struct breakpoint_create breakpoint_create;
struct breakpoint_delete breakpoint_delete;
struct breakpoint_modify breakpoint_modify;
+ struct tracepoint_create tracepoint_create;
+ struct tracepoint_delete tracepoint_delete;
+ struct tracepoint_modify tracepoint_modify;
}
data;
};
append (event);
}
+static void
+queue_tracepoint_create (int number)
+{
+ struct event *event = XMALLOC (struct event);
+ event->type = tracepoint_create;
+ event->data.tracepoint_create.number = number;
+ append (event);
+}
+
+static void
+queue_tracepoint_delete (int number)
+{
+ struct event *event = XMALLOC (struct event);
+ event->type = tracepoint_delete;
+ event->data.tracepoint_delete.number = number;
+ append (event);
+}
+
+static void
+queue_tracepoint_modify (int number)
+{
+ struct event *event = XMALLOC (struct event);
+ event->type = tracepoint_modify;
+ event->data.tracepoint_modify.number = number;
+ append (event);
+}
+
+static void
+queue_architecture_changed (void)
+{
+ struct event *event = XMALLOC (struct event);
+ event->type = architecture_changed;
+ append (event);
+}
+
void
gdb_events_deliver (struct gdb_events *vector)
{
{
struct event *event = delivering_events;
delivering_events = event->next;
- free (event);
+ xfree (event);
}
/* Process any pending events. Because one of the deliveries could
bail out we move everything off of the pending queue onto an
vector->breakpoint_modify
(event->data.breakpoint_modify.b);
break;
+ case tracepoint_create:
+ vector->tracepoint_create
+ (event->data.tracepoint_create.number);
+ break;
+ case tracepoint_delete:
+ vector->tracepoint_delete
+ (event->data.tracepoint_delete.number);
+ break;
+ case tracepoint_modify:
+ vector->tracepoint_modify
+ (event->data.tracepoint_modify.number);
+ break;
+ case architecture_changed:
+ vector->architecture_changed ();
+ break;
}
delivering_events = event->next;
- free (event);
+ xfree (event);
}
}
_initialize_gdb_events (void)
{
struct cmd_list_element *c;
-#if WITH_GDB_EVENTS
queue_event_hooks.breakpoint_create = queue_breakpoint_create;
queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
-#endif
-
- c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
- (char *) (&gdb_events_debug), "Set event debugging.\n\
-When non-zero, event/notify debugging is enabled.", &setlist);
- deprecate_cmd (c, "set debug event");
- deprecate_cmd (add_show_from_set (c, &showlist), "show debug event");
-
- add_show_from_set (add_set_cmd ("event",
- class_maintenance,
- var_zinteger,
- (char *) (&gdb_events_debug),
- "Set event debugging.\n\
-When non-zero, event/notify debugging is enabled.", &setdebuglist),
- &showdebuglist);
+ queue_event_hooks.tracepoint_create = queue_tracepoint_create;
+ queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
+ queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
+ queue_event_hooks.architecture_changed = queue_architecture_changed;
+
+ add_setshow_zinteger_cmd ("event", class_maintenance,
+ &gdb_events_debug, _("\
+Set event debugging."), _("\
+Show event debugging."), _("\
+When non-zero, event/notify debugging is enabled."),
+ NULL,
+ show_gdb_events_debug,
+ &setdebuglist, &showdebuglist);
}