xref: /openbsd-src/gnu/usr.bin/binutils/gdb/event-loop.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis /* Event loop machinery for GDB, the GNU debugger.
2*b725ae77Skettenis    Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3*b725ae77Skettenis    Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
4*b725ae77Skettenis 
5*b725ae77Skettenis    This file is part of GDB.
6*b725ae77Skettenis 
7*b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
8*b725ae77Skettenis    it under the terms of the GNU General Public License as published by
9*b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
10*b725ae77Skettenis    (at your option) any later version.
11*b725ae77Skettenis 
12*b725ae77Skettenis    This program is distributed in the hope that it will be useful,
13*b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*b725ae77Skettenis    GNU General Public License for more details.
16*b725ae77Skettenis 
17*b725ae77Skettenis    You should have received a copy of the GNU General Public License
18*b725ae77Skettenis    along with this program; if not, write to the Free Software
19*b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
20*b725ae77Skettenis    Boston, MA 02111-1307, USA. */
21*b725ae77Skettenis 
22*b725ae77Skettenis #include "defs.h"
23*b725ae77Skettenis #include "event-loop.h"
24*b725ae77Skettenis #include "event-top.h"
25*b725ae77Skettenis 
26*b725ae77Skettenis #ifdef HAVE_POLL
27*b725ae77Skettenis #if defined (HAVE_POLL_H)
28*b725ae77Skettenis #include <poll.h>
29*b725ae77Skettenis #elif defined (HAVE_SYS_POLL_H)
30*b725ae77Skettenis #include <sys/poll.h>
31*b725ae77Skettenis #endif
32*b725ae77Skettenis #endif
33*b725ae77Skettenis 
34*b725ae77Skettenis #include <sys/types.h>
35*b725ae77Skettenis #include "gdb_string.h"
36*b725ae77Skettenis #include <errno.h>
37*b725ae77Skettenis #include <sys/time.h>
38*b725ae77Skettenis 
39*b725ae77Skettenis typedef struct gdb_event gdb_event;
40*b725ae77Skettenis typedef void (event_handler_func) (int);
41*b725ae77Skettenis 
42*b725ae77Skettenis /* Event for the GDB event system.  Events are queued by calling
43*b725ae77Skettenis    async_queue_event and serviced later on by gdb_do_one_event. An
44*b725ae77Skettenis    event can be, for instance, a file descriptor becoming ready to be
45*b725ae77Skettenis    read. Servicing an event simply means that the procedure PROC will
46*b725ae77Skettenis    be called.  We have 2 queues, one for file handlers that we listen
47*b725ae77Skettenis    to in the event loop, and one for the file handlers+events that are
48*b725ae77Skettenis    ready. The procedure PROC associated with each event is always the
49*b725ae77Skettenis    same (handle_file_event).  Its duty is to invoke the handler
50*b725ae77Skettenis    associated with the file descriptor whose state change generated
51*b725ae77Skettenis    the event, plus doing other cleanups and such. */
52*b725ae77Skettenis 
53*b725ae77Skettenis struct gdb_event
54*b725ae77Skettenis   {
55*b725ae77Skettenis     event_handler_func *proc;	/* Procedure to call to service this event. */
56*b725ae77Skettenis     int fd;			/* File descriptor that is ready. */
57*b725ae77Skettenis     struct gdb_event *next_event;	/* Next in list of events or NULL. */
58*b725ae77Skettenis   };
59*b725ae77Skettenis 
60*b725ae77Skettenis /* Information about each file descriptor we register with the event
61*b725ae77Skettenis    loop. */
62*b725ae77Skettenis 
63*b725ae77Skettenis typedef struct file_handler
64*b725ae77Skettenis   {
65*b725ae77Skettenis     int fd;			/* File descriptor. */
66*b725ae77Skettenis     int mask;			/* Events we want to monitor: POLLIN, etc. */
67*b725ae77Skettenis     int ready_mask;		/* Events that have been seen since
68*b725ae77Skettenis 				   the last time. */
69*b725ae77Skettenis     handler_func *proc;		/* Procedure to call when fd is ready. */
70*b725ae77Skettenis     gdb_client_data client_data;	/* Argument to pass to proc. */
71*b725ae77Skettenis     int error;			/* Was an error detected on this fd? */
72*b725ae77Skettenis     struct file_handler *next_file;	/* Next registered file descriptor. */
73*b725ae77Skettenis   }
74*b725ae77Skettenis file_handler;
75*b725ae77Skettenis 
76*b725ae77Skettenis /* PROC is a function to be invoked when the READY flag is set. This
77*b725ae77Skettenis    happens when there has been a signal and the corresponding signal
78*b725ae77Skettenis    handler has 'triggered' this async_signal_handler for
79*b725ae77Skettenis    execution. The actual work to be done in response to a signal will
80*b725ae77Skettenis    be carried out by PROC at a later time, within process_event. This
81*b725ae77Skettenis    provides a deferred execution of signal handlers.
82*b725ae77Skettenis    Async_init_signals takes care of setting up such an
83*b725ae77Skettenis    asyn_signal_handler for each interesting signal. */
84*b725ae77Skettenis typedef struct async_signal_handler
85*b725ae77Skettenis   {
86*b725ae77Skettenis     int ready;			/* If ready, call this handler from the main event loop,
87*b725ae77Skettenis 				   using invoke_async_handler. */
88*b725ae77Skettenis     struct async_signal_handler *next_handler;	/* Ptr to next handler */
89*b725ae77Skettenis     sig_handler_func *proc;	/* Function to call to do the work */
90*b725ae77Skettenis     gdb_client_data client_data;	/* Argument to async_handler_func */
91*b725ae77Skettenis   }
92*b725ae77Skettenis async_signal_handler;
93*b725ae77Skettenis 
94*b725ae77Skettenis 
95*b725ae77Skettenis /* Event queue:
96*b725ae77Skettenis    - the first event in the queue is the head of the queue.
97*b725ae77Skettenis    It will be the next to be serviced.
98*b725ae77Skettenis    - the last event in the queue
99*b725ae77Skettenis 
100*b725ae77Skettenis    Events can be inserted at the front of the queue or at the end of
101*b725ae77Skettenis    the queue.  Events will be extracted from the queue for processing
102*b725ae77Skettenis    starting from the head.  Therefore, events inserted at the head of
103*b725ae77Skettenis    the queue will be processed in a last in first out fashion, while
104*b725ae77Skettenis    those inserted at the tail of the queue will be processed in a first
105*b725ae77Skettenis    in first out manner.  All the fields are NULL if the queue is
106*b725ae77Skettenis    empty. */
107*b725ae77Skettenis 
108*b725ae77Skettenis static struct
109*b725ae77Skettenis   {
110*b725ae77Skettenis     gdb_event *first_event;	/* First pending event */
111*b725ae77Skettenis     gdb_event *last_event;	/* Last pending event */
112*b725ae77Skettenis   }
113*b725ae77Skettenis event_queue;
114*b725ae77Skettenis 
115*b725ae77Skettenis /* Gdb_notifier is just a list of file descriptors gdb is interested in.
116*b725ae77Skettenis    These are the input file descriptor, and the target file
117*b725ae77Skettenis    descriptor. We have two flavors of the notifier, one for platforms
118*b725ae77Skettenis    that have the POLL function, the other for those that don't, and
119*b725ae77Skettenis    only support SELECT. Each of the elements in the gdb_notifier list is
120*b725ae77Skettenis    basically a description of what kind of events gdb is interested
121*b725ae77Skettenis    in, for each fd. */
122*b725ae77Skettenis 
123*b725ae77Skettenis /* As of 1999-04-30 only the input file descriptor is registered with the
124*b725ae77Skettenis    event loop. */
125*b725ae77Skettenis 
126*b725ae77Skettenis /* Do we use poll or select ? */
127*b725ae77Skettenis #ifdef HAVE_POLL
128*b725ae77Skettenis #define USE_POLL 1
129*b725ae77Skettenis #else
130*b725ae77Skettenis #define USE_POLL 0
131*b725ae77Skettenis #endif /* HAVE_POLL */
132*b725ae77Skettenis 
133*b725ae77Skettenis static unsigned char use_poll = USE_POLL;
134*b725ae77Skettenis 
135*b725ae77Skettenis static struct
136*b725ae77Skettenis   {
137*b725ae77Skettenis     /* Ptr to head of file handler list. */
138*b725ae77Skettenis     file_handler *first_file_handler;
139*b725ae77Skettenis 
140*b725ae77Skettenis #ifdef HAVE_POLL
141*b725ae77Skettenis     /* Ptr to array of pollfd structures. */
142*b725ae77Skettenis     struct pollfd *poll_fds;
143*b725ae77Skettenis 
144*b725ae77Skettenis     /* Timeout in milliseconds for calls to poll(). */
145*b725ae77Skettenis     int poll_timeout;
146*b725ae77Skettenis #endif
147*b725ae77Skettenis 
148*b725ae77Skettenis     /* Masks to be used in the next call to select.
149*b725ae77Skettenis        Bits are set in response to calls to create_file_handler. */
150*b725ae77Skettenis     fd_set check_masks[3];
151*b725ae77Skettenis 
152*b725ae77Skettenis     /* What file descriptors were found ready by select. */
153*b725ae77Skettenis     fd_set ready_masks[3];
154*b725ae77Skettenis 
155*b725ae77Skettenis     /* Number of file descriptors to monitor. (for poll) */
156*b725ae77Skettenis     /* Number of valid bits (highest fd value + 1). (for select) */
157*b725ae77Skettenis     int num_fds;
158*b725ae77Skettenis 
159*b725ae77Skettenis     /* Time structure for calls to select(). */
160*b725ae77Skettenis     struct timeval select_timeout;
161*b725ae77Skettenis 
162*b725ae77Skettenis     /* Flag to tell whether the timeout should be used. */
163*b725ae77Skettenis     int timeout_valid;
164*b725ae77Skettenis   }
165*b725ae77Skettenis gdb_notifier;
166*b725ae77Skettenis 
167*b725ae77Skettenis /* Structure associated with a timer. PROC will be executed at the
168*b725ae77Skettenis    first occasion after WHEN. */
169*b725ae77Skettenis struct gdb_timer
170*b725ae77Skettenis   {
171*b725ae77Skettenis     struct timeval when;
172*b725ae77Skettenis     int timer_id;
173*b725ae77Skettenis     struct gdb_timer *next;
174*b725ae77Skettenis     timer_handler_func *proc;	/* Function to call to do the work */
175*b725ae77Skettenis     gdb_client_data client_data;	/* Argument to async_handler_func */
176*b725ae77Skettenis   }
177*b725ae77Skettenis gdb_timer;
178*b725ae77Skettenis 
179*b725ae77Skettenis /* List of currently active timers. It is sorted in order of
180*b725ae77Skettenis    increasing timers. */
181*b725ae77Skettenis static struct
182*b725ae77Skettenis   {
183*b725ae77Skettenis     /* Pointer to first in timer list. */
184*b725ae77Skettenis     struct gdb_timer *first_timer;
185*b725ae77Skettenis 
186*b725ae77Skettenis     /* Id of the last timer created. */
187*b725ae77Skettenis     int num_timers;
188*b725ae77Skettenis   }
189*b725ae77Skettenis timer_list;
190*b725ae77Skettenis 
191*b725ae77Skettenis /* All the async_signal_handlers gdb is interested in are kept onto
192*b725ae77Skettenis    this list. */
193*b725ae77Skettenis static struct
194*b725ae77Skettenis   {
195*b725ae77Skettenis     /* Pointer to first in handler list. */
196*b725ae77Skettenis     async_signal_handler *first_handler;
197*b725ae77Skettenis 
198*b725ae77Skettenis     /* Pointer to last in handler list. */
199*b725ae77Skettenis     async_signal_handler *last_handler;
200*b725ae77Skettenis   }
201*b725ae77Skettenis sighandler_list;
202*b725ae77Skettenis 
203*b725ae77Skettenis /* Are any of the handlers ready?  Check this variable using
204*b725ae77Skettenis    check_async_ready. This is used by process_event, to determine
205*b725ae77Skettenis    whether or not to invoke the invoke_async_signal_handler
206*b725ae77Skettenis    function. */
207*b725ae77Skettenis static int async_handler_ready = 0;
208*b725ae77Skettenis 
209*b725ae77Skettenis static void create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data client_data);
210*b725ae77Skettenis static void invoke_async_signal_handler (void);
211*b725ae77Skettenis static void handle_file_event (int event_file_desc);
212*b725ae77Skettenis static int gdb_wait_for_event (void);
213*b725ae77Skettenis static int check_async_ready (void);
214*b725ae77Skettenis static void async_queue_event (gdb_event * event_ptr, queue_position position);
215*b725ae77Skettenis static gdb_event *create_file_event (int fd);
216*b725ae77Skettenis static int process_event (void);
217*b725ae77Skettenis static void handle_timer_event (int dummy);
218*b725ae77Skettenis static void poll_timers (void);
219*b725ae77Skettenis 
220*b725ae77Skettenis 
221*b725ae77Skettenis /* Insert an event object into the gdb event queue at
222*b725ae77Skettenis    the specified position.
223*b725ae77Skettenis    POSITION can be head or tail, with values TAIL, HEAD.
224*b725ae77Skettenis    EVENT_PTR points to the event to be inserted into the queue.
225*b725ae77Skettenis    The caller must allocate memory for the event. It is freed
226*b725ae77Skettenis    after the event has ben handled.
227*b725ae77Skettenis    Events in the queue will be processed head to tail, therefore,
228*b725ae77Skettenis    events inserted at the head of the queue will be processed
229*b725ae77Skettenis    as last in first out. Event appended at the tail of the queue
230*b725ae77Skettenis    will be processed first in first out. */
231*b725ae77Skettenis static void
async_queue_event(gdb_event * event_ptr,queue_position position)232*b725ae77Skettenis async_queue_event (gdb_event * event_ptr, queue_position position)
233*b725ae77Skettenis {
234*b725ae77Skettenis   if (position == TAIL)
235*b725ae77Skettenis     {
236*b725ae77Skettenis       /* The event will become the new last_event. */
237*b725ae77Skettenis 
238*b725ae77Skettenis       event_ptr->next_event = NULL;
239*b725ae77Skettenis       if (event_queue.first_event == NULL)
240*b725ae77Skettenis 	event_queue.first_event = event_ptr;
241*b725ae77Skettenis       else
242*b725ae77Skettenis 	event_queue.last_event->next_event = event_ptr;
243*b725ae77Skettenis       event_queue.last_event = event_ptr;
244*b725ae77Skettenis     }
245*b725ae77Skettenis   else if (position == HEAD)
246*b725ae77Skettenis     {
247*b725ae77Skettenis       /* The event becomes the new first_event. */
248*b725ae77Skettenis 
249*b725ae77Skettenis       event_ptr->next_event = event_queue.first_event;
250*b725ae77Skettenis       if (event_queue.first_event == NULL)
251*b725ae77Skettenis 	event_queue.last_event = event_ptr;
252*b725ae77Skettenis       event_queue.first_event = event_ptr;
253*b725ae77Skettenis     }
254*b725ae77Skettenis }
255*b725ae77Skettenis 
256*b725ae77Skettenis /* Create a file event, to be enqueued in the event queue for
257*b725ae77Skettenis    processing. The procedure associated to this event is always
258*b725ae77Skettenis    handle_file_event, which will in turn invoke the one that was
259*b725ae77Skettenis    associated to FD when it was registered with the event loop. */
260*b725ae77Skettenis static gdb_event *
create_file_event(int fd)261*b725ae77Skettenis create_file_event (int fd)
262*b725ae77Skettenis {
263*b725ae77Skettenis   gdb_event *file_event_ptr;
264*b725ae77Skettenis 
265*b725ae77Skettenis   file_event_ptr = (gdb_event *) xmalloc (sizeof (gdb_event));
266*b725ae77Skettenis   file_event_ptr->proc = handle_file_event;
267*b725ae77Skettenis   file_event_ptr->fd = fd;
268*b725ae77Skettenis   return (file_event_ptr);
269*b725ae77Skettenis }
270*b725ae77Skettenis 
271*b725ae77Skettenis /* Process one event.
272*b725ae77Skettenis    The event can be the next one to be serviced in the event queue,
273*b725ae77Skettenis    or an asynchronous event handler can be invoked in response to
274*b725ae77Skettenis    the reception of a signal.
275*b725ae77Skettenis    If an event was processed (either way), 1 is returned otherwise
276*b725ae77Skettenis    0 is returned.
277*b725ae77Skettenis    Scan the queue from head to tail, processing therefore the high
278*b725ae77Skettenis    priority events first, by invoking the associated event handler
279*b725ae77Skettenis    procedure. */
280*b725ae77Skettenis static int
process_event(void)281*b725ae77Skettenis process_event (void)
282*b725ae77Skettenis {
283*b725ae77Skettenis   gdb_event *event_ptr, *prev_ptr;
284*b725ae77Skettenis   event_handler_func *proc;
285*b725ae77Skettenis   int fd;
286*b725ae77Skettenis 
287*b725ae77Skettenis   /* First let's see if there are any asynchronous event handlers that
288*b725ae77Skettenis      are ready. These would be the result of invoking any of the
289*b725ae77Skettenis      signal handlers. */
290*b725ae77Skettenis 
291*b725ae77Skettenis   if (check_async_ready ())
292*b725ae77Skettenis     {
293*b725ae77Skettenis       invoke_async_signal_handler ();
294*b725ae77Skettenis       return 1;
295*b725ae77Skettenis     }
296*b725ae77Skettenis 
297*b725ae77Skettenis   /* Look in the event queue to find an event that is ready
298*b725ae77Skettenis      to be processed. */
299*b725ae77Skettenis 
300*b725ae77Skettenis   for (event_ptr = event_queue.first_event; event_ptr != NULL;
301*b725ae77Skettenis        event_ptr = event_ptr->next_event)
302*b725ae77Skettenis     {
303*b725ae77Skettenis       /* Call the handler for the event. */
304*b725ae77Skettenis 
305*b725ae77Skettenis       proc = event_ptr->proc;
306*b725ae77Skettenis       fd = event_ptr->fd;
307*b725ae77Skettenis 
308*b725ae77Skettenis       /* Let's get rid of the event from the event queue.  We need to
309*b725ae77Skettenis          do this now because while processing the event, the proc
310*b725ae77Skettenis          function could end up calling 'error' and therefore jump out
311*b725ae77Skettenis          to the caller of this function, gdb_do_one_event. In that
312*b725ae77Skettenis          case, we would have on the event queue an event wich has been
313*b725ae77Skettenis          processed, but not deleted. */
314*b725ae77Skettenis 
315*b725ae77Skettenis       if (event_queue.first_event == event_ptr)
316*b725ae77Skettenis 	{
317*b725ae77Skettenis 	  event_queue.first_event = event_ptr->next_event;
318*b725ae77Skettenis 	  if (event_ptr->next_event == NULL)
319*b725ae77Skettenis 	    event_queue.last_event = NULL;
320*b725ae77Skettenis 	}
321*b725ae77Skettenis       else
322*b725ae77Skettenis 	{
323*b725ae77Skettenis 	  prev_ptr = event_queue.first_event;
324*b725ae77Skettenis 	  while (prev_ptr->next_event != event_ptr)
325*b725ae77Skettenis 	    prev_ptr = prev_ptr->next_event;
326*b725ae77Skettenis 
327*b725ae77Skettenis 	  prev_ptr->next_event = event_ptr->next_event;
328*b725ae77Skettenis 	  if (event_ptr->next_event == NULL)
329*b725ae77Skettenis 	    event_queue.last_event = prev_ptr;
330*b725ae77Skettenis 	}
331*b725ae77Skettenis       xfree (event_ptr);
332*b725ae77Skettenis 
333*b725ae77Skettenis       /* Now call the procedure associated with the event. */
334*b725ae77Skettenis       (*proc) (fd);
335*b725ae77Skettenis       return 1;
336*b725ae77Skettenis     }
337*b725ae77Skettenis 
338*b725ae77Skettenis   /* this is the case if there are no event on the event queue. */
339*b725ae77Skettenis   return 0;
340*b725ae77Skettenis }
341*b725ae77Skettenis 
342*b725ae77Skettenis /* Process one high level event.  If nothing is ready at this time,
343*b725ae77Skettenis    wait for something to happen (via gdb_wait_for_event), then process
344*b725ae77Skettenis    it.  Returns >0 if something was done otherwise returns <0 (this
345*b725ae77Skettenis    can happen if there are no event sources to wait for).  If an error
346*b725ae77Skettenis    occurs catch_errors() which calls this function returns zero. */
347*b725ae77Skettenis 
348*b725ae77Skettenis int
gdb_do_one_event(void * data)349*b725ae77Skettenis gdb_do_one_event (void *data)
350*b725ae77Skettenis {
351*b725ae77Skettenis   /* Any events already waiting in the queue? */
352*b725ae77Skettenis   if (process_event ())
353*b725ae77Skettenis     {
354*b725ae77Skettenis       return 1;
355*b725ae77Skettenis     }
356*b725ae77Skettenis 
357*b725ae77Skettenis   /* Are any timers that are ready? If so, put an event on the queue. */
358*b725ae77Skettenis   poll_timers ();
359*b725ae77Skettenis 
360*b725ae77Skettenis   /* Wait for a new event.  If gdb_wait_for_event returns -1,
361*b725ae77Skettenis      we should get out because this means that there are no
362*b725ae77Skettenis      event sources left. This will make the event loop stop,
363*b725ae77Skettenis      and the application exit. */
364*b725ae77Skettenis 
365*b725ae77Skettenis   if (gdb_wait_for_event () < 0)
366*b725ae77Skettenis     {
367*b725ae77Skettenis       return -1;
368*b725ae77Skettenis     }
369*b725ae77Skettenis 
370*b725ae77Skettenis   /* Handle any new events occurred while waiting. */
371*b725ae77Skettenis   if (process_event ())
372*b725ae77Skettenis     {
373*b725ae77Skettenis       return 1;
374*b725ae77Skettenis     }
375*b725ae77Skettenis 
376*b725ae77Skettenis   /* If gdb_wait_for_event has returned 1, it means that one
377*b725ae77Skettenis      event has been handled. We break out of the loop. */
378*b725ae77Skettenis   return 1;
379*b725ae77Skettenis }
380*b725ae77Skettenis 
381*b725ae77Skettenis /* Start up the event loop. This is the entry point to the event loop
382*b725ae77Skettenis    from the command loop. */
383*b725ae77Skettenis 
384*b725ae77Skettenis void
start_event_loop(void)385*b725ae77Skettenis start_event_loop (void)
386*b725ae77Skettenis {
387*b725ae77Skettenis   /* Loop until there is nothing to do. This is the entry point to the
388*b725ae77Skettenis      event loop engine. gdb_do_one_event, called via catch_errors()
389*b725ae77Skettenis      will process one event for each invocation.  It blocks waits for
390*b725ae77Skettenis      an event and then processes it.  >0 when an event is processed, 0
391*b725ae77Skettenis      when catch_errors() caught an error and <0 when there are no
392*b725ae77Skettenis      longer any event sources registered. */
393*b725ae77Skettenis   while (1)
394*b725ae77Skettenis     {
395*b725ae77Skettenis       int gdb_result;
396*b725ae77Skettenis 
397*b725ae77Skettenis       gdb_result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
398*b725ae77Skettenis       if (gdb_result < 0)
399*b725ae77Skettenis 	break;
400*b725ae77Skettenis 
401*b725ae77Skettenis       /* If we long-jumped out of do_one_event, we probably
402*b725ae77Skettenis          didn't get around to resetting the prompt, which leaves
403*b725ae77Skettenis          readline in a messed-up state.  Reset it here. */
404*b725ae77Skettenis 
405*b725ae77Skettenis       if (gdb_result == 0)
406*b725ae77Skettenis 	{
407*b725ae77Skettenis 	  /* FIXME: this should really be a call to a hook that is
408*b725ae77Skettenis 	     interface specific, because interfaces can display the
409*b725ae77Skettenis 	     prompt in their own way. */
410*b725ae77Skettenis 	  display_gdb_prompt (0);
411*b725ae77Skettenis 	  /* This call looks bizarre, but it is required.  If the user
412*b725ae77Skettenis 	     entered a command that caused an error,
413*b725ae77Skettenis 	     after_char_processing_hook won't be called from
414*b725ae77Skettenis 	     rl_callback_read_char_wrapper.  Using a cleanup there
415*b725ae77Skettenis 	     won't work, since we want this function to be called
416*b725ae77Skettenis 	     after a new prompt is printed.  */
417*b725ae77Skettenis 	  if (after_char_processing_hook)
418*b725ae77Skettenis 	    (*after_char_processing_hook) ();
419*b725ae77Skettenis 	  /* Maybe better to set a flag to be checked somewhere as to
420*b725ae77Skettenis 	     whether display the prompt or not. */
421*b725ae77Skettenis 	}
422*b725ae77Skettenis     }
423*b725ae77Skettenis 
424*b725ae77Skettenis   /* We are done with the event loop. There are no more event sources
425*b725ae77Skettenis      to listen to.  So we exit GDB. */
426*b725ae77Skettenis   return;
427*b725ae77Skettenis }
428*b725ae77Skettenis 
429*b725ae77Skettenis 
430*b725ae77Skettenis /* Wrapper function for create_file_handler, so that the caller
431*b725ae77Skettenis    doesn't have to know implementation details about the use of poll
432*b725ae77Skettenis    vs. select. */
433*b725ae77Skettenis void
add_file_handler(int fd,handler_func * proc,gdb_client_data client_data)434*b725ae77Skettenis add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
435*b725ae77Skettenis {
436*b725ae77Skettenis #ifdef HAVE_POLL
437*b725ae77Skettenis   struct pollfd fds;
438*b725ae77Skettenis #endif
439*b725ae77Skettenis 
440*b725ae77Skettenis   if (use_poll)
441*b725ae77Skettenis     {
442*b725ae77Skettenis #ifdef HAVE_POLL
443*b725ae77Skettenis       /* Check to see if poll () is usable. If not, we'll switch to
444*b725ae77Skettenis          use select. This can happen on systems like
445*b725ae77Skettenis          m68k-motorola-sys, `poll' cannot be used to wait for `stdin'.
446*b725ae77Skettenis          On m68k-motorola-sysv, tty's are not stream-based and not
447*b725ae77Skettenis          `poll'able. */
448*b725ae77Skettenis       fds.fd = fd;
449*b725ae77Skettenis       fds.events = POLLIN;
450*b725ae77Skettenis       if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
451*b725ae77Skettenis 	use_poll = 0;
452*b725ae77Skettenis #else
453*b725ae77Skettenis       internal_error (__FILE__, __LINE__,
454*b725ae77Skettenis 		      "use_poll without HAVE_POLL");
455*b725ae77Skettenis #endif /* HAVE_POLL */
456*b725ae77Skettenis     }
457*b725ae77Skettenis   if (use_poll)
458*b725ae77Skettenis     {
459*b725ae77Skettenis #ifdef HAVE_POLL
460*b725ae77Skettenis       create_file_handler (fd, POLLIN, proc, client_data);
461*b725ae77Skettenis #else
462*b725ae77Skettenis       internal_error (__FILE__, __LINE__,
463*b725ae77Skettenis 		      "use_poll without HAVE_POLL");
464*b725ae77Skettenis #endif
465*b725ae77Skettenis     }
466*b725ae77Skettenis   else
467*b725ae77Skettenis     create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, proc, client_data);
468*b725ae77Skettenis }
469*b725ae77Skettenis 
470*b725ae77Skettenis /* Add a file handler/descriptor to the list of descriptors we are
471*b725ae77Skettenis    interested in.
472*b725ae77Skettenis    FD is the file descriptor for the file/stream to be listened to.
473*b725ae77Skettenis    For the poll case, MASK is a combination (OR) of
474*b725ae77Skettenis    POLLIN, POLLRDNORM, POLLRDBAND, POLLPRI, POLLOUT, POLLWRNORM,
475*b725ae77Skettenis    POLLWRBAND: these are the events we are interested in. If any of them
476*b725ae77Skettenis    occurs, proc should be called.
477*b725ae77Skettenis    For the select case, MASK is a combination of READABLE, WRITABLE, EXCEPTION.
478*b725ae77Skettenis    PROC is the procedure that will be called when an event occurs for
479*b725ae77Skettenis    FD.  CLIENT_DATA is the argument to pass to PROC. */
480*b725ae77Skettenis static void
create_file_handler(int fd,int mask,handler_func * proc,gdb_client_data client_data)481*b725ae77Skettenis create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data client_data)
482*b725ae77Skettenis {
483*b725ae77Skettenis   file_handler *file_ptr;
484*b725ae77Skettenis 
485*b725ae77Skettenis   /* Do we already have a file handler for this file? (We may be
486*b725ae77Skettenis      changing its associated procedure). */
487*b725ae77Skettenis   for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
488*b725ae77Skettenis        file_ptr = file_ptr->next_file)
489*b725ae77Skettenis     {
490*b725ae77Skettenis       if (file_ptr->fd == fd)
491*b725ae77Skettenis 	break;
492*b725ae77Skettenis     }
493*b725ae77Skettenis 
494*b725ae77Skettenis   /* It is a new file descriptor. Add it to the list. Otherwise, just
495*b725ae77Skettenis      change the data associated with it. */
496*b725ae77Skettenis   if (file_ptr == NULL)
497*b725ae77Skettenis     {
498*b725ae77Skettenis       file_ptr = (file_handler *) xmalloc (sizeof (file_handler));
499*b725ae77Skettenis       file_ptr->fd = fd;
500*b725ae77Skettenis       file_ptr->ready_mask = 0;
501*b725ae77Skettenis       file_ptr->next_file = gdb_notifier.first_file_handler;
502*b725ae77Skettenis       gdb_notifier.first_file_handler = file_ptr;
503*b725ae77Skettenis 
504*b725ae77Skettenis       if (use_poll)
505*b725ae77Skettenis 	{
506*b725ae77Skettenis #ifdef HAVE_POLL
507*b725ae77Skettenis 	  gdb_notifier.num_fds++;
508*b725ae77Skettenis 	  if (gdb_notifier.poll_fds)
509*b725ae77Skettenis 	    gdb_notifier.poll_fds =
510*b725ae77Skettenis 	      (struct pollfd *) xrealloc (gdb_notifier.poll_fds,
511*b725ae77Skettenis 					  (gdb_notifier.num_fds
512*b725ae77Skettenis 					   * sizeof (struct pollfd)));
513*b725ae77Skettenis 	  else
514*b725ae77Skettenis 	    gdb_notifier.poll_fds =
515*b725ae77Skettenis 	      (struct pollfd *) xmalloc (sizeof (struct pollfd));
516*b725ae77Skettenis 	  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
517*b725ae77Skettenis 	  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
518*b725ae77Skettenis 	  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
519*b725ae77Skettenis #else
520*b725ae77Skettenis 	  internal_error (__FILE__, __LINE__,
521*b725ae77Skettenis 			  "use_poll without HAVE_POLL");
522*b725ae77Skettenis #endif /* HAVE_POLL */
523*b725ae77Skettenis 	}
524*b725ae77Skettenis       else
525*b725ae77Skettenis 	{
526*b725ae77Skettenis 	  if (mask & GDB_READABLE)
527*b725ae77Skettenis 	    FD_SET (fd, &gdb_notifier.check_masks[0]);
528*b725ae77Skettenis 	  else
529*b725ae77Skettenis 	    FD_CLR (fd, &gdb_notifier.check_masks[0]);
530*b725ae77Skettenis 
531*b725ae77Skettenis 	  if (mask & GDB_WRITABLE)
532*b725ae77Skettenis 	    FD_SET (fd, &gdb_notifier.check_masks[1]);
533*b725ae77Skettenis 	  else
534*b725ae77Skettenis 	    FD_CLR (fd, &gdb_notifier.check_masks[1]);
535*b725ae77Skettenis 
536*b725ae77Skettenis 	  if (mask & GDB_EXCEPTION)
537*b725ae77Skettenis 	    FD_SET (fd, &gdb_notifier.check_masks[2]);
538*b725ae77Skettenis 	  else
539*b725ae77Skettenis 	    FD_CLR (fd, &gdb_notifier.check_masks[2]);
540*b725ae77Skettenis 
541*b725ae77Skettenis 	  if (gdb_notifier.num_fds <= fd)
542*b725ae77Skettenis 	    gdb_notifier.num_fds = fd + 1;
543*b725ae77Skettenis 	}
544*b725ae77Skettenis     }
545*b725ae77Skettenis 
546*b725ae77Skettenis   file_ptr->proc = proc;
547*b725ae77Skettenis   file_ptr->client_data = client_data;
548*b725ae77Skettenis   file_ptr->mask = mask;
549*b725ae77Skettenis }
550*b725ae77Skettenis 
551*b725ae77Skettenis /* Remove the file descriptor FD from the list of monitored fd's:
552*b725ae77Skettenis    i.e. we don't care anymore about events on the FD. */
553*b725ae77Skettenis void
delete_file_handler(int fd)554*b725ae77Skettenis delete_file_handler (int fd)
555*b725ae77Skettenis {
556*b725ae77Skettenis   file_handler *file_ptr, *prev_ptr = NULL;
557*b725ae77Skettenis   int i;
558*b725ae77Skettenis #ifdef HAVE_POLL
559*b725ae77Skettenis   int j;
560*b725ae77Skettenis   struct pollfd *new_poll_fds;
561*b725ae77Skettenis #endif
562*b725ae77Skettenis 
563*b725ae77Skettenis   /* Find the entry for the given file. */
564*b725ae77Skettenis 
565*b725ae77Skettenis   for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
566*b725ae77Skettenis        file_ptr = file_ptr->next_file)
567*b725ae77Skettenis     {
568*b725ae77Skettenis       if (file_ptr->fd == fd)
569*b725ae77Skettenis 	break;
570*b725ae77Skettenis     }
571*b725ae77Skettenis 
572*b725ae77Skettenis   if (file_ptr == NULL)
573*b725ae77Skettenis     return;
574*b725ae77Skettenis 
575*b725ae77Skettenis   if (use_poll)
576*b725ae77Skettenis     {
577*b725ae77Skettenis #ifdef HAVE_POLL
578*b725ae77Skettenis       /* Create a new poll_fds array by copying every fd's information but the
579*b725ae77Skettenis          one we want to get rid of. */
580*b725ae77Skettenis 
581*b725ae77Skettenis       new_poll_fds =
582*b725ae77Skettenis 	(struct pollfd *) xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
583*b725ae77Skettenis 
584*b725ae77Skettenis       for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
585*b725ae77Skettenis 	{
586*b725ae77Skettenis 	  if ((gdb_notifier.poll_fds + i)->fd != fd)
587*b725ae77Skettenis 	    {
588*b725ae77Skettenis 	      (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
589*b725ae77Skettenis 	      (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
590*b725ae77Skettenis 	      (new_poll_fds + j)->revents = (gdb_notifier.poll_fds + i)->revents;
591*b725ae77Skettenis 	      j++;
592*b725ae77Skettenis 	    }
593*b725ae77Skettenis 	}
594*b725ae77Skettenis       xfree (gdb_notifier.poll_fds);
595*b725ae77Skettenis       gdb_notifier.poll_fds = new_poll_fds;
596*b725ae77Skettenis       gdb_notifier.num_fds--;
597*b725ae77Skettenis #else
598*b725ae77Skettenis       internal_error (__FILE__, __LINE__,
599*b725ae77Skettenis 		      "use_poll without HAVE_POLL");
600*b725ae77Skettenis #endif /* HAVE_POLL */
601*b725ae77Skettenis     }
602*b725ae77Skettenis   else
603*b725ae77Skettenis     {
604*b725ae77Skettenis       if (file_ptr->mask & GDB_READABLE)
605*b725ae77Skettenis 	FD_CLR (fd, &gdb_notifier.check_masks[0]);
606*b725ae77Skettenis       if (file_ptr->mask & GDB_WRITABLE)
607*b725ae77Skettenis 	FD_CLR (fd, &gdb_notifier.check_masks[1]);
608*b725ae77Skettenis       if (file_ptr->mask & GDB_EXCEPTION)
609*b725ae77Skettenis 	FD_CLR (fd, &gdb_notifier.check_masks[2]);
610*b725ae77Skettenis 
611*b725ae77Skettenis       /* Find current max fd. */
612*b725ae77Skettenis 
613*b725ae77Skettenis       if ((fd + 1) == gdb_notifier.num_fds)
614*b725ae77Skettenis 	{
615*b725ae77Skettenis 	  gdb_notifier.num_fds--;
616*b725ae77Skettenis 	  for (i = gdb_notifier.num_fds; i; i--)
617*b725ae77Skettenis 	    {
618*b725ae77Skettenis 	      if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0])
619*b725ae77Skettenis 		  || FD_ISSET (i - 1, &gdb_notifier.check_masks[1])
620*b725ae77Skettenis 		  || FD_ISSET (i - 1, &gdb_notifier.check_masks[2]))
621*b725ae77Skettenis 		break;
622*b725ae77Skettenis 	    }
623*b725ae77Skettenis 	  gdb_notifier.num_fds = i;
624*b725ae77Skettenis 	}
625*b725ae77Skettenis     }
626*b725ae77Skettenis 
627*b725ae77Skettenis   /* Deactivate the file descriptor, by clearing its mask,
628*b725ae77Skettenis      so that it will not fire again. */
629*b725ae77Skettenis 
630*b725ae77Skettenis   file_ptr->mask = 0;
631*b725ae77Skettenis 
632*b725ae77Skettenis   /* Get rid of the file handler in the file handler list. */
633*b725ae77Skettenis   if (file_ptr == gdb_notifier.first_file_handler)
634*b725ae77Skettenis     gdb_notifier.first_file_handler = file_ptr->next_file;
635*b725ae77Skettenis   else
636*b725ae77Skettenis     {
637*b725ae77Skettenis       for (prev_ptr = gdb_notifier.first_file_handler;
638*b725ae77Skettenis 	   prev_ptr->next_file != file_ptr;
639*b725ae77Skettenis 	   prev_ptr = prev_ptr->next_file)
640*b725ae77Skettenis 	;
641*b725ae77Skettenis       prev_ptr->next_file = file_ptr->next_file;
642*b725ae77Skettenis     }
643*b725ae77Skettenis   xfree (file_ptr);
644*b725ae77Skettenis }
645*b725ae77Skettenis 
646*b725ae77Skettenis /* Handle the given event by calling the procedure associated to the
647*b725ae77Skettenis    corresponding file handler.  Called by process_event indirectly,
648*b725ae77Skettenis    through event_ptr->proc.  EVENT_FILE_DESC is file descriptor of the
649*b725ae77Skettenis    event in the front of the event queue. */
650*b725ae77Skettenis static void
handle_file_event(int event_file_desc)651*b725ae77Skettenis handle_file_event (int event_file_desc)
652*b725ae77Skettenis {
653*b725ae77Skettenis   file_handler *file_ptr;
654*b725ae77Skettenis   int mask;
655*b725ae77Skettenis #ifdef HAVE_POLL
656*b725ae77Skettenis   int error_mask;
657*b725ae77Skettenis   int error_mask_returned;
658*b725ae77Skettenis #endif
659*b725ae77Skettenis 
660*b725ae77Skettenis   /* Search the file handler list to find one that matches the fd in
661*b725ae77Skettenis      the event. */
662*b725ae77Skettenis   for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
663*b725ae77Skettenis        file_ptr = file_ptr->next_file)
664*b725ae77Skettenis     {
665*b725ae77Skettenis       if (file_ptr->fd == event_file_desc)
666*b725ae77Skettenis 	{
667*b725ae77Skettenis 	  /* With poll, the ready_mask could have any of three events
668*b725ae77Skettenis 	     set to 1: POLLHUP, POLLERR, POLLNVAL. These events cannot
669*b725ae77Skettenis 	     be used in the requested event mask (events), but they
670*b725ae77Skettenis 	     can be returned in the return mask (revents). We need to
671*b725ae77Skettenis 	     check for those event too, and add them to the mask which
672*b725ae77Skettenis 	     will be passed to the handler. */
673*b725ae77Skettenis 
674*b725ae77Skettenis 	  /* See if the desired events (mask) match the received
675*b725ae77Skettenis 	     events (ready_mask). */
676*b725ae77Skettenis 
677*b725ae77Skettenis 	  if (use_poll)
678*b725ae77Skettenis 	    {
679*b725ae77Skettenis #ifdef HAVE_POLL
680*b725ae77Skettenis 	      error_mask = POLLHUP | POLLERR | POLLNVAL;
681*b725ae77Skettenis 	      mask = (file_ptr->ready_mask & file_ptr->mask) |
682*b725ae77Skettenis 		(file_ptr->ready_mask & error_mask);
683*b725ae77Skettenis 	      error_mask_returned = mask & error_mask;
684*b725ae77Skettenis 
685*b725ae77Skettenis 	      if (error_mask_returned != 0)
686*b725ae77Skettenis 		{
687*b725ae77Skettenis 		  /* Work in progress. We may need to tell somebody what
688*b725ae77Skettenis 		     kind of error we had. */
689*b725ae77Skettenis 		  if (error_mask_returned & POLLHUP)
690*b725ae77Skettenis 		    printf_unfiltered ("Hangup detected on fd %d\n", file_ptr->fd);
691*b725ae77Skettenis 		  if (error_mask_returned & POLLERR)
692*b725ae77Skettenis 		    printf_unfiltered ("Error detected on fd %d\n", file_ptr->fd);
693*b725ae77Skettenis 		  if (error_mask_returned & POLLNVAL)
694*b725ae77Skettenis 		    printf_unfiltered ("Invalid or non-`poll'able fd %d\n", file_ptr->fd);
695*b725ae77Skettenis 		  file_ptr->error = 1;
696*b725ae77Skettenis 		}
697*b725ae77Skettenis 	      else
698*b725ae77Skettenis 		file_ptr->error = 0;
699*b725ae77Skettenis #else
700*b725ae77Skettenis 	      internal_error (__FILE__, __LINE__,
701*b725ae77Skettenis 			      "use_poll without HAVE_POLL");
702*b725ae77Skettenis #endif /* HAVE_POLL */
703*b725ae77Skettenis 	    }
704*b725ae77Skettenis 	  else
705*b725ae77Skettenis 	    {
706*b725ae77Skettenis 	      if (file_ptr->ready_mask & GDB_EXCEPTION)
707*b725ae77Skettenis 		{
708*b725ae77Skettenis 		  printf_unfiltered ("Exception condition detected on fd %d\n", file_ptr->fd);
709*b725ae77Skettenis 		  file_ptr->error = 1;
710*b725ae77Skettenis 		}
711*b725ae77Skettenis 	      else
712*b725ae77Skettenis 		file_ptr->error = 0;
713*b725ae77Skettenis 	      mask = file_ptr->ready_mask & file_ptr->mask;
714*b725ae77Skettenis 	    }
715*b725ae77Skettenis 
716*b725ae77Skettenis 	  /* Clear the received events for next time around. */
717*b725ae77Skettenis 	  file_ptr->ready_mask = 0;
718*b725ae77Skettenis 
719*b725ae77Skettenis 	  /* If there was a match, then call the handler. */
720*b725ae77Skettenis 	  if (mask != 0)
721*b725ae77Skettenis 	    (*file_ptr->proc) (file_ptr->error, file_ptr->client_data);
722*b725ae77Skettenis 	  break;
723*b725ae77Skettenis 	}
724*b725ae77Skettenis     }
725*b725ae77Skettenis }
726*b725ae77Skettenis 
727*b725ae77Skettenis /* Called by gdb_do_one_event to wait for new events on the
728*b725ae77Skettenis    monitored file descriptors. Queue file events as they are
729*b725ae77Skettenis    detected by the poll.
730*b725ae77Skettenis    If there are no events, this function will block in the
731*b725ae77Skettenis    call to poll.
732*b725ae77Skettenis    Return -1 if there are no files descriptors to monitor,
733*b725ae77Skettenis    otherwise return 0. */
734*b725ae77Skettenis static int
gdb_wait_for_event(void)735*b725ae77Skettenis gdb_wait_for_event (void)
736*b725ae77Skettenis {
737*b725ae77Skettenis   file_handler *file_ptr;
738*b725ae77Skettenis   gdb_event *file_event_ptr;
739*b725ae77Skettenis   int num_found = 0;
740*b725ae77Skettenis   int i;
741*b725ae77Skettenis 
742*b725ae77Skettenis   /* Make sure all output is done before getting another event. */
743*b725ae77Skettenis   gdb_flush (gdb_stdout);
744*b725ae77Skettenis   gdb_flush (gdb_stderr);
745*b725ae77Skettenis 
746*b725ae77Skettenis   if (gdb_notifier.num_fds == 0)
747*b725ae77Skettenis     return -1;
748*b725ae77Skettenis 
749*b725ae77Skettenis   if (use_poll)
750*b725ae77Skettenis     {
751*b725ae77Skettenis #ifdef HAVE_POLL
752*b725ae77Skettenis       num_found =
753*b725ae77Skettenis 	poll (gdb_notifier.poll_fds,
754*b725ae77Skettenis 	      (unsigned long) gdb_notifier.num_fds,
755*b725ae77Skettenis 	      gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1);
756*b725ae77Skettenis 
757*b725ae77Skettenis       /* Don't print anything if we get out of poll because of a
758*b725ae77Skettenis          signal. */
759*b725ae77Skettenis       if (num_found == -1 && errno != EINTR)
760*b725ae77Skettenis 	perror_with_name ("Poll");
761*b725ae77Skettenis #else
762*b725ae77Skettenis       internal_error (__FILE__, __LINE__,
763*b725ae77Skettenis 		      "use_poll without HAVE_POLL");
764*b725ae77Skettenis #endif /* HAVE_POLL */
765*b725ae77Skettenis     }
766*b725ae77Skettenis   else
767*b725ae77Skettenis     {
768*b725ae77Skettenis       gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
769*b725ae77Skettenis       gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
770*b725ae77Skettenis       gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
771*b725ae77Skettenis       num_found = select (gdb_notifier.num_fds,
772*b725ae77Skettenis 			  &gdb_notifier.ready_masks[0],
773*b725ae77Skettenis 			  &gdb_notifier.ready_masks[1],
774*b725ae77Skettenis 			  &gdb_notifier.ready_masks[2],
775*b725ae77Skettenis 			  gdb_notifier.timeout_valid
776*b725ae77Skettenis 			  ? &gdb_notifier.select_timeout : NULL);
777*b725ae77Skettenis 
778*b725ae77Skettenis       /* Clear the masks after an error from select. */
779*b725ae77Skettenis       if (num_found == -1)
780*b725ae77Skettenis 	{
781*b725ae77Skettenis 	  FD_ZERO (&gdb_notifier.ready_masks[0]);
782*b725ae77Skettenis 	  FD_ZERO (&gdb_notifier.ready_masks[1]);
783*b725ae77Skettenis 	  FD_ZERO (&gdb_notifier.ready_masks[2]);
784*b725ae77Skettenis 	  /* Dont print anything is we got a signal, let gdb handle it. */
785*b725ae77Skettenis 	  if (errno != EINTR)
786*b725ae77Skettenis 	    perror_with_name ("Select");
787*b725ae77Skettenis 	}
788*b725ae77Skettenis     }
789*b725ae77Skettenis 
790*b725ae77Skettenis   /* Enqueue all detected file events. */
791*b725ae77Skettenis 
792*b725ae77Skettenis   if (use_poll)
793*b725ae77Skettenis     {
794*b725ae77Skettenis #ifdef HAVE_POLL
795*b725ae77Skettenis       for (i = 0; (i < gdb_notifier.num_fds) && (num_found > 0); i++)
796*b725ae77Skettenis 	{
797*b725ae77Skettenis 	  if ((gdb_notifier.poll_fds + i)->revents)
798*b725ae77Skettenis 	    num_found--;
799*b725ae77Skettenis 	  else
800*b725ae77Skettenis 	    continue;
801*b725ae77Skettenis 
802*b725ae77Skettenis 	  for (file_ptr = gdb_notifier.first_file_handler;
803*b725ae77Skettenis 	       file_ptr != NULL;
804*b725ae77Skettenis 	       file_ptr = file_ptr->next_file)
805*b725ae77Skettenis 	    {
806*b725ae77Skettenis 	      if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd)
807*b725ae77Skettenis 		break;
808*b725ae77Skettenis 	    }
809*b725ae77Skettenis 
810*b725ae77Skettenis 	  if (file_ptr)
811*b725ae77Skettenis 	    {
812*b725ae77Skettenis 	      /* Enqueue an event only if this is still a new event for
813*b725ae77Skettenis 	         this fd. */
814*b725ae77Skettenis 	      if (file_ptr->ready_mask == 0)
815*b725ae77Skettenis 		{
816*b725ae77Skettenis 		  file_event_ptr = create_file_event (file_ptr->fd);
817*b725ae77Skettenis 		  async_queue_event (file_event_ptr, TAIL);
818*b725ae77Skettenis 		}
819*b725ae77Skettenis 	    }
820*b725ae77Skettenis 
821*b725ae77Skettenis 	  file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
822*b725ae77Skettenis 	}
823*b725ae77Skettenis #else
824*b725ae77Skettenis       internal_error (__FILE__, __LINE__,
825*b725ae77Skettenis 		      "use_poll without HAVE_POLL");
826*b725ae77Skettenis #endif /* HAVE_POLL */
827*b725ae77Skettenis     }
828*b725ae77Skettenis   else
829*b725ae77Skettenis     {
830*b725ae77Skettenis       for (file_ptr = gdb_notifier.first_file_handler;
831*b725ae77Skettenis 	   (file_ptr != NULL) && (num_found > 0);
832*b725ae77Skettenis 	   file_ptr = file_ptr->next_file)
833*b725ae77Skettenis 	{
834*b725ae77Skettenis 	  int mask = 0;
835*b725ae77Skettenis 
836*b725ae77Skettenis 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0]))
837*b725ae77Skettenis 	    mask |= GDB_READABLE;
838*b725ae77Skettenis 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1]))
839*b725ae77Skettenis 	    mask |= GDB_WRITABLE;
840*b725ae77Skettenis 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2]))
841*b725ae77Skettenis 	    mask |= GDB_EXCEPTION;
842*b725ae77Skettenis 
843*b725ae77Skettenis 	  if (!mask)
844*b725ae77Skettenis 	    continue;
845*b725ae77Skettenis 	  else
846*b725ae77Skettenis 	    num_found--;
847*b725ae77Skettenis 
848*b725ae77Skettenis 	  /* Enqueue an event only if this is still a new event for
849*b725ae77Skettenis 	     this fd. */
850*b725ae77Skettenis 
851*b725ae77Skettenis 	  if (file_ptr->ready_mask == 0)
852*b725ae77Skettenis 	    {
853*b725ae77Skettenis 	      file_event_ptr = create_file_event (file_ptr->fd);
854*b725ae77Skettenis 	      async_queue_event (file_event_ptr, TAIL);
855*b725ae77Skettenis 	    }
856*b725ae77Skettenis 	  file_ptr->ready_mask = mask;
857*b725ae77Skettenis 	}
858*b725ae77Skettenis     }
859*b725ae77Skettenis   return 0;
860*b725ae77Skettenis }
861*b725ae77Skettenis 
862*b725ae77Skettenis 
863*b725ae77Skettenis /* Create an asynchronous handler, allocating memory for it.
864*b725ae77Skettenis    Return a pointer to the newly created handler.
865*b725ae77Skettenis    This pointer will be used to invoke the handler by
866*b725ae77Skettenis    invoke_async_signal_handler.
867*b725ae77Skettenis    PROC is the function to call with CLIENT_DATA argument
868*b725ae77Skettenis    whenever the handler is invoked. */
869*b725ae77Skettenis async_signal_handler *
create_async_signal_handler(sig_handler_func * proc,gdb_client_data client_data)870*b725ae77Skettenis create_async_signal_handler (sig_handler_func * proc, gdb_client_data client_data)
871*b725ae77Skettenis {
872*b725ae77Skettenis   async_signal_handler *async_handler_ptr;
873*b725ae77Skettenis 
874*b725ae77Skettenis   async_handler_ptr =
875*b725ae77Skettenis     (async_signal_handler *) xmalloc (sizeof (async_signal_handler));
876*b725ae77Skettenis   async_handler_ptr->ready = 0;
877*b725ae77Skettenis   async_handler_ptr->next_handler = NULL;
878*b725ae77Skettenis   async_handler_ptr->proc = proc;
879*b725ae77Skettenis   async_handler_ptr->client_data = client_data;
880*b725ae77Skettenis   if (sighandler_list.first_handler == NULL)
881*b725ae77Skettenis     sighandler_list.first_handler = async_handler_ptr;
882*b725ae77Skettenis   else
883*b725ae77Skettenis     sighandler_list.last_handler->next_handler = async_handler_ptr;
884*b725ae77Skettenis   sighandler_list.last_handler = async_handler_ptr;
885*b725ae77Skettenis   return async_handler_ptr;
886*b725ae77Skettenis }
887*b725ae77Skettenis 
888*b725ae77Skettenis /* Mark the handler (ASYNC_HANDLER_PTR) as ready. This information will
889*b725ae77Skettenis    be used when the handlers are invoked, after we have waited for
890*b725ae77Skettenis    some event.  The caller of this function is the interrupt handler
891*b725ae77Skettenis    associated with a signal. */
892*b725ae77Skettenis void
mark_async_signal_handler(async_signal_handler * async_handler_ptr)893*b725ae77Skettenis mark_async_signal_handler (async_signal_handler * async_handler_ptr)
894*b725ae77Skettenis {
895*b725ae77Skettenis   ((async_signal_handler *) async_handler_ptr)->ready = 1;
896*b725ae77Skettenis   async_handler_ready = 1;
897*b725ae77Skettenis }
898*b725ae77Skettenis 
899*b725ae77Skettenis /* Call all the handlers that are ready. */
900*b725ae77Skettenis static void
invoke_async_signal_handler(void)901*b725ae77Skettenis invoke_async_signal_handler (void)
902*b725ae77Skettenis {
903*b725ae77Skettenis   async_signal_handler *async_handler_ptr;
904*b725ae77Skettenis 
905*b725ae77Skettenis   if (async_handler_ready == 0)
906*b725ae77Skettenis     return;
907*b725ae77Skettenis   async_handler_ready = 0;
908*b725ae77Skettenis 
909*b725ae77Skettenis   /* Invoke ready handlers. */
910*b725ae77Skettenis 
911*b725ae77Skettenis   while (1)
912*b725ae77Skettenis     {
913*b725ae77Skettenis       for (async_handler_ptr = sighandler_list.first_handler;
914*b725ae77Skettenis 	   async_handler_ptr != NULL;
915*b725ae77Skettenis 	   async_handler_ptr = async_handler_ptr->next_handler)
916*b725ae77Skettenis 	{
917*b725ae77Skettenis 	  if (async_handler_ptr->ready)
918*b725ae77Skettenis 	    break;
919*b725ae77Skettenis 	}
920*b725ae77Skettenis       if (async_handler_ptr == NULL)
921*b725ae77Skettenis 	break;
922*b725ae77Skettenis       async_handler_ptr->ready = 0;
923*b725ae77Skettenis       (*async_handler_ptr->proc) (async_handler_ptr->client_data);
924*b725ae77Skettenis     }
925*b725ae77Skettenis 
926*b725ae77Skettenis   return;
927*b725ae77Skettenis }
928*b725ae77Skettenis 
929*b725ae77Skettenis /* Delete an asynchronous handler (ASYNC_HANDLER_PTR).
930*b725ae77Skettenis    Free the space allocated for it.  */
931*b725ae77Skettenis void
delete_async_signal_handler(async_signal_handler ** async_handler_ptr)932*b725ae77Skettenis delete_async_signal_handler (async_signal_handler ** async_handler_ptr)
933*b725ae77Skettenis {
934*b725ae77Skettenis   async_signal_handler *prev_ptr;
935*b725ae77Skettenis 
936*b725ae77Skettenis   if (sighandler_list.first_handler == (*async_handler_ptr))
937*b725ae77Skettenis     {
938*b725ae77Skettenis       sighandler_list.first_handler = (*async_handler_ptr)->next_handler;
939*b725ae77Skettenis       if (sighandler_list.first_handler == NULL)
940*b725ae77Skettenis 	sighandler_list.last_handler = NULL;
941*b725ae77Skettenis     }
942*b725ae77Skettenis   else
943*b725ae77Skettenis     {
944*b725ae77Skettenis       prev_ptr = sighandler_list.first_handler;
945*b725ae77Skettenis       while (prev_ptr->next_handler != (*async_handler_ptr) && prev_ptr)
946*b725ae77Skettenis 	prev_ptr = prev_ptr->next_handler;
947*b725ae77Skettenis       prev_ptr->next_handler = (*async_handler_ptr)->next_handler;
948*b725ae77Skettenis       if (sighandler_list.last_handler == (*async_handler_ptr))
949*b725ae77Skettenis 	sighandler_list.last_handler = prev_ptr;
950*b725ae77Skettenis     }
951*b725ae77Skettenis   xfree ((*async_handler_ptr));
952*b725ae77Skettenis   (*async_handler_ptr) = NULL;
953*b725ae77Skettenis }
954*b725ae77Skettenis 
955*b725ae77Skettenis /* Is it necessary to call invoke_async_signal_handler? */
956*b725ae77Skettenis static int
check_async_ready(void)957*b725ae77Skettenis check_async_ready (void)
958*b725ae77Skettenis {
959*b725ae77Skettenis   return async_handler_ready;
960*b725ae77Skettenis }
961*b725ae77Skettenis 
962*b725ae77Skettenis /* Create a timer that will expire in MILLISECONDS from now. When the
963*b725ae77Skettenis    timer is ready, PROC will be executed. At creation, the timer is
964*b725ae77Skettenis    aded to the timers queue.  This queue is kept sorted in order of
965*b725ae77Skettenis    increasing timers. Return a handle to the timer struct. */
966*b725ae77Skettenis int
create_timer(int milliseconds,timer_handler_func * proc,gdb_client_data client_data)967*b725ae77Skettenis create_timer (int milliseconds, timer_handler_func * proc, gdb_client_data client_data)
968*b725ae77Skettenis {
969*b725ae77Skettenis   struct gdb_timer *timer_ptr, *timer_index, *prev_timer;
970*b725ae77Skettenis   struct timeval time_now, delta;
971*b725ae77Skettenis 
972*b725ae77Skettenis   /* compute seconds */
973*b725ae77Skettenis   delta.tv_sec = milliseconds / 1000;
974*b725ae77Skettenis   /* compute microseconds */
975*b725ae77Skettenis   delta.tv_usec = (milliseconds % 1000) * 1000;
976*b725ae77Skettenis 
977*b725ae77Skettenis   gettimeofday (&time_now, NULL);
978*b725ae77Skettenis 
979*b725ae77Skettenis   timer_ptr = (struct gdb_timer *) xmalloc (sizeof (gdb_timer));
980*b725ae77Skettenis   timer_ptr->when.tv_sec = time_now.tv_sec + delta.tv_sec;
981*b725ae77Skettenis   timer_ptr->when.tv_usec = time_now.tv_usec + delta.tv_usec;
982*b725ae77Skettenis   /* carry? */
983*b725ae77Skettenis   if (timer_ptr->when.tv_usec >= 1000000)
984*b725ae77Skettenis     {
985*b725ae77Skettenis       timer_ptr->when.tv_sec += 1;
986*b725ae77Skettenis       timer_ptr->when.tv_usec -= 1000000;
987*b725ae77Skettenis     }
988*b725ae77Skettenis   timer_ptr->proc = proc;
989*b725ae77Skettenis   timer_ptr->client_data = client_data;
990*b725ae77Skettenis   timer_list.num_timers++;
991*b725ae77Skettenis   timer_ptr->timer_id = timer_list.num_timers;
992*b725ae77Skettenis 
993*b725ae77Skettenis   /* Now add the timer to the timer queue, making sure it is sorted in
994*b725ae77Skettenis      increasing order of expiration. */
995*b725ae77Skettenis 
996*b725ae77Skettenis   for (timer_index = timer_list.first_timer;
997*b725ae77Skettenis        timer_index != NULL;
998*b725ae77Skettenis        timer_index = timer_index->next)
999*b725ae77Skettenis     {
1000*b725ae77Skettenis       /* If the seconds field is greater or if it is the same, but the
1001*b725ae77Skettenis          microsecond field is greater. */
1002*b725ae77Skettenis       if ((timer_index->when.tv_sec > timer_ptr->when.tv_sec) ||
1003*b725ae77Skettenis 	  ((timer_index->when.tv_sec == timer_ptr->when.tv_sec)
1004*b725ae77Skettenis 	   && (timer_index->when.tv_usec > timer_ptr->when.tv_usec)))
1005*b725ae77Skettenis 	break;
1006*b725ae77Skettenis     }
1007*b725ae77Skettenis 
1008*b725ae77Skettenis   if (timer_index == timer_list.first_timer)
1009*b725ae77Skettenis     {
1010*b725ae77Skettenis       timer_ptr->next = timer_list.first_timer;
1011*b725ae77Skettenis       timer_list.first_timer = timer_ptr;
1012*b725ae77Skettenis 
1013*b725ae77Skettenis     }
1014*b725ae77Skettenis   else
1015*b725ae77Skettenis     {
1016*b725ae77Skettenis       for (prev_timer = timer_list.first_timer;
1017*b725ae77Skettenis 	   prev_timer->next != timer_index;
1018*b725ae77Skettenis 	   prev_timer = prev_timer->next)
1019*b725ae77Skettenis 	;
1020*b725ae77Skettenis 
1021*b725ae77Skettenis       prev_timer->next = timer_ptr;
1022*b725ae77Skettenis       timer_ptr->next = timer_index;
1023*b725ae77Skettenis     }
1024*b725ae77Skettenis 
1025*b725ae77Skettenis   gdb_notifier.timeout_valid = 0;
1026*b725ae77Skettenis   return timer_ptr->timer_id;
1027*b725ae77Skettenis }
1028*b725ae77Skettenis 
1029*b725ae77Skettenis /* There is a chance that the creator of the timer wants to get rid of
1030*b725ae77Skettenis    it before it expires. */
1031*b725ae77Skettenis void
delete_timer(int id)1032*b725ae77Skettenis delete_timer (int id)
1033*b725ae77Skettenis {
1034*b725ae77Skettenis   struct gdb_timer *timer_ptr, *prev_timer = NULL;
1035*b725ae77Skettenis 
1036*b725ae77Skettenis   /* Find the entry for the given timer. */
1037*b725ae77Skettenis 
1038*b725ae77Skettenis   for (timer_ptr = timer_list.first_timer; timer_ptr != NULL;
1039*b725ae77Skettenis        timer_ptr = timer_ptr->next)
1040*b725ae77Skettenis     {
1041*b725ae77Skettenis       if (timer_ptr->timer_id == id)
1042*b725ae77Skettenis 	break;
1043*b725ae77Skettenis     }
1044*b725ae77Skettenis 
1045*b725ae77Skettenis   if (timer_ptr == NULL)
1046*b725ae77Skettenis     return;
1047*b725ae77Skettenis   /* Get rid of the timer in the timer list. */
1048*b725ae77Skettenis   if (timer_ptr == timer_list.first_timer)
1049*b725ae77Skettenis     timer_list.first_timer = timer_ptr->next;
1050*b725ae77Skettenis   else
1051*b725ae77Skettenis     {
1052*b725ae77Skettenis       for (prev_timer = timer_list.first_timer;
1053*b725ae77Skettenis 	   prev_timer->next != timer_ptr;
1054*b725ae77Skettenis 	   prev_timer = prev_timer->next)
1055*b725ae77Skettenis 	;
1056*b725ae77Skettenis       prev_timer->next = timer_ptr->next;
1057*b725ae77Skettenis     }
1058*b725ae77Skettenis   xfree (timer_ptr);
1059*b725ae77Skettenis 
1060*b725ae77Skettenis   gdb_notifier.timeout_valid = 0;
1061*b725ae77Skettenis }
1062*b725ae77Skettenis 
1063*b725ae77Skettenis /* When a timer event is put on the event queue, it will be handled by
1064*b725ae77Skettenis    this function.  Just call the assiciated procedure and delete the
1065*b725ae77Skettenis    timer event from the event queue. Repeat this for each timer that
1066*b725ae77Skettenis    has expired. */
1067*b725ae77Skettenis static void
handle_timer_event(int dummy)1068*b725ae77Skettenis handle_timer_event (int dummy)
1069*b725ae77Skettenis {
1070*b725ae77Skettenis   struct timeval time_now;
1071*b725ae77Skettenis   struct gdb_timer *timer_ptr, *saved_timer;
1072*b725ae77Skettenis 
1073*b725ae77Skettenis   gettimeofday (&time_now, NULL);
1074*b725ae77Skettenis   timer_ptr = timer_list.first_timer;
1075*b725ae77Skettenis 
1076*b725ae77Skettenis   while (timer_ptr != NULL)
1077*b725ae77Skettenis     {
1078*b725ae77Skettenis       if ((timer_ptr->when.tv_sec > time_now.tv_sec) ||
1079*b725ae77Skettenis 	  ((timer_ptr->when.tv_sec == time_now.tv_sec) &&
1080*b725ae77Skettenis 	   (timer_ptr->when.tv_usec > time_now.tv_usec)))
1081*b725ae77Skettenis 	break;
1082*b725ae77Skettenis 
1083*b725ae77Skettenis       /* Get rid of the timer from the beginning of the list. */
1084*b725ae77Skettenis       timer_list.first_timer = timer_ptr->next;
1085*b725ae77Skettenis       saved_timer = timer_ptr;
1086*b725ae77Skettenis       timer_ptr = timer_ptr->next;
1087*b725ae77Skettenis       /* Call the procedure associated with that timer. */
1088*b725ae77Skettenis       (*saved_timer->proc) (saved_timer->client_data);
1089*b725ae77Skettenis       xfree (saved_timer);
1090*b725ae77Skettenis     }
1091*b725ae77Skettenis 
1092*b725ae77Skettenis   gdb_notifier.timeout_valid = 0;
1093*b725ae77Skettenis }
1094*b725ae77Skettenis 
1095*b725ae77Skettenis /* Check whether any timers in the timers queue are ready. If at least
1096*b725ae77Skettenis    one timer is ready, stick an event onto the event queue.  Even in
1097*b725ae77Skettenis    case more than one timer is ready, one event is enough, because the
1098*b725ae77Skettenis    handle_timer_event() will go through the timers list and call the
1099*b725ae77Skettenis    procedures associated with all that have expired. Update the
1100*b725ae77Skettenis    timeout for the select() or poll() as well. */
1101*b725ae77Skettenis static void
poll_timers(void)1102*b725ae77Skettenis poll_timers (void)
1103*b725ae77Skettenis {
1104*b725ae77Skettenis   struct timeval time_now, delta;
1105*b725ae77Skettenis   gdb_event *event_ptr;
1106*b725ae77Skettenis 
1107*b725ae77Skettenis   if (timer_list.first_timer != NULL)
1108*b725ae77Skettenis     {
1109*b725ae77Skettenis       gettimeofday (&time_now, NULL);
1110*b725ae77Skettenis       delta.tv_sec = timer_list.first_timer->when.tv_sec - time_now.tv_sec;
1111*b725ae77Skettenis       delta.tv_usec = timer_list.first_timer->when.tv_usec - time_now.tv_usec;
1112*b725ae77Skettenis       /* borrow? */
1113*b725ae77Skettenis       if (delta.tv_usec < 0)
1114*b725ae77Skettenis 	{
1115*b725ae77Skettenis 	  delta.tv_sec -= 1;
1116*b725ae77Skettenis 	  delta.tv_usec += 1000000;
1117*b725ae77Skettenis 	}
1118*b725ae77Skettenis 
1119*b725ae77Skettenis       /* Oops it expired already. Tell select / poll to return
1120*b725ae77Skettenis          immediately. (Cannot simply test if delta.tv_sec is negative
1121*b725ae77Skettenis          because time_t might be unsigned.)  */
1122*b725ae77Skettenis       if (timer_list.first_timer->when.tv_sec < time_now.tv_sec
1123*b725ae77Skettenis 	  || (timer_list.first_timer->when.tv_sec == time_now.tv_sec
1124*b725ae77Skettenis 	      && timer_list.first_timer->when.tv_usec < time_now.tv_usec))
1125*b725ae77Skettenis 	{
1126*b725ae77Skettenis 	  delta.tv_sec = 0;
1127*b725ae77Skettenis 	  delta.tv_usec = 0;
1128*b725ae77Skettenis 	}
1129*b725ae77Skettenis 
1130*b725ae77Skettenis       if (delta.tv_sec == 0 && delta.tv_usec == 0)
1131*b725ae77Skettenis 	{
1132*b725ae77Skettenis 	  event_ptr = (gdb_event *) xmalloc (sizeof (gdb_event));
1133*b725ae77Skettenis 	  event_ptr->proc = handle_timer_event;
1134*b725ae77Skettenis 	  event_ptr->fd = timer_list.first_timer->timer_id;
1135*b725ae77Skettenis 	  async_queue_event (event_ptr, TAIL);
1136*b725ae77Skettenis 	}
1137*b725ae77Skettenis 
1138*b725ae77Skettenis       /* Now we need to update the timeout for select/ poll, because we
1139*b725ae77Skettenis          don't want to sit there while this timer is expiring. */
1140*b725ae77Skettenis       if (use_poll)
1141*b725ae77Skettenis 	{
1142*b725ae77Skettenis #ifdef HAVE_POLL
1143*b725ae77Skettenis 	  gdb_notifier.poll_timeout = delta.tv_sec * 1000;
1144*b725ae77Skettenis #else
1145*b725ae77Skettenis 	  internal_error (__FILE__, __LINE__,
1146*b725ae77Skettenis 			  "use_poll without HAVE_POLL");
1147*b725ae77Skettenis #endif /* HAVE_POLL */
1148*b725ae77Skettenis 	}
1149*b725ae77Skettenis       else
1150*b725ae77Skettenis 	{
1151*b725ae77Skettenis 	  gdb_notifier.select_timeout.tv_sec = delta.tv_sec;
1152*b725ae77Skettenis 	  gdb_notifier.select_timeout.tv_usec = delta.tv_usec;
1153*b725ae77Skettenis 	}
1154*b725ae77Skettenis       gdb_notifier.timeout_valid = 1;
1155*b725ae77Skettenis     }
1156*b725ae77Skettenis   else
1157*b725ae77Skettenis     gdb_notifier.timeout_valid = 0;
1158*b725ae77Skettenis }
1159