2002-08-14 Michael Snyder <msnyder@redhat.com>
[deliverable/binutils-gdb.git] / gdb / gdb-events.c
1 /* User Interface Events.
2
3 Copyright 1999, 2001, 2002 Free Software Foundation, Inc.
4
5 Contributed by Cygnus Solutions.
6
7 This file is part of GDB.
8
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.
13
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.
18
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. */
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
42 #if WITH_GDB_EVENTS
43 static struct gdb_events null_event_hooks;
44 static struct gdb_events queue_event_hooks;
45 static struct gdb_events *current_event_hooks = &null_event_hooks;
46 #endif
47
48 int gdb_events_debug;
49
50 #if WITH_GDB_EVENTS
51
52 void
53 breakpoint_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
62 void
63 breakpoint_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
72 void
73 breakpoint_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
82 void
83 tracepoint_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
92 void
93 tracepoint_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
102 void
103 tracepoint_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
112 void
113 architecture_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
122 #endif
123
124 #if WITH_GDB_EVENTS
125 struct gdb_events *
126 set_gdb_event_hooks (struct gdb_events *vector)
127 {
128 struct gdb_events *old_events = current_event_hooks;
129 if (vector == NULL)
130 current_event_hooks = &queue_event_hooks;
131 else
132 current_event_hooks = vector;
133 return old_events;
134 }
135 #endif
136
137 #if WITH_GDB_EVENTS
138 void
139 clear_gdb_event_hooks (void)
140 {
141 set_gdb_event_hooks (&null_event_hooks);
142 }
143 #endif
144
145 enum gdb_event
146 {
147 breakpoint_create,
148 breakpoint_delete,
149 breakpoint_modify,
150 tracepoint_create,
151 tracepoint_delete,
152 tracepoint_modify,
153 architecture_changed,
154 nr_gdb_events
155 };
156
157 struct breakpoint_create
158 {
159 int b;
160 };
161
162 struct breakpoint_delete
163 {
164 int b;
165 };
166
167 struct breakpoint_modify
168 {
169 int b;
170 };
171
172 struct tracepoint_create
173 {
174 int number;
175 };
176
177 struct tracepoint_delete
178 {
179 int number;
180 };
181
182 struct tracepoint_modify
183 {
184 int number;
185 };
186
187 struct event
188 {
189 enum gdb_event type;
190 struct event *next;
191 union
192 {
193 struct breakpoint_create breakpoint_create;
194 struct breakpoint_delete breakpoint_delete;
195 struct breakpoint_modify breakpoint_modify;
196 struct tracepoint_create tracepoint_create;
197 struct tracepoint_delete tracepoint_delete;
198 struct tracepoint_modify tracepoint_modify;
199 }
200 data;
201 };
202 struct event *pending_events;
203 struct event *delivering_events;
204
205 static void
206 append (struct event *new_event)
207 {
208 struct event **event = &pending_events;
209 while ((*event) != NULL)
210 event = &((*event)->next);
211 (*event) = new_event;
212 (*event)->next = NULL;
213 }
214
215 static void
216 queue_breakpoint_create (int b)
217 {
218 struct event *event = XMALLOC (struct event);
219 event->type = breakpoint_create;
220 event->data.breakpoint_create.b = b;
221 append (event);
222 }
223
224 static void
225 queue_breakpoint_delete (int b)
226 {
227 struct event *event = XMALLOC (struct event);
228 event->type = breakpoint_delete;
229 event->data.breakpoint_delete.b = b;
230 append (event);
231 }
232
233 static void
234 queue_breakpoint_modify (int b)
235 {
236 struct event *event = XMALLOC (struct event);
237 event->type = breakpoint_modify;
238 event->data.breakpoint_modify.b = b;
239 append (event);
240 }
241
242 static void
243 queue_tracepoint_create (int number)
244 {
245 struct event *event = XMALLOC (struct event);
246 event->type = tracepoint_create;
247 event->data.tracepoint_create.number = number;
248 append (event);
249 }
250
251 static void
252 queue_tracepoint_delete (int number)
253 {
254 struct event *event = XMALLOC (struct event);
255 event->type = tracepoint_delete;
256 event->data.tracepoint_delete.number = number;
257 append (event);
258 }
259
260 static void
261 queue_tracepoint_modify (int number)
262 {
263 struct event *event = XMALLOC (struct event);
264 event->type = tracepoint_modify;
265 event->data.tracepoint_modify.number = number;
266 append (event);
267 }
268
269 static void
270 queue_architecture_changed (void)
271 {
272 struct event *event = XMALLOC (struct event);
273 event->type = architecture_changed;
274 append (event);
275 }
276
277 void
278 gdb_events_deliver (struct gdb_events *vector)
279 {
280 /* Just zap any events left around from last time. */
281 while (delivering_events != NULL)
282 {
283 struct event *event = delivering_events;
284 delivering_events = event->next;
285 xfree (event);
286 }
287 /* Process any pending events. Because one of the deliveries could
288 bail out we move everything off of the pending queue onto an
289 in-progress queue where it can, later, be cleaned up if
290 necessary. */
291 delivering_events = pending_events;
292 pending_events = NULL;
293 while (delivering_events != NULL)
294 {
295 struct event *event = delivering_events;
296 switch (event->type)
297 {
298 case breakpoint_create:
299 vector->breakpoint_create
300 (event->data.breakpoint_create.b);
301 break;
302 case breakpoint_delete:
303 vector->breakpoint_delete
304 (event->data.breakpoint_delete.b);
305 break;
306 case breakpoint_modify:
307 vector->breakpoint_modify
308 (event->data.breakpoint_modify.b);
309 break;
310 case tracepoint_create:
311 vector->tracepoint_create
312 (event->data.tracepoint_create.number);
313 break;
314 case tracepoint_delete:
315 vector->tracepoint_delete
316 (event->data.tracepoint_delete.number);
317 break;
318 case tracepoint_modify:
319 vector->tracepoint_modify
320 (event->data.tracepoint_modify.number);
321 break;
322 case architecture_changed:
323 vector->architecture_changed ();
324 break;
325 }
326 delivering_events = event->next;
327 xfree (event);
328 }
329 }
330
331 void _initialize_gdb_events (void);
332 void
333 _initialize_gdb_events (void)
334 {
335 struct cmd_list_element *c;
336 #if WITH_GDB_EVENTS
337 queue_event_hooks.breakpoint_create = queue_breakpoint_create;
338 queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
339 queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
340 queue_event_hooks.tracepoint_create = queue_tracepoint_create;
341 queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
342 queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
343 queue_event_hooks.architecture_changed = queue_architecture_changed;
344 #endif
345
346 c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
347 (char *) (&gdb_events_debug), "Set event debugging.\n\
348 When non-zero, event/notify debugging is enabled.", &setlist);
349 deprecate_cmd (c, "set debug event");
350 deprecate_cmd (add_show_from_set (c, &showlist), "show debug event");
351
352 add_show_from_set (add_set_cmd ("event",
353 class_maintenance,
354 var_zinteger,
355 (char *) (&gdb_events_debug),
356 "Set event debugging.\n\
357 When non-zero, event/notify debugging is enabled.", &setdebuglist),
358 &showdebuglist);
359 }
This page took 0.03907 seconds and 4 git commands to generate.