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