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