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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [event-loop.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* 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 gdb_do_one_event (void *data);
214
static int check_async_ready (void);
215
static void async_queue_event (gdb_event * event_ptr, queue_position position);
216
static gdb_event *create_file_event (int fd);
217
static int process_event (void);
218
static void handle_timer_event (int dummy);
219
static void poll_timers (void);
220
 
221
 
222
/* Insert an event object into the gdb event queue at
223
   the specified position.
224
   POSITION can be head or tail, with values TAIL, HEAD.
225
   EVENT_PTR points to the event to be inserted into the queue.
226
   The caller must allocate memory for the event. It is freed
227
   after the event has ben handled.
228
   Events in the queue will be processed head to tail, therefore,
229
   events inserted at the head of the queue will be processed
230
   as last in first out. Event appended at the tail of the queue
231
   will be processed first in first out. */
232
static void
233
async_queue_event (gdb_event * event_ptr, queue_position position)
234
{
235
  if (position == TAIL)
236
    {
237
      /* The event will become the new last_event. */
238
 
239
      event_ptr->next_event = NULL;
240
      if (event_queue.first_event == NULL)
241
        event_queue.first_event = event_ptr;
242
      else
243
        event_queue.last_event->next_event = event_ptr;
244
      event_queue.last_event = event_ptr;
245
    }
246
  else if (position == HEAD)
247
    {
248
      /* The event becomes the new first_event. */
249
 
250
      event_ptr->next_event = event_queue.first_event;
251
      if (event_queue.first_event == NULL)
252
        event_queue.last_event = event_ptr;
253
      event_queue.first_event = event_ptr;
254
    }
255
}
256
 
257
/* Create a file event, to be enqueued in the event queue for
258
   processing. The procedure associated to this event is always
259
   handle_file_event, which will in turn invoke the one that was
260
   associated to FD when it was registered with the event loop. */
261
static gdb_event *
262
create_file_event (int fd)
263
{
264
  gdb_event *file_event_ptr;
265
 
266
  file_event_ptr = (gdb_event *) xmalloc (sizeof (gdb_event));
267
  file_event_ptr->proc = handle_file_event;
268
  file_event_ptr->fd = fd;
269
  return (file_event_ptr);
270
}
271
 
272
/* Process one event.
273
   The event can be the next one to be serviced in the event queue,
274
   or an asynchronous event handler can be invoked in response to
275
   the reception of a signal.
276
   If an event was processed (either way), 1 is returned otherwise
277
 
278
   Scan the queue from head to tail, processing therefore the high
279
   priority events first, by invoking the associated event handler
280
   procedure. */
281
static int
282
process_event (void)
283
{
284
  gdb_event *event_ptr, *prev_ptr;
285
  event_handler_func *proc;
286
  int fd;
287
 
288
  /* First let's see if there are any asynchronous event handlers that
289
     are ready. These would be the result of invoking any of the
290
     signal handlers. */
291
 
292
  if (check_async_ready ())
293
    {
294
      invoke_async_signal_handler ();
295
      return 1;
296
    }
297
 
298
  /* Look in the event queue to find an event that is ready
299
     to be processed. */
300
 
301
  for (event_ptr = event_queue.first_event; event_ptr != NULL;
302
       event_ptr = event_ptr->next_event)
303
    {
304
      /* Call the handler for the event. */
305
 
306
      proc = event_ptr->proc;
307
      fd = event_ptr->fd;
308
 
309
      /* Let's get rid of the event from the event queue.  We need to
310
         do this now because while processing the event, the proc
311
         function could end up calling 'error' and therefore jump out
312
         to the caller of this function, gdb_do_one_event. In that
313
         case, we would have on the event queue an event wich has been
314
         processed, but not deleted. */
315
 
316
      if (event_queue.first_event == event_ptr)
317
        {
318
          event_queue.first_event = event_ptr->next_event;
319
          if (event_ptr->next_event == NULL)
320
            event_queue.last_event = NULL;
321
        }
322
      else
323
        {
324
          prev_ptr = event_queue.first_event;
325
          while (prev_ptr->next_event != event_ptr)
326
            prev_ptr = prev_ptr->next_event;
327
 
328
          prev_ptr->next_event = event_ptr->next_event;
329
          if (event_ptr->next_event == NULL)
330
            event_queue.last_event = prev_ptr;
331
        }
332
      xfree (event_ptr);
333
 
334
      /* Now call the procedure associated with the event. */
335
      (*proc) (fd);
336
      return 1;
337
    }
338
 
339
  /* this is the case if there are no event on the event queue. */
340
  return 0;
341
}
342
 
343
/* Process one high level event.  If nothing is ready at this time,
344
   wait for something to happen (via gdb_wait_for_event), then process
345
   it.  Returns >0 if something was done otherwise returns <0 (this
346
   can happen if there are no event sources to wait for).  If an error
347
   occurs catch_errors() which calls this function returns zero. */
348
 
349
static int
350
gdb_do_one_event (void *data)
351
{
352
  /* Any events already waiting in the queue? */
353
  if (process_event ())
354
    {
355
      return 1;
356
    }
357
 
358
  /* Are any timers that are ready? If so, put an event on the queue. */
359
  poll_timers ();
360
 
361
  /* Wait for a new event.  If gdb_wait_for_event returns -1,
362
     we should get out because this means that there are no
363
     event sources left. This will make the event loop stop,
364
     and the application exit. */
365
 
366
  if (gdb_wait_for_event () < 0)
367
    {
368
      return -1;
369
    }
370
 
371
  /* Handle any new events occurred while waiting. */
372
  if (process_event ())
373
    {
374
      return 1;
375
    }
376
 
377
  /* If gdb_wait_for_event has returned 1, it means that one
378
     event has been handled. We break out of the loop. */
379
  return 1;
380
}
381
 
382
/* Start up the event loop. This is the entry point to the event loop
383
   from the command loop. */
384
 
385
void
386
start_event_loop (void)
387
{
388
  /* Loop until there is nothing to do. This is the entry point to the
389
     event loop engine. gdb_do_one_event, called via catch_errors()
390
     will process one event for each invocation.  It blocks waits for
391
     an event and then processes it.  >0 when an event is processed, 0
392
     when catch_errors() caught an error and <0 when there are no
393
     longer any event sources registered. */
394
  while (1)
395
    {
396
      int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
397
      if (result < 0)
398
        break;
399
      if (result == 0)
400
        {
401
          /* FIXME: this should really be a call to a hook that is
402
             interface specific, because interfaces can display the
403
             prompt in their own way. */
404
          display_gdb_prompt (0);
405
          /* Maybe better to set a flag to be checked somewhere as to
406
             whether display the prompt or not. */
407
        }
408
    }
409
 
410
  /* We are done with the event loop. There are no more event sources
411
     to listen to.  So we exit GDB. */
412
  return;
413
}
414
 
415
 
416
/* Wrapper function for create_file_handler, so that the caller
417
   doesn't have to know implementation details about the use of poll
418
   vs. select. */
419
void
420
add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
421
{
422
#ifdef HAVE_POLL
423
  struct pollfd fds;
424
#endif
425
 
426
  if (use_poll)
427
    {
428
#ifdef HAVE_POLL
429
      /* Check to see if poll () is usable. If not, we'll switch to
430
         use select. This can happen on systems like
431
         m68k-motorola-sys, `poll' cannot be used to wait for `stdin'.
432
         On m68k-motorola-sysv, tty's are not stream-based and not
433
         `poll'able. */
434
      fds.fd = fd;
435
      fds.events = POLLIN;
436
      if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
437
        use_poll = 0;
438
#else
439
      internal_error (__FILE__, __LINE__,
440
                      "use_poll without HAVE_POLL");
441
#endif /* HAVE_POLL */
442
    }
443
  if (use_poll)
444
    {
445
#ifdef HAVE_POLL
446
      create_file_handler (fd, POLLIN, proc, client_data);
447
#else
448
      internal_error (__FILE__, __LINE__,
449
                      "use_poll without HAVE_POLL");
450
#endif
451
    }
452
  else
453
    create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, proc, client_data);
454
}
455
 
