*** empty log message ***
[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
104c1213
JM
114#endif
115
116#if WITH_GDB_EVENTS
ed9a39eb 117struct gdb_events *
104c1213
JM
118set_gdb_event_hooks (struct gdb_events *vector)
119{
ed9a39eb 120 struct gdb_events *old_events = current_event_hooks;
104c1213
JM
121 if (vector == NULL)
122 current_event_hooks = &queue_event_hooks;
123 else
124 current_event_hooks = vector;
ed9a39eb 125 return old_events;
104c1213
JM
126}
127#endif
128
129enum gdb_event
afbfc876
AC
130{
131 breakpoint_create,
132 breakpoint_delete,
133 breakpoint_modify,
ba9fe036
KS
134 tracepoint_create,
135 tracepoint_delete,
136 tracepoint_modify,
afbfc876
AC
137 nr_gdb_events
138};
104c1213
JM
139
140struct breakpoint_create
141 {
142 int b;
143 };
144
145struct breakpoint_delete
146 {
147 int b;
148 };
149
150struct breakpoint_modify
151 {
152 int b;
153 };
154
ba9fe036
KS
155struct tracepoint_create
156 {
157 int number;
158 };
159
160struct tracepoint_delete
161 {
162 int number;
163 };
164
165struct tracepoint_modify
166 {
167 int number;
168 };
169
104c1213
JM
170struct event
171 {
172 enum gdb_event type;
173 struct event *next;
174 union
175 {
afbfc876
AC
176 struct breakpoint_create breakpoint_create;
177 struct breakpoint_delete breakpoint_delete;
178 struct breakpoint_modify breakpoint_modify;
ba9fe036
KS
179 struct tracepoint_create tracepoint_create;
180 struct tracepoint_delete tracepoint_delete;
181 struct tracepoint_modify tracepoint_modify;
104c1213
JM
182 }
183 data;
184 };
185struct event *pending_events;
186struct event *delivering_events;
187
188static void
189append (struct event *new_event)
190{
191 struct event **event = &pending_events;
192 while ((*event) != NULL)
193 event = &((*event)->next);
194 (*event) = new_event;
195 (*event)->next = NULL;
196}
197
198static void
199queue_breakpoint_create (int b)
200{
201 struct event *event = XMALLOC (struct event);
202 event->type = breakpoint_create;
203 event->data.breakpoint_create.b = b;
204 append (event);
205}
206
207static void
208queue_breakpoint_delete (int b)
209{
210 struct event *event = XMALLOC (struct event);
211 event->type = breakpoint_delete;
212 event->data.breakpoint_delete.b = b;
213 append (event);
214}
215
216static void
217queue_breakpoint_modify (int b)
218{
219 struct event *event = XMALLOC (struct event);
220 event->type = breakpoint_modify;
221 event->data.breakpoint_modify.b = b;
222 append (event);
223}
224
ba9fe036
KS
225static void
226queue_tracepoint_create (int number)
227{
228 struct event *event = XMALLOC (struct event);
229 event->type = tracepoint_create;
230 event->data.tracepoint_create.number = number;
231 append (event);
232}
233
234static void
235queue_tracepoint_delete (int number)
236{
237 struct event *event = XMALLOC (struct event);
238 event->type = tracepoint_delete;
239 event->data.tracepoint_delete.number = number;
240 append (event);
241}
242
243static void
244queue_tracepoint_modify (int number)
245{
246 struct event *event = XMALLOC (struct event);
247 event->type = tracepoint_modify;
248 event->data.tracepoint_modify.number = number;
249 append (event);
250}
251
104c1213
JM
252void
253gdb_events_deliver (struct gdb_events *vector)
254{
255 /* Just zap any events left around from last time. */
256 while (delivering_events != NULL)
257 {
258 struct event *event = delivering_events;
259 delivering_events = event->next;
b8c9b27d 260 xfree (event);
104c1213
JM
261 }
262 /* Process any pending events. Because one of the deliveries could
263 bail out we move everything off of the pending queue onto an
264 in-progress queue where it can, later, be cleaned up if
265 necessary. */
266 delivering_events = pending_events;
267 pending_events = NULL;
268 while (delivering_events != NULL)
269 {
270 struct event *event = delivering_events;
271 switch (event->type)
afbfc876
AC
272 {
273 case breakpoint_create:
274 vector->breakpoint_create
275 (event->data.breakpoint_create.b);
276 break;
277 case breakpoint_delete:
278 vector->breakpoint_delete
279 (event->data.breakpoint_delete.b);
280 break;
281 case breakpoint_modify:
282 vector->breakpoint_modify
283 (event->data.breakpoint_modify.b);
284 break;
ba9fe036
KS
285 case tracepoint_create:
286 vector->tracepoint_create
287 (event->data.tracepoint_create.number);
288 break;
289 case tracepoint_delete:
290 vector->tracepoint_delete
291 (event->data.tracepoint_delete.number);
292 break;
293 case tracepoint_modify:
294 vector->tracepoint_modify
295 (event->data.tracepoint_modify.number);
296 break;
afbfc876 297 }
104c1213 298 delivering_events = event->next;
b8c9b27d 299 xfree (event);
104c1213
JM
300 }
301}
302
303void _initialize_gdb_events (void);
304void
305_initialize_gdb_events (void)
306{
5d161b24 307 struct cmd_list_element *c;
104c1213
JM
308#if WITH_GDB_EVENTS
309 queue_event_hooks.breakpoint_create = queue_breakpoint_create;
310 queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
311 queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
ba9fe036
KS
312 queue_event_hooks.tracepoint_create = queue_tracepoint_create;
313 queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
314 queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
afbfc876 315#endif
5d161b24 316
afbfc876
AC
317 c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
318 (char *) (&gdb_events_debug), "Set event debugging.\n\
5d161b24 319When non-zero, event/notify debugging is enabled.", &setlist);
afbfc876
AC
320 deprecate_cmd (c, "set debug event");
321 deprecate_cmd (add_show_from_set (c, &showlist), "show debug event");
5d161b24
DB
322
323 add_show_from_set (add_set_cmd ("event",
afbfc876
AC
324 class_maintenance,
325 var_zinteger,
326 (char *) (&gdb_events_debug),
327 "Set event debugging.\n\
5d161b24 328When non-zero, event/notify debugging is enabled.", &setdebuglist),
afbfc876 329 &showdebuglist);
104c1213 330}
This page took 0.15619 seconds and 4 git commands to generate.