1b725ae77Skettenis /* User Interface Events.
2b725ae77Skettenis
3*11efff7fSkettenis Copyright 1999, 2001, 2002, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis Contributed by Cygnus Solutions.
6b725ae77Skettenis
7b725ae77Skettenis This file is part of GDB.
8b725ae77Skettenis
9b725ae77Skettenis This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis it under the terms of the GNU General Public License as published by
11b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis (at your option) any later version.
13b725ae77Skettenis
14b725ae77Skettenis This program is distributed in the hope that it will be useful,
15b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17b725ae77Skettenis GNU General Public License for more details.
18b725ae77Skettenis
19b725ae77Skettenis You should have received a copy of the GNU General Public License
20b725ae77Skettenis along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22b725ae77Skettenis
23b725ae77Skettenis /* Work in progress */
24b725ae77Skettenis
25b725ae77Skettenis /* This file was created with the aid of ``gdb-events.sh''.
26b725ae77Skettenis
27b725ae77Skettenis The bourn shell script ``gdb-events.sh'' creates the files
28b725ae77Skettenis ``new-gdb-events.c'' and ``new-gdb-events.h and then compares
29b725ae77Skettenis them against the existing ``gdb-events.[hc]''. Any differences
30b725ae77Skettenis found being reported.
31b725ae77Skettenis
32b725ae77Skettenis If editing this file, please also run gdb-events.sh and merge any
33b725ae77Skettenis changes into that script. Conversely, when making sweeping changes
34b725ae77Skettenis to this file, modifying gdb-events.sh and using its output may
35b725ae77Skettenis prove easier. */
36b725ae77Skettenis
37b725ae77Skettenis
38b725ae77Skettenis #include "defs.h"
39b725ae77Skettenis #include "gdb-events.h"
40b725ae77Skettenis #include "gdbcmd.h"
41b725ae77Skettenis
42b725ae77Skettenis static struct gdb_events null_event_hooks;
43b725ae77Skettenis static struct gdb_events queue_event_hooks;
44b725ae77Skettenis static struct gdb_events *current_event_hooks = &null_event_hooks;
45b725ae77Skettenis
46b725ae77Skettenis int gdb_events_debug;
47b725ae77Skettenis
48b725ae77Skettenis void
breakpoint_create_event(int b)49b725ae77Skettenis breakpoint_create_event (int b)
50b725ae77Skettenis {
51b725ae77Skettenis if (gdb_events_debug)
52b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "breakpoint_create_event\n");
53b725ae77Skettenis if (!current_event_hooks->breakpoint_create)
54b725ae77Skettenis return;
55b725ae77Skettenis current_event_hooks->breakpoint_create (b);
56b725ae77Skettenis }
57b725ae77Skettenis
58b725ae77Skettenis void
breakpoint_delete_event(int b)59b725ae77Skettenis breakpoint_delete_event (int b)
60b725ae77Skettenis {
61b725ae77Skettenis if (gdb_events_debug)
62b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "breakpoint_delete_event\n");
63b725ae77Skettenis if (!current_event_hooks->breakpoint_delete)
64b725ae77Skettenis return;
65b725ae77Skettenis current_event_hooks->breakpoint_delete (b);
66b725ae77Skettenis }
67b725ae77Skettenis
68b725ae77Skettenis void
breakpoint_modify_event(int b)69b725ae77Skettenis breakpoint_modify_event (int b)
70b725ae77Skettenis {
71b725ae77Skettenis if (gdb_events_debug)
72b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "breakpoint_modify_event\n");
73b725ae77Skettenis if (!current_event_hooks->breakpoint_modify)
74b725ae77Skettenis return;
75b725ae77Skettenis current_event_hooks->breakpoint_modify (b);
76b725ae77Skettenis }
77b725ae77Skettenis
78b725ae77Skettenis void
tracepoint_create_event(int number)79b725ae77Skettenis tracepoint_create_event (int number)
80b725ae77Skettenis {
81b725ae77Skettenis if (gdb_events_debug)
82b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "tracepoint_create_event\n");
83b725ae77Skettenis if (!current_event_hooks->tracepoint_create)
84b725ae77Skettenis return;
85b725ae77Skettenis current_event_hooks->tracepoint_create (number);
86b725ae77Skettenis }
87b725ae77Skettenis
88b725ae77Skettenis void
tracepoint_delete_event(int number)89b725ae77Skettenis tracepoint_delete_event (int number)
90b725ae77Skettenis {
91b725ae77Skettenis if (gdb_events_debug)
92b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "tracepoint_delete_event\n");
93b725ae77Skettenis if (!current_event_hooks->tracepoint_delete)
94b725ae77Skettenis return;
95b725ae77Skettenis current_event_hooks->tracepoint_delete (number);
96b725ae77Skettenis }
97b725ae77Skettenis
98b725ae77Skettenis void
tracepoint_modify_event(int number)99b725ae77Skettenis tracepoint_modify_event (int number)
100b725ae77Skettenis {
101b725ae77Skettenis if (gdb_events_debug)
102b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "tracepoint_modify_event\n");
103b725ae77Skettenis if (!current_event_hooks->tracepoint_modify)
104b725ae77Skettenis return;
105b725ae77Skettenis current_event_hooks->tracepoint_modify (number);
106b725ae77Skettenis }
107b725ae77Skettenis
108b725ae77Skettenis void
architecture_changed_event(void)109b725ae77Skettenis architecture_changed_event (void)
110b725ae77Skettenis {
111b725ae77Skettenis if (gdb_events_debug)
112b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "architecture_changed_event\n");
113b725ae77Skettenis if (!current_event_hooks->architecture_changed)
114b725ae77Skettenis return;
115b725ae77Skettenis current_event_hooks->architecture_changed ();
116b725ae77Skettenis }
117b725ae77Skettenis
118b725ae77Skettenis struct gdb_events *
deprecated_set_gdb_event_hooks(struct gdb_events * vector)119*11efff7fSkettenis deprecated_set_gdb_event_hooks (struct gdb_events *vector)
120b725ae77Skettenis {
121b725ae77Skettenis struct gdb_events *old_events = current_event_hooks;
122b725ae77Skettenis if (vector == NULL)
123b725ae77Skettenis current_event_hooks = &queue_event_hooks;
124b725ae77Skettenis else
125b725ae77Skettenis current_event_hooks = vector;
126b725ae77Skettenis return old_events;
127b725ae77Skettenis }
128b725ae77Skettenis
129b725ae77Skettenis void
clear_gdb_event_hooks(void)130b725ae77Skettenis clear_gdb_event_hooks (void)
131b725ae77Skettenis {
132*11efff7fSkettenis deprecated_set_gdb_event_hooks (&null_event_hooks);
133b725ae77Skettenis }
134b725ae77Skettenis
135b725ae77Skettenis enum gdb_event
136b725ae77Skettenis {
137b725ae77Skettenis breakpoint_create,
138b725ae77Skettenis breakpoint_delete,
139b725ae77Skettenis breakpoint_modify,
140b725ae77Skettenis tracepoint_create,
141b725ae77Skettenis tracepoint_delete,
142b725ae77Skettenis tracepoint_modify,
143b725ae77Skettenis architecture_changed,
144b725ae77Skettenis nr_gdb_events
145b725ae77Skettenis };
146b725ae77Skettenis
147b725ae77Skettenis struct breakpoint_create
148b725ae77Skettenis {
149b725ae77Skettenis int b;
150b725ae77Skettenis };
151b725ae77Skettenis
152b725ae77Skettenis struct breakpoint_delete
153b725ae77Skettenis {
154b725ae77Skettenis int b;
155b725ae77Skettenis };
156b725ae77Skettenis
157b725ae77Skettenis struct breakpoint_modify
158b725ae77Skettenis {
159b725ae77Skettenis int b;
160b725ae77Skettenis };
161b725ae77Skettenis
162b725ae77Skettenis struct tracepoint_create
163b725ae77Skettenis {
164b725ae77Skettenis int number;
165b725ae77Skettenis };
166b725ae77Skettenis
167b725ae77Skettenis struct tracepoint_delete
168b725ae77Skettenis {
169b725ae77Skettenis int number;
170b725ae77Skettenis };
171b725ae77Skettenis
172b725ae77Skettenis struct tracepoint_modify
173b725ae77Skettenis {
174b725ae77Skettenis int number;
175b725ae77Skettenis };
176b725ae77Skettenis
177b725ae77Skettenis struct event
178b725ae77Skettenis {
179b725ae77Skettenis enum gdb_event type;
180b725ae77Skettenis struct event *next;
181b725ae77Skettenis union
182b725ae77Skettenis {
183b725ae77Skettenis struct breakpoint_create breakpoint_create;
184b725ae77Skettenis struct breakpoint_delete breakpoint_delete;
185b725ae77Skettenis struct breakpoint_modify breakpoint_modify;
186b725ae77Skettenis struct tracepoint_create tracepoint_create;
187b725ae77Skettenis struct tracepoint_delete tracepoint_delete;
188b725ae77Skettenis struct tracepoint_modify tracepoint_modify;
189b725ae77Skettenis }
190b725ae77Skettenis data;
191b725ae77Skettenis };
192b725ae77Skettenis struct event *pending_events;
193b725ae77Skettenis struct event *delivering_events;
194b725ae77Skettenis
195b725ae77Skettenis static void
append(struct event * new_event)196b725ae77Skettenis append (struct event *new_event)
197b725ae77Skettenis {
198b725ae77Skettenis struct event **event = &pending_events;
199b725ae77Skettenis while ((*event) != NULL)
200b725ae77Skettenis event = &((*event)->next);
201b725ae77Skettenis (*event) = new_event;
202b725ae77Skettenis (*event)->next = NULL;
203b725ae77Skettenis }
204b725ae77Skettenis
205b725ae77Skettenis static void
queue_breakpoint_create(int b)206b725ae77Skettenis queue_breakpoint_create (int b)
207b725ae77Skettenis {
208b725ae77Skettenis struct event *event = XMALLOC (struct event);
209b725ae77Skettenis event->type = breakpoint_create;
210b725ae77Skettenis event->data.breakpoint_create.b = b;
211b725ae77Skettenis append (event);
212b725ae77Skettenis }
213b725ae77Skettenis
214b725ae77Skettenis static void
queue_breakpoint_delete(int b)215b725ae77Skettenis queue_breakpoint_delete (int b)
216b725ae77Skettenis {
217b725ae77Skettenis struct event *event = XMALLOC (struct event);
218b725ae77Skettenis event->type = breakpoint_delete;
219b725ae77Skettenis event->data.breakpoint_delete.b = b;
220b725ae77Skettenis append (event);
221b725ae77Skettenis }
222b725ae77Skettenis
223b725ae77Skettenis static void
queue_breakpoint_modify(int b)224b725ae77Skettenis queue_breakpoint_modify (int b)
225b725ae77Skettenis {
226b725ae77Skettenis struct event *event = XMALLOC (struct event);
227b725ae77Skettenis event->type = breakpoint_modify;
228b725ae77Skettenis event->data.breakpoint_modify.b = b;
229b725ae77Skettenis append (event);
230b725ae77Skettenis }
231b725ae77Skettenis
232b725ae77Skettenis static void
queue_tracepoint_create(int number)233b725ae77Skettenis queue_tracepoint_create (int number)
234b725ae77Skettenis {
235b725ae77Skettenis struct event *event = XMALLOC (struct event);
236b725ae77Skettenis event->type = tracepoint_create;
237b725ae77Skettenis event->data.tracepoint_create.number = number;
238b725ae77Skettenis append (event);
239b725ae77Skettenis }
240b725ae77Skettenis
241b725ae77Skettenis static void
queue_tracepoint_delete(int number)242b725ae77Skettenis queue_tracepoint_delete (int number)
243b725ae77Skettenis {
244b725ae77Skettenis struct event *event = XMALLOC (struct event);
245b725ae77Skettenis event->type = tracepoint_delete;
246b725ae77Skettenis event->data.tracepoint_delete.number = number;
247b725ae77Skettenis append (event);
248b725ae77Skettenis }
249b725ae77Skettenis
250b725ae77Skettenis static void
queue_tracepoint_modify(int number)251b725ae77Skettenis queue_tracepoint_modify (int number)
252b725ae77Skettenis {
253b725ae77Skettenis struct event *event = XMALLOC (struct event);
254b725ae77Skettenis event->type = tracepoint_modify;
255b725ae77Skettenis event->data.tracepoint_modify.number = number;
256b725ae77Skettenis append (event);
257b725ae77Skettenis }
258b725ae77Skettenis
259b725ae77Skettenis static void
queue_architecture_changed(void)260b725ae77Skettenis queue_architecture_changed (void)
261b725ae77Skettenis {
262b725ae77Skettenis struct event *event = XMALLOC (struct event);
263b725ae77Skettenis event->type = architecture_changed;
264b725ae77Skettenis append (event);
265b725ae77Skettenis }
266b725ae77Skettenis
267b725ae77Skettenis void
gdb_events_deliver(struct gdb_events * vector)268b725ae77Skettenis gdb_events_deliver (struct gdb_events *vector)
269b725ae77Skettenis {
270b725ae77Skettenis /* Just zap any events left around from last time. */
271b725ae77Skettenis while (delivering_events != NULL)
272b725ae77Skettenis {
273b725ae77Skettenis struct event *event = delivering_events;
274b725ae77Skettenis delivering_events = event->next;
275b725ae77Skettenis xfree (event);
276b725ae77Skettenis }
277b725ae77Skettenis /* Process any pending events. Because one of the deliveries could
278b725ae77Skettenis bail out we move everything off of the pending queue onto an
279b725ae77Skettenis in-progress queue where it can, later, be cleaned up if
280b725ae77Skettenis necessary. */
281b725ae77Skettenis delivering_events = pending_events;
282b725ae77Skettenis pending_events = NULL;
283b725ae77Skettenis while (delivering_events != NULL)
284b725ae77Skettenis {
285b725ae77Skettenis struct event *event = delivering_events;
286b725ae77Skettenis switch (event->type)
287b725ae77Skettenis {
288b725ae77Skettenis case breakpoint_create:
289b725ae77Skettenis vector->breakpoint_create
290b725ae77Skettenis (event->data.breakpoint_create.b);
291b725ae77Skettenis break;
292b725ae77Skettenis case breakpoint_delete:
293b725ae77Skettenis vector->breakpoint_delete
294b725ae77Skettenis (event->data.breakpoint_delete.b);
295b725ae77Skettenis break;
296b725ae77Skettenis case breakpoint_modify:
297b725ae77Skettenis vector->breakpoint_modify
298b725ae77Skettenis (event->data.breakpoint_modify.b);
299b725ae77Skettenis break;
300b725ae77Skettenis case tracepoint_create:
301b725ae77Skettenis vector->tracepoint_create
302b725ae77Skettenis (event->data.tracepoint_create.number);
303b725ae77Skettenis break;
304b725ae77Skettenis case tracepoint_delete:
305b725ae77Skettenis vector->tracepoint_delete
306b725ae77Skettenis (event->data.tracepoint_delete.number);
307b725ae77Skettenis break;
308b725ae77Skettenis case tracepoint_modify:
309b725ae77Skettenis vector->tracepoint_modify
310b725ae77Skettenis (event->data.tracepoint_modify.number);
311b725ae77Skettenis break;
312b725ae77Skettenis case architecture_changed:
313b725ae77Skettenis vector->architecture_changed ();
314b725ae77Skettenis break;
315b725ae77Skettenis }
316b725ae77Skettenis delivering_events = event->next;
317b725ae77Skettenis xfree (event);
318b725ae77Skettenis }
319b725ae77Skettenis }
320b725ae77Skettenis
321b725ae77Skettenis void _initialize_gdb_events (void);
322b725ae77Skettenis void
_initialize_gdb_events(void)323b725ae77Skettenis _initialize_gdb_events (void)
324b725ae77Skettenis {
325b725ae77Skettenis struct cmd_list_element *c;
326b725ae77Skettenis queue_event_hooks.breakpoint_create = queue_breakpoint_create;
327b725ae77Skettenis queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
328b725ae77Skettenis queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
329b725ae77Skettenis queue_event_hooks.tracepoint_create = queue_tracepoint_create;
330b725ae77Skettenis queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
331b725ae77Skettenis queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
332b725ae77Skettenis queue_event_hooks.architecture_changed = queue_architecture_changed;
333b725ae77Skettenis
334b725ae77Skettenis c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
335b725ae77Skettenis (char *) (&gdb_events_debug), "Set event debugging.\n\
336b725ae77Skettenis When non-zero, event/notify debugging is enabled.", &setlist);
337b725ae77Skettenis deprecate_cmd (c, "set debug event");
338*11efff7fSkettenis deprecate_cmd (deprecated_add_show_from_set (c, &showlist),
339*11efff7fSkettenis "show debug event");
340b725ae77Skettenis
341*11efff7fSkettenis deprecated_add_show_from_set
342*11efff7fSkettenis (add_set_cmd ("event",
343b725ae77Skettenis class_maintenance,
344b725ae77Skettenis var_zinteger,
345b725ae77Skettenis (char *) (&gdb_events_debug),
346b725ae77Skettenis "Set event debugging.\n\
347b725ae77Skettenis When non-zero, event/notify debugging is enabled.", &setdebuglist),
348b725ae77Skettenis &showdebuglist);
349b725ae77Skettenis }
350