456
/* Add a file handler/descriptor to the list of descriptors we are
457
   interested in.
458
   FD is the file descriptor for the file/stream to be listened to.
459
   For the poll case, MASK is a combination (OR) of
460
   POLLIN, POLLRDNORM, POLLRDBAND, POLLPRI, POLLOUT, POLLWRNORM,
461
   POLLWRBAND: these are the events we are interested in. If any of them
462
   occurs, proc should be called.
463
   For the select case, MASK is a combination of READABLE, WRITABLE, EXCEPTION.
464
   PROC is the procedure that will be called when an event occurs for
465
   FD.  CLIENT_DATA is the argument to pass to PROC. */
466
static void
467
create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data client_data)
468
{
469
  file_handler *file_ptr;
470
 
471
  /* Do we already have a file handler for this file? (We may be
472
     changing its associated procedure). */
473
  for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
474
       file_ptr = file_ptr->next_file)
475
    {
476
      if (file_ptr->fd == fd)
477
        break;
478
    }
479
 
480
  /* It is a new file descriptor. Add it to the list. Otherwise, just
481
     change the data associated with it. */
482
  if (file_ptr == NULL)
483
    {
484
      file_ptr = (file_handler *) xmalloc (sizeof (file_handler));
485
      file_ptr->fd = fd;
486
      file_ptr->ready_mask = 0;
487
      file_ptr->next_file = gdb_notifier.first_file_handler;
488
      gdb_notifier.first_file_handler = file_ptr;
489
    }
