2004-04-29 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / gdb-events.c
CommitLineData
104c1213 1/* User Interface Events.
349c5d5f 2
711cc5cd 3 Copyright 1999, 2001, 2002, 2004 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
42static struct gdb_events null_event_hooks;
43static struct gdb_events queue_event_hooks;
44static struct gdb_events *current_event_hooks = &null_event_hooks;
104c1213
JM
45
46int gdb_events_debug;
47
104c1213
JM
48void
49breakpoint_create_event (int b)
50{
51 if (gdb_events_debug)
52 fprintf_unfiltered (gdb_stdlog, "breakpoint_create_event\n");
53 if (!current_event_hooks->breakpoint_create)
54 return;
55 current_event_hooks->breakpoint_create (b);
56}
57
58void
59breakpoint_delete_event (int b)
60{
61 if (gdb_events_debug)
62 fprintf_unfiltered (gdb_stdlog, "breakpoint_delete_event\n");
63 if (!current_event_hooks->breakpoint_delete)
64 return;
65 current_event_hooks->breakpoint_delete (b);
66}
67
68void
69breakpoint_modify_event (int b)
70{
71 if (gdb_events_debug)
72 fprintf_unfiltered (gdb_stdlog, "breakpoint_modify_event\n");
73 if (!current_event_hooks->breakpoint_modify)
74 return;
75 current_event_hooks->breakpoint_modify (b);
76}
77
ba9fe036
KS
78void
79tracepoint_create_event (int number)
80{
81 if (gdb_events_debug)
82 fprintf_unfiltered (gdb_stdlog, "tracepoint_create_event\n");
83 if (!current_event_hooks->tracepoint_create)
84 return;
85 current_event_hooks->tracepoint_create (number);
86}
87
88void
89tracepoint_delete_event (int number)
90{
91 if (gdb_events_debug)
92 fprintf_unfiltered (gdb_stdlog, "tracepoint_delete_event\n");
93 if (!current_event_hooks->tracepoint_delete)
94 return;
95 current_event_hooks->tracepoint_delete (number);
96}
97
98void
99tracepoint_modify_event (int number)
100{
101 if (gdb_events_debug)
102 fprintf_unfiltered (gdb_stdlog, "tracepoint_modify_event\n");
103 if (!current_event_hooks->tracepoint_modify)
104 return;
105 current_event_hooks->tracepoint_modify (number);
106}
107
67c2c32c
KS
108void
109architecture_changed_event (void)
110{
111 if (gdb_events_debug)
112 fprintf_unfiltered (gdb_stdlog, "architecture_changed_event\n");
113 if (!current_event_hooks->architecture_changed)
114 return;
115 current_event_hooks->architecture_changed ();
116}
117
e23792cc
KS
118void
119target_changed_event (void)
120{
121 if (gdb_events_debug)
122 fprintf_unfiltered (gdb_stdlog, "target_changed_event\n");
123 if (!current_event_hooks->target_changed)
124 return;
125 current_event_hooks->target_changed ();
126}
127
55970da6
KS
128void
129selected_frame_level_changed_event (int level)
130{
131 if (gdb_events_debug)
132 fprintf_unfiltered (gdb_stdlog, "selected_frame_level_changed_event\n");
133 if (!current_event_hooks->selected_frame_level_changed)
134 return;
135 current_event_hooks->selected_frame_level_changed (level);
136}
137
28ee05e9
KS
138void
139selected_thread_changed_event (int thread_num)
140{
141 if (gdb_events_debug)
142 fprintf_unfiltered (gdb_stdlog, "selected_thread_changed_event\n");
143 if (!current_event_hooks->selected_thread_changed)
144 return;
145 current_event_hooks->selected_thread_changed (thread_num);
146}
147
ed9a39eb 148struct gdb_events *
104c1213
JM
149set_gdb_event_hooks (struct gdb_events *vector)
150{
ed9a39eb 151 struct gdb_events *old_events = current_event_hooks;
104c1213
JM
152 if (vector == NULL)
153 current_event_hooks = &queue_event_hooks;
154 else
155 current_event_hooks = vector;
ed9a39eb 156 return old_events;
104c1213 157}
104c1213 158
63d022e0
KS
159void
160clear_gdb_event_hooks (void)
161{
162 set_gdb_event_hooks (&null_event_hooks);
163}
63d022e0 164
104c1213 165enum gdb_event
afbfc876
AC
166{
167 breakpoint_create,
168 breakpoint_delete,
169 breakpoint_modify,
ba9fe036
KS
170 tracepoint_create,
171 tracepoint_delete,
172 tracepoint_modify,
67c2c32c 173 architecture_changed,
e23792cc 174 target_changed,
55970da6 175 selected_frame_level_changed,
28ee05e9 176 selected_thread_changed,
afbfc876
AC
177 nr_gdb_events
178};
104c1213
JM
179
180struct breakpoint_create
181 {
182 int b;
183 };
184
185struct breakpoint_delete
186 {
187 int b;
188 };
189
190struct breakpoint_modify
191 {
192 int b;
193 };
194
ba9fe036
KS
195struct tracepoint_create
196 {
197 int number;
198 };
199
200struct tracepoint_delete
201 {
202 int number;
203 };
204
205struct tracepoint_modify
206 {
207 int number;
208 };
209
55970da6
KS
210struct selected_frame_level_changed
211 {
212 int level;
213 };
214
28ee05e9
KS
215struct selected_thread_changed
216 {
217 int thread_num;
218 };
219
104c1213
JM
220struct event
221 {
222 enum gdb_event type;
223 struct event *next;
224 union
225 {
afbfc876
AC
226 struct breakpoint_create breakpoint_create;
227 struct breakpoint_delete breakpoint_delete;
228 struct breakpoint_modify breakpoint_modify;
ba9fe036
KS
229 struct tracepoint_create tracepoint_create;
230 struct tracepoint_delete tracepoint_delete;
231 struct tracepoint_modify tracepoint_modify;
55970da6 232 struct selected_frame_level_changed selected_frame_level_changed;
28ee05e9 233 struct selected_thread_changed selected_thread_changed;
104c1213
JM
234 }
235 data;
236 };
237struct event *pending_events;
238struct event *delivering_events;
239
240static void
241append (struct event *new_event)
242{
243 struct event **event = &pending_events;
244 while ((*event) != NULL)
245 event = &((*event)->next);
246 (*event) = new_event;
247 (*event)->next = NULL;
248}
249
250static void
251queue_breakpoint_create (int b)
252{
253 struct event *event = XMALLOC (struct event);
254 event->type = breakpoint_create;
255 event->data.breakpoint_create.b = b;
256 append (event);
257}
258
259static void
260queue_breakpoint_delete (int b)
261{
262 struct event *event = XMALLOC (struct event);
263 event->type = breakpoint_delete;
264 event->data.breakpoint_delete.b = b;
265 append (event);
266}
267
268static void
269queue_breakpoint_modify (int b)
270{
271 struct event *event = XMALLOC (struct event);
272 event->type = breakpoint_modify;
273 event->data.breakpoint_modify.b = b;
274 append (event);
275}
276
ba9fe036
KS
277static void
278queue_tracepoint_create (int number)
279{
280 struct event *event = XMALLOC (struct event);
281 event->type = tracepoint_create;
282 event->data.tracepoint_create.number = number;
283 append (event);
284}
285
286static void
287queue_tracepoint_delete (int number)
288{
289 struct event *event = XMALLOC (struct event);
290 event->type = tracepoint_delete;
291 event->data.tracepoint_delete.number = number;
292 append (event);
293}
294
295static void
296queue_tracepoint_modify (int number)
297{
298 struct event *event = XMALLOC (struct event);
299 event->type = tracepoint_modify;
300 event->data.tracepoint_modify.number = number;
301 append (event);
302}
303
67c2c32c
KS
304static void
305queue_architecture_changed (void)
306{
307 struct event *event = XMALLOC (struct event);
308 event->type = architecture_changed;
309 append (event);
310}
311
e23792cc
KS
312static void
313queue_target_changed (void)
314{
315 struct event *event = XMALLOC (struct event);
316 event->type = target_changed;
317 append (event);
318}
319
55970da6
KS
320static void
321queue_selected_frame_level_changed (int level)
322{
323 struct event *event = XMALLOC (struct event);
324 event->type = selected_frame_level_changed;
325 event->data.selected_frame_level_changed.level = level;
326 append (event);
327}
328
28ee05e9
KS
329static void
330queue_selected_thread_changed (int thread_num)
331{
332 struct event *event = XMALLOC (struct event);
333 event->type = selected_thread_changed;
334 event->data.selected_thread_changed.thread_num = thread_num;
335 append (event);
336}
337
104c1213
JM
338void
339gdb_events_deliver (struct gdb_events *vector)
340{
341 /* Just zap any events left around from last time. */
342 while (delivering_events != NULL)
343 {
344 struct event *event = delivering_events;
345 delivering_events = event->next;
b8c9b27d 346 xfree (event);
104c1213
JM
347 }
348 /* Process any pending events. Because one of the deliveries could
349 bail out we move everything off of the pending queue onto an
350 in-progress queue where it can, later, be cleaned up if
351 necessary. */
352 delivering_events = pending_events;
353 pending_events = NULL;
354 while (delivering_events != NULL)
355 {
356 struct event *event = delivering_events;
357 switch (event->type)
afbfc876
AC
358 {
359 case breakpoint_create:
360 vector->breakpoint_create
361 (event->data.breakpoint_create.b);
362 break;
363 case breakpoint_delete:
364 vector->breakpoint_delete
365 (event->data.breakpoint_delete.b);
366 break;
367 case breakpoint_modify:
368 vector->breakpoint_modify
369 (event->data.breakpoint_modify.b);
370 break;
ba9fe036
KS
371 case tracepoint_create:
372 vector->tracepoint_create
373 (event->data.tracepoint_create.number);
374 break;
375 case tracepoint_delete:
376 vector->tracepoint_delete
377 (event->data.tracepoint_delete.number);
378 break;
379 case tracepoint_modify:
380 vector->tracepoint_modify
381 (event->data.tracepoint_modify.number);
382 break;
67c2c32c
KS
383 case architecture_changed:
384 vector->architecture_changed ();
385 break;
e23792cc
KS
386 case target_changed:
387 vector->target_changed ();
388 break;
55970da6
KS
389 case selected_frame_level_changed:
390 vector->selected_frame_level_changed
391 (event->data.selected_frame_level_changed.level);
392 break;
28ee05e9
KS
393 case selected_thread_changed:
394 vector->selected_thread_changed
395 (event->data.selected_thread_changed.thread_num);
396 break;
afbfc876 397 }
104c1213 398 delivering_events = event->next;
b8c9b27d 399 xfree (event);
104c1213
JM
400 }
401}
402
403void _initialize_gdb_events (void);
404void
405_initialize_gdb_events (void)
406{
5d161b24 407 struct cmd_list_element *c;
104c1213
JM
408 queue_event_hooks.breakpoint_create = queue_breakpoint_create;
409 queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
410 queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
ba9fe036
KS
411 queue_event_hooks.tracepoint_create = queue_tracepoint_create;
412 queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
413 queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
67c2c32c 414 queue_event_hooks.architecture_changed = queue_architecture_changed;
e23792cc 415 queue_event_hooks.target_changed = queue_target_changed;
55970da6 416 queue_event_hooks.selected_frame_level_changed = queue_selected_frame_level_changed;
28ee05e9 417 queue_event_hooks.selected_thread_changed = queue_selected_thread_changed;
5d161b24 418
afbfc876
AC
419 c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
420 (char *) (&gdb_events_debug), "Set event debugging.\n\
5d161b24 421When non-zero, event/notify debugging is enabled.", &setlist);
afbfc876
AC
422 deprecate_cmd (c, "set debug event");
423 deprecate_cmd (add_show_from_set (c, &showlist), "show debug event");
5d161b24
DB
424
425 add_show_from_set (add_set_cmd ("event",
afbfc876
AC
426 class_maintenance,
427 var_zinteger,
428 (char *) (&gdb_events_debug),
429 "Set event debugging.\n\
5d161b24 430When non-zero, event/notify debugging is enabled.", &setdebuglist),
afbfc876 431 &showdebuglist);
104c1213 432}
This page took 0.369158 seconds and 4 git commands to generate.