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