490
  file_ptr->proc = proc;
491
  file_ptr->client_data = client_data;
492
  file_ptr->mask = mask;
493
 
494
  if (use_poll)
495
    {
496
#ifdef HAVE_POLL
497
      gdb_notifier.num_fds++;
498
      if (gdb_notifier.poll_fds)
499
        gdb_notifier.poll_fds =
500
          (struct pollfd *) xrealloc (gdb_notifier.poll_fds,
501
                                      (gdb_notifier.num_fds
502
                                       * sizeof (struct pollfd)));
503
      else
504
        gdb_notifier.poll_fds =
505
          (struct pollfd *) xmalloc (sizeof (struct pollfd));
506
      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
507
      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
508
      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
509
#else
510
      internal_error (__FILE__, __LINE__,
511
                      "use_poll without HAVE_POLL");
512
#endif /* HAVE_POLL */
513
    }
514
  else
515
    {
516
      if (mask & GDB_READABLE)
517
        FD_SET (fd, &gdb_notifier.check_masks[0]);
518
      else
519
        FD_CLR (fd, &gdb_notifier.check_masks[0]);
520
 
521
      if (mask & GDB_WRITABLE)
522
        FD_SET (fd, &gdb_notifier.check_masks[1]);
523
      else
524
        FD_CLR (fd, &gdb_notifier.check_masks[1]);
525
 
526
      if (mask & GDB_EXCEPTION)
527
        FD_SET (fd, &gdb_notifier.check_masks[2]);
528
      else
529
        FD_CLR (fd, &gdb_notifier.check_masks[2]);
530
 
531
      if (gdb_notifier.num_fds <= fd)
532
        gdb_notifier.num_fds = fd + 1;
533
    }
534
}
535
 
536
/* Remove the file descriptor FD from the list of monitored fd's:
537
   i.e. we don't care anymore about events on the FD. */
538
void
539
delete_file_handler (int fd)
540
{
541
  file_handler *file_ptr, *prev_ptr = NULL;
542
  int i;
543
#ifdef HAVE_POLL
544
  int j;
545
  struct pollfd *new_poll_fds;
546
#endif
547
 
548
  /* Find the entry for the given file. */
549
 
550
  for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
551
       file_ptr = file_ptr->next_file)
552
    {
553
      if (file_ptr->fd == fd)
554
        break;
555
    }
556
 
557
  if (file_ptr == NULL)
558
    return;
559
 
560
  if (use_poll)
