OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [event-loop.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.