561
    {
562
#ifdef HAVE_POLL
563
      /* Create a new poll_fds array by copying every fd's information but the
564
         one we want to get rid of. */
565
 
566
      new_poll_fds =
567
        (struct pollfd *) xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
568
 
569
      for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
570
        {
571
          if ((gdb_notifier.poll_fds + i)->fd != fd)
572
            {
573
              (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
574
              (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
575
              (new_poll_fds + j)->revents = (gdb_notifier.poll_fds + i)->revents;
576
              j++;
577
            }
578
        }
579
      xfree (gdb_notifier.poll_fds);
580
      gdb_notifier.poll_fds = new_poll_fds;
581
      gdb_notifier.num_fds--;
582
#else
583
      internal_error (__FILE__, __LINE__,
584
                      "use_poll without HAVE_POLL");
585
#endif /* HAVE_POLL */
586
    }
587
  else
588
    {
589
      if (file_ptr->mask & GDB_READABLE)
590
        FD_CLR (fd, &gdb_notifier.check_masks[0]);
591
      if (file_ptr->mask & GDB_WRITABLE)
592
        FD_CLR (fd, &gdb_notifier.check_masks[1]);
593
      if (file_ptr->mask & GDB_EXCEPTION)
594
        FD_CLR (fd, &gdb_notifier.check_masks[2]);
595
 
596
      /* Find current max fd. */
597
 
598
      if ((fd + 1) == gdb_notifier.num_fds)
599
        {
600
          gdb_notifier.num_fds--;
601
          for (i = gdb_notifier.num_fds; i; i--)
602
            {
603
              if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0])
604
                  || FD_ISSET (i - 1, &gdb_notifier.check_masks[1])
605
                  || FD_ISSET (i - 1, &gdb_notifier.check_masks[2]))
606
                break;
607
            }
608
          gdb_notifier.num_fds = i;
609
        }
610
    }
611
 
612
  /* Deactivate the file descriptor, by clearing its mask,
613
     so that it will not fire again. */
614
 
615
  file_ptr->mask = 0;
616
 
617
  /* Get rid of the file handler in the file handler list. */
618
  if (file_ptr == gdb_notifier.first_file_handler)
619
    gdb_notifier.first_file_handler = file_ptr->next_file;
620
  else
621
    {
622
      for (prev_ptr = gdb_notifier.first_file_handler;
623
           prev_ptr->next_file != file_ptr;
624
           prev_ptr = prev_ptr->next_file)
625
        ;
626
      prev_ptr->next_file = file_ptr->next_file;
627
    }
628
  xfree (file_ptr);
629
}
630
 
631
/* Handle the given event by calling the procedure associated to the
632
   corresponding file handler.  Called by process_event indirectly,
633
   through event_ptr->proc.  EVENT_FILE_DESC is file descriptor of the
634
   event in the front of the event queue. */
635
static void
636
handle_file_event (int event_file_desc)
637
{
638
  file_handler *file_ptr;
639
  int mask;
640
#ifdef HAVE_POLL
641
  int error_mask;
642
  int error_mask_returned;
643
#endif
644
 
645
  /* Search the file handler list to find one that matches the fd in
646
     the event. */
647
  for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
648
       file_ptr = file_ptr->next_file)
649
    {
650
      if (file_ptr->fd == event_file_desc)
651
        {
652
          /* With poll, the ready_mask could have any of three events
653
             set to 1: POLLHUP, POLLERR, POLLNVAL. These events cannot
654
             be used in the requested event mask (events), but they
655
             can be returned in the return mask (revents). We need to
656
             check for those event too, and add them to the mask which
657
             will be passed to the handler. */
658
 
659
          /* See if the desired events (mask) match the received
660
             events (ready_mask). */
661
 
662
          if (use_poll)
663
            {
664
#ifdef HAVE_POLL
665
              error_mask = POLLHUP | POLLERR | POLLNVAL;
666
              mask = (file_ptr->ready_mask & file_ptr->mask) |
667
                (file_ptr->ready_mask & error_mask);
668
              error_mask_returned = mask & error_mask;
669
 
670
              if (error_mask_returned != 0)
671
                {
672
                  /* Work in progress. We may need to tell somebody what
673
                     kind of error we had. */
674
                  if (error_mask_returned & POLLHUP)
675
                    printf_unfiltered ("Hangup detected on fd %d\n", file_ptr->fd);
676
                  if (error_mask_returned & POLLERR)
677
                    printf_unfiltered ("Error detected on fd %d\n", file_ptr->fd);
678
                  if (error_mask_returned & POLLNVAL)
679
                    printf_unfiltered ("Invalid or non-`poll'able fd %d\n", file_ptr->fd);
680
                  file_ptr->error = 1;
681
                }
682
              else
683
                file_ptr->error = 0;
684
#else
685
              internal_error (__FILE__, __LINE__,
686
                              "use_poll without HAVE_POLL");
687
#endif /* HAVE_POLL */
688
            }
689
          else
690
            {
691
              if (file_ptr->ready_mask & GDB_EXCEPTION)
692
                {
693
                  printf_unfiltered ("Exception condition detected on fd %d\n", file_ptr->fd);
694
                  file_ptr->error = 1;
695
                }
696
              else
697
                file_ptr->error = 0;
698
              mask = file_ptr->ready_mask & file_ptr->mask;
699
            }
700
 
701
          /* Clear the received events for next time around. */
702
          file_ptr->ready_mask = 0;
703
 
704
          /* If there was a match, then call the handler. */
705
          if (mask != 0)
706
            (*file_ptr->proc) (file_ptr->error, file_ptr->client_data);
707
          break;
708
        }
709
    }
710
}
711
 
712
/* Called by gdb_do_one_event to wait for new events on the
713
   monitored file descriptors. Queue file events as they are
714
   detected by the poll.
715
   If there are no events, this function will block in the
716
   call to poll.
717
   Return -1 if there are no files descriptors to monitor,
718
   otherwise return 0. */
719
static int
720
gdb_wait_for_event (void)
721
{
722
  file_handler *file_ptr;
723
  gdb_event *file_event_ptr;
724
  int num_found = 0;
725
  int i;
726
 
727
  /* Make sure all output is done before getting another event. */
728
  gdb_flush (gdb_stdout);
729
  gdb_flush (gdb_stderr);
730
 
731
  if (gdb_notifier.num_fds == 0)
732
    return -1;
733
 
734
  if (use_poll)
735
    {
736
#ifdef HAVE_POLL
737
      num_found =
738
        poll (gdb_notifier.poll_fds,
739
              (unsigned long) gdb_notifier.num_fds,
740
              gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1);
741
 
742
      /* Don't print anything if we get out of poll because of a
743
         signal. */
744
      if (num_found == -1 && errno != EINTR)
745
        perror_with_name ("Poll");
746
#else
747
      internal_error (__FILE__, __LINE__,
748
                      "use_poll without HAVE_POLL");
749
#endif /* HAVE_POLL */
750
    }
751
  else
752
    {
753
      gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
754
      gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
755
      gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
756
      num_found = select (gdb_notifier.num_fds,
757
                          &gdb_notifier.ready_masks[0],
758
                          &gdb_notifier.ready_masks[1],
759
                          &gdb_notifier.ready_masks[2],
760
                          gdb_notifier.timeout_valid
761
                          ? &gdb_notifier.select_timeout : NULL);
762
 
763
      /* Clear the masks after an error from select. */
764
      if (num_found == -1)
765
        {
766
          FD_ZERO (&gdb_notifier.ready_masks[0]);
767
          FD_ZERO (&gdb_notifier.ready_masks[1]);
768
          FD_ZERO (&gdb_notifier.ready_masks[2]);
769
          /* Dont print anything is we got a signal, let gdb handle it. */
770
          if (errno != EINTR)
771
            perror_with_name ("Select");
772
        }
773
    }
774
 
775
  /* Enqueue all detected file events. */
776
 
777
  if (use_poll)
778
    {
779
#ifdef HAVE_POLL
780
      for (i = 0; (i < gdb_notifier.num_fds) && (num_found > 0); i++)
781
        {
782
          if ((gdb_notifier.poll_fds + i)->revents)
783
            num_found--;
784
          else
785
            continue;
786
 
787
          for (file_ptr = gdb_notifier.first_file_handler;
788
               file_ptr != NULL;
789
               file_ptr = file_ptr->next_file)
790
            {
791
              if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd)
792
                break;
793
            }
794
 
795
          if (file_ptr)
796
            {
797
              /* Enqueue an event only if this is still a new event for
798
                 this fd. */
799
              if (file_ptr->ready_mask == 0)
800
                {
801
                  file_event_ptr = create_file_event (file_ptr->fd);
802
                  async_queue_event (file_event_ptr, TAIL);
803
                }
804
            }
805
 
806
          file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
807
        }
808
#else
809
      internal_error (__FILE__, __LINE__,
810
                      "use_poll without HAVE_POLL");
811
#endif /* HAVE_POLL */
812
    }
813
  else
814
    {
815
      for (file_ptr = gdb_notifier.first_file_handler;
816
           (file_ptr != NULL) && (num_found > 0);
817
           file_ptr = file_ptr->next_file)
818
        {
819
          int mask = 0;
820
 
821
          if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0]))
822
            mask |= GDB_READABLE;
823
          if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1]))
824
            mask |= GDB_WRITABLE;
825
          if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2]))
826
            mask |= GDB_EXCEPTION;
827
 
828
          if (!mask)
829
            continue;
830
          else
831
            num_found--;
832
 
833
          /* Enqueue an event only if this is still a new event for
834
             this fd. */
835
 
836
          if (file_ptr->ready_mask == 0)
837
            {
838
              file_event_ptr = create_file_event (file_ptr->fd);
839
              async_queue_event (file_event_ptr, TAIL);
840
            }
841
          file_ptr->ready_mask = mask;
842
        }
843
    }
844
  return 0;
845
}
846
 
847
 
848
/* Create an asynchronous handler, allocating memory for it.
849
   Return a pointer to the newly created handler.
850
   This pointer will be used to invoke the handler by
851
   invoke_async_signal_handler.
852
   PROC is the function to call with CLIENT_DATA argument
853
   whenever the handler is invoked. */
854
async_signal_handler *
855
create_async_signal_handler (sig_handler_func * proc, gdb_client_data client_data)
856
{
857
  async_signal_handler *async_handler_ptr;
858
 
859
  async_handler_ptr =
860
    (async_signal_handler *) xmalloc (sizeof (async_signal_handler));
861
  async_handler_ptr->ready = 0;
862
  async_handler_ptr->next_handler = NULL;
863
  async_handler_ptr->proc = proc;
864
  async_handler_ptr->client_data = client_data;
865
  if (sighandler_list.first_handler == NULL)
866
    sighandler_list.first_handler = async_handler_ptr;
867
  else
868
    sighandler_list.last_handler->next_handler = async_handler_ptr;
869
  sighandler_list.last_handler = async_handler_ptr;
870
  return async_handler_ptr;
871
}
872
 
873
/* Mark the handler (ASYNC_HANDLER_PTR) as ready. This information will
874
   be used when the handlers are invoked, after we have waited for
875
   some event.  The caller of this function is the interrupt handler
876
   associated with a signal. */
877
void
878
mark_async_signal_handler (async_signal_handler * async_handler_ptr)
879
{
880
  ((async_signal_handler *) async_handler_ptr)->ready = 1;
881
  async_handler_ready = 1;
882
}
883
 
884
/* Call all the handlers that are ready. */
885
static void
886
invoke_async_signal_handler (void)
887
{
888
  async_signal_handler *async_handler_ptr;
889
 
890
  if (async_handler_ready == 0)
891
    return;
892
  async_handler_ready = 0;
893
 
894
  /* Invoke ready handlers. */
895
 
896
  while (1)
897
    {
898
      for (async_handler_ptr = sighandler_list.first_handler;
899
           async_handler_ptr != NULL;
900
           async_handler_ptr = async_handler_ptr->next_handler)
901
        {
902
          if (async_handler_ptr->ready)
903
            break;
904
        }
905
      if (async_handler_ptr == NULL)
906
        break;
907
      async_handler_ptr->ready = 0;
908
      (*async_handler_ptr->proc) (async_handler_ptr->client_data);
909
    }
910
 
911
  return;
912
}
913
 
914
/* Delete an asynchronous handler (ASYNC_HANDLER_PTR).
915
   Free the space allocated for it.  */
916
void
917
delete_async_signal_handler (async_signal_handler ** async_handler_ptr)
918
{
919
  async_signal_handler *prev_ptr;
920
 
921
  if (sighandler_list.first_handler == (*async_handler_ptr))
922
    {
923
      sighandler_list.first_handler = (*async_handler_ptr)->next_handler;
924
      if (sighandler_list.first_handler == NULL)
925
        sighandler_list.last_handler = NULL;
926
    }
927
  else
928
    {
929
      prev_ptr = sighandler_list.first_handler;
930
      while (prev_ptr->next_handler != (*async_handler_ptr) && prev_ptr)
931
        prev_ptr = prev_ptr->next_handler;
932
      prev_ptr->next_handler = (*async_handler_ptr)->next_handler;
933
      if (sighandler_list.last_handler == (*async_handler_ptr))
934
        sighandler_list.last_handler = prev_ptr;
935
    }
936
  xfree ((*async_handler_ptr));
937
  (*async_handler_ptr) = NULL;
938
}
939
 
940
/* Is it necessary to call invoke_async_signal_handler? */
941
static int
942
check_async_ready (void)
943
{
944
  return async_handler_ready;
945
}
946
 
947
/* Create a timer that will expire in MILLISECONDS from now. When the
948
   timer is ready, PROC will be executed. At creation, the timer is
949
   aded to the timers queue.  This queue is kept sorted in order of
950
   increasing timers. Return a handle to the timer struct. */
951
int
952
create_timer (int milliseconds, timer_handler_func * proc, gdb_client_data client_data)
953
{
954
  struct gdb_timer *timer_ptr, *timer_index, *prev_timer;
955
  struct timeval time_now, delta;
956
 
957
  /* compute seconds */
958
  delta.tv_sec = milliseconds / 1000;
959
  /* compute microseconds */
960
  delta.tv_usec = (milliseconds % 1000) * 1000;
961
 
962
  gettimeofday (&time_now, NULL);
963
 
964
  timer_ptr = (struct gdb_timer *) xmalloc (sizeof (gdb_timer));
965
  timer_ptr->when.tv_sec = time_now.tv_sec + delta.tv_sec;
966
  timer_ptr->when.tv_usec = time_now.tv_usec + delta.tv_usec;
967
  /* carry? */
968
  if (timer_ptr->when.tv_usec >= 1000000)
969
    {
970
      timer_ptr->when.tv_sec += 1;
971
      timer_ptr->when.tv_usec -= 1000000;
972
    }
973
  timer_ptr->proc = proc;
974
  timer_ptr->client_data = client_data;
975
  timer_list.num_timers++;
976
  timer_ptr->timer_id = timer_list.num_timers;
977
 
978
  /* Now add the timer to the timer queue, making sure it is sorted in
979
     increasing order of expiration. */
980
 
981
  for (timer_index = timer_list.first_timer;
982
       timer_index != NULL;
983
       timer_index = timer_index->next)
984
    {
985
      /* If the seconds field is greater or if it is the same, but the
986
         microsecond field is greater. */
987
      if ((timer_index->when.tv_sec > timer_ptr->when.tv_sec) ||
988
          ((timer_index->when.tv_sec == timer_ptr->when.tv_sec)
989
           && (timer_index->when.tv_usec > timer_ptr->when.tv_usec)))
990
        break;
991
    }
992
 
993
  if (timer_index == timer_list.first_timer)
994
    {
995
      timer_ptr->next = timer_list.first_timer;
996
      timer_list.first_timer = timer_ptr;
997
 
998
    }
999
  else
1000
    {
1001
      for (prev_timer = timer_list.first_timer;
1002
           prev_timer->next != timer_index;
1003
           prev_timer = prev_timer->next)
1004
        ;
1005
 
1006
      prev_timer->next = timer_ptr;
1007
      timer_ptr->next = timer_index;
1008
    }
1009
 
1010
  gdb_notifier.timeout_valid = 0;
1011
  return timer_ptr->timer_id;
1012
}
1013
 
1014
/* There is a chance that the creator of the timer wants to get rid of
1015
   it before it expires. */
1016
void
1017
delete_timer (int id)
1018
{
1019
  struct gdb_timer *timer_ptr, *prev_timer = NULL;
1020
 
1021
  /* Find the entry for the given timer. */
1022
 
1023
  for (timer_ptr = timer_list.first_timer; timer_ptr != NULL;
1024
       timer_ptr = timer_ptr->next)
1025
    {
1026
      if (timer_ptr->timer_id == id)
1027
        break;
1028
    }
1029
 
1030
  if (timer_ptr == NULL)
1031
    return;
1032
  /* Get rid of the timer in the timer list. */
1033
  if (timer_ptr == timer_list.first_timer)
1034
    timer_list.first_timer = timer_ptr->next;
1035
  else
1036
    {
1037
      for (prev_timer = timer_list.first_timer;
1038
           prev_timer->next != timer_ptr;
1039
           prev_timer = prev_timer->next)
1040
        ;
1041
      prev_timer->next = timer_ptr->next;
1042
    }
1043
  xfree (timer_ptr);
1044
 
1045
  gdb_notifier.timeout_valid = 0;
1046
}
1047
 
1048
/* When a timer event is put on the event queue, it will be handled by
1049
   this function.  Just call the assiciated procedure and delete the
1050
   timer event from the event queue. Repeat this for each timer that
1051
   has expired. */
1052
static void
1053
handle_timer_event (int dummy)
1054
{
1055
  struct timeval time_now;
1056
  struct gdb_timer *timer_ptr, *saved_timer;
1057
 
1058
  gettimeofday (&time_now, NULL);
1059
  timer_ptr = timer_list.first_timer;
1060
 
1061
  while (timer_ptr != NULL)
1062
    {
1063
      if ((timer_ptr->when.tv_sec > time_now.tv_sec) ||
1064
          ((timer_ptr->when.tv_sec == time_now.tv_sec) &&
1065
           (timer_ptr->when.tv_usec > time_now.tv_usec)))
1066
        break;
1067
 
1068
      /* Get rid of the timer from the beginning of the list. */
1069
      timer_list.first_timer = timer_ptr->next;
1070
      saved_timer = timer_ptr;
1071
      timer_ptr = timer_ptr->next;
1072
      /* Call the procedure associated with that timer. */
1073
      (*saved_timer->proc) (saved_timer->client_data);
1074
      xfree (saved_timer);
1075
    }
1076
 
1077
  gdb_notifier.timeout_valid = 0;
1078
}
1079
 
1080
/* Check whether any timers in the timers queue are ready. If at least
1081
   one timer is ready, stick an event onto the event queue.  Even in
1082
   case more than one timer is ready, one event is enough, because the
1083
   handle_timer_event() will go through the timers list and call the
1084
   procedures associated with all that have expired. Update the
1085
   timeout for the select() or poll() as well. */
1086
static void
1087
poll_timers (void)
1088
{
1089
  struct timeval time_now, delta;
1090
  gdb_event *event_ptr;
1091
 
1092
  if (timer_list.first_timer != NULL)
1093
    {
1094
      gettimeofday (&time_now, NULL);
1095
      delta.tv_sec = timer_list.first_timer->when.tv_sec - time_now.tv_sec;
1096
      delta.tv_usec = timer_list.first_timer->when.tv_usec - time_now.tv_usec;
1097
      /* borrow? */
1098
      if (delta.tv_usec < 0)
1099
        {
1100
          delta.tv_sec -= 1;
1101
          delta.tv_usec += 1000000;
1102
        }
1103
 
1104
      /* Oops it expired already. Tell select / poll to return
1105
         immediately. (Cannot simply test if delta.tv_sec is negative
1106
         because time_t might be unsigned.)  */
1107
      if (timer_list.first_timer->when.tv_sec < time_now.tv_sec
1108
          || (timer_list.first_timer->when.tv_sec == time_now.tv_sec
1109
              && timer_list.first_timer->when.tv_usec < time_now.tv_usec))
1110
        {
1111
          delta.tv_sec = 0;
1112
          delta.tv_usec = 0;
1113
        }
1114
 
1115
      if (delta.tv_sec == 0 && delta.tv_usec == 0)
1116
        {
1117
          event_ptr = (gdb_event *) xmalloc (sizeof (gdb_event));
1118
          event_ptr->proc = handle_timer_event;
1119
          event_ptr->fd = timer_list.first_timer->timer_id;
1120
          async_queue_event (event_ptr, TAIL);
1121
        }
1122
 
1123
      /* Now we need to update the timeout for select/ poll, because we
1124
         don't want to sit there while this timer is expiring. */
1125
      if (use_poll)
1126
        {
1127
#ifdef HAVE_POLL
1128
          gdb_notifier.poll_timeout = delta.tv_sec * 1000;
1129
#else
1130
          internal_error (__FILE__, __LINE__,
1131
                          "use_poll without HAVE_POLL");
1132
#endif /* HAVE_POLL */
1133
        }
1134
      else
1135
        {
1136
          gdb_notifier.select_timeout.tv_sec = delta.tv_sec;
1137
          gdb_notifier.select_timeout.tv_usec = delta.tv_usec;
1138
        }
1139
      gdb_notifier.timeout_valid = 1;
1140
    }
1141
  else
1142
    gdb_notifier.timeout_valid = 0;
1143
}

powered by: WebSVN 2.1.0

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