Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Re: HAVE_POLL is not enough - RFA
       [not found] <14525.29055.263209.524839@kwikemart.cygnus.com>
@ 2000-03-18  2:28 ` Philippe De Muyter
       [not found]   ` <38D5BE1D.7BB02C99@cygnus.com>
  0 siblings, 1 reply; 3+ messages in thread
From: Philippe De Muyter @ 2000-03-18  2:28 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: ac131313, ezannoni, gdb-patches

I implemented the runtime poll/select selection.  The patch seems huge because
of the indentation changes caused by replacing
#if HAVE_POLL
	some_code
#else
	some_other_code
#endif

by

#if HAVE_POLL
	if (!use_select)
	  {
	    some_code
	  }
	else
#endif
	  {
	    some_other_code
	  }

I have tested it on m68k-motorola-sysv and powerpc-ibm-aix4.1.5.0

OK to apply ?

Sat Mar 18 11:05:38 2000  Philippe De Muyter  <phdm@macqel.be>

        * event-loop.c (sys/types.h): File now included unconditionally.
        (gdb_notifier): poll- and select-versions merged.
        (add_file_handler): If HAVE_POLL, do a runtime check whether poll
        is usable, and set `use_select' accordingly.
        (create_file_handler): Select poll or select version according to
        `use_select'.
        (delete_file_handler, handle_file_event): Likewise.
        (gdb_wait_for_event, poll_timers): Likewise.

Index: gdb/event-loop.c
===================================================================
RCS file: /cvs/src/src/gdb/event-loop.c,v
retrieving revision 1.3
diff -u -p -r1.3 event-loop.c
--- event-loop.c	2000/03/06 17:07:03	1.3
+++ event-loop.c	2000/03/18 10:06:38
@@ -25,9 +25,8 @@
 #include "event-top.h"
 #ifdef HAVE_POLL
 #include <poll.h>
-#else
-#include <sys/types.h>
 #endif
+#include <sys/types.h>
 #include <errno.h>
 #include <setjmp.h>
 #include <sys/time.h>
@@ -159,36 +158,23 @@ event_queue;
 /* As of 1999-04-30 only the input file descriptor is registered with the
    event loop. */
 
-#ifdef HAVE_POLL
 /* Poll based implementation of the notifier. */
 
 static struct
   {
+    /* Do we use poll or select ? */
+    unsigned char use_select;
+
     /* Ptr to head of file handler list. */
     file_handler *first_file_handler;
 
+#ifdef HAVE_POLL
     /* Ptr to array of pollfd structures. */
     struct pollfd *poll_fds;
 
-    /* Number of file descriptors to monitor. */
-    int num_fds;
-
     /* Timeout in milliseconds for calls to poll(). */
-    int timeout;
-
-    /* Flag to tell whether the timeout value shuld be used. */
-    int timeout_valid;
-  }
-gdb_notifier;
-
-#else /* ! HAVE_POLL */
-
-/* Select based implementation of the notifier. */
-
-static struct
-  {
-    /* Ptr to head of file handler list. */
-    file_handler *first_file_handler;
+    int poll_timeout;
+#endif
 
     /* Masks to be used in the next call to select.
        Bits are set in response to calls to create_file_handler. */
@@ -197,19 +183,18 @@ static struct
     /* What file descriptors were found ready by select. */
     fd_mask ready_masks[3 * MASK_SIZE];
 
-    /* Number of valid bits (highest fd value + 1). */
+    /* Number of file descriptors to monitor. (for poll) */
+    /* Number of valid bits (highest fd value + 1). (for select) */
     int num_fds;
 
     /* Time structure for calls to select(). */
-    struct timeval timeout;
+    struct timeval select_timeout;
 
-    /* Flag to tell whether the timeout struct should be used. */
+    /* Flag to tell whether the timeout should be used. */
     int timeout_valid;
   }
 gdb_notifier;
 
-#endif /* HAVE_POLL */
-
 /* Structure associated with a timer. PROC will be executed at the
    first occasion after WHEN. */
 struct gdb_timer
@@ -377,7 +362,7 @@ process_event (void)
 	}
       free ((char *) event_ptr);
 
-      /* Now call the procedure associted with the event. */
+      /* Now call the procedure associated with the event. */
       (*proc) (fd);
       return 1;
     }
@@ -466,10 +451,21 @@ void
 add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
 {
 #ifdef HAVE_POLL
-  create_file_handler (fd, POLLIN, proc, client_data);
-#else
-  create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, proc, client_data);
-#endif
+  struct pollfd fds;
+
+  if (!gdb_notifier.use_select)
+    {
+
+    fds.fd = fd;
+    fds.events = POLLIN;
+    if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
+      gdb_notifier.use_select = 1;
+    }
+  if (!gdb_notifier.use_select)
+    create_file_handler (fd, POLLIN, proc, client_data);
+  else
+#endif /* HAVE_POLL */
+    create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, proc, client_data);
 }
 
 /* Add a file handler/descriptor to the list of descriptors we are
@@ -487,9 +483,7 @@ create_file_handler (int fd, int mask, h
 {
   file_handler *file_ptr;
 
-#ifndef HAVE_POLL
   int index, bit;
-#endif
 
   /* Do we already have a file handler for this file? (We may be
      changing its associated procedure). */
@@ -509,9 +503,6 @@ create_file_handler (int fd, int mask, h
       file_ptr->ready_mask = 0;
       file_ptr->next_file = gdb_notifier.first_file_handler;
       gdb_notifier.first_file_handler = file_ptr;
-#ifdef HAVE_POLL
-      gdb_notifier.num_fds++;
-#endif
     }
   file_ptr->proc = proc;
   file_ptr->client_data = client_data;
@@ -519,41 +510,47 @@ create_file_handler (int fd, int mask, h
 
 #ifdef HAVE_POLL
 
-  if (gdb_notifier.poll_fds)
-    gdb_notifier.poll_fds =
-      (struct pollfd *) realloc (gdb_notifier.poll_fds,
-			   (gdb_notifier.num_fds) * sizeof (struct pollfd));
+  if (!gdb_notifier.use_select)
+    {
+      gdb_notifier.num_fds++;
+      if (gdb_notifier.poll_fds)
+	gdb_notifier.poll_fds =
+	  (struct pollfd *) realloc (gdb_notifier.poll_fds,
+			       (gdb_notifier.num_fds) * sizeof (struct pollfd));
+      else
+	gdb_notifier.poll_fds =
+	  (struct pollfd *) xmalloc (sizeof (struct pollfd));
+      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
+      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
+      (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
+    }
   else
-    gdb_notifier.poll_fds =
-      (struct pollfd *) xmalloc (sizeof (struct pollfd));
-  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
-  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
-  (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
 
-#else /* ! HAVE_POLL */
+#endif /* HAVE_POLL */
 
-  index = fd / (NBBY * sizeof (fd_mask));
-  bit = 1 << (fd % (NBBY * sizeof (fd_mask)));
+    {
+      index = fd / (NBBY * sizeof (fd_mask));
+      bit = 1 << (fd % (NBBY * sizeof (fd_mask)));
 
-  if (mask & GDB_READABLE)
-    gdb_notifier.check_masks[index] |= bit;
-  else
-    gdb_notifier.check_masks[index] &= ~bit;
+      if (mask & GDB_READABLE)
+	gdb_notifier.check_masks[index] |= bit;
+      else
+	gdb_notifier.check_masks[index] &= ~bit;
 
-  if (mask & GDB_WRITABLE)
-    (gdb_notifier.check_masks + MASK_SIZE)[index] |= bit;
-  else
-    (gdb_notifier.check_masks + MASK_SIZE)[index] &= ~bit;
+      if (mask & GDB_WRITABLE)
+	(gdb_notifier.check_masks + MASK_SIZE)[index] |= bit;
+      else
+	(gdb_notifier.check_masks + MASK_SIZE)[index] &= ~bit;
 
-  if (mask & GDB_EXCEPTION)
-    (gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] |= bit;
-  else
-    (gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] &= ~bit;
+      if (mask & GDB_EXCEPTION)
+	(gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] |= bit;
+      else
+	(gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] &= ~bit;
 
-  if (gdb_notifier.num_fds <= fd)
-    gdb_notifier.num_fds = fd + 1;
+      if (gdb_notifier.num_fds <= fd)
+	gdb_notifier.num_fds = fd + 1;
+    }
 
-#endif /* HAVE_POLL */
 }
 
 /* Remove the file descriptor FD from the list of monitored fd's: 
@@ -564,10 +561,8 @@ delete_file_handler (int fd)
   file_handler *file_ptr, *prev_ptr = NULL;
   int i, j;
   struct pollfd *new_poll_fds;
-#ifndef HAVE_POLL
   int index, bit;
   unsigned long flags;
-#endif
 
   /* Find the entry for the given file. */
 
@@ -582,60 +577,65 @@ delete_file_handler (int fd)
     return;
 
 #ifdef HAVE_POLL
-  /* Create a new poll_fds array by copying every fd's information but the
-     one we want to get rid of. */
+  if (!gdb_notifier.use_select)
+    {
+      /* Create a new poll_fds array by copying every fd's information but the
+	 one we want to get rid of. */
 
-  new_poll_fds =
-    (struct pollfd *) xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
+      new_poll_fds =
+	(struct pollfd *) xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
 
-  for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
-    {
-      if ((gdb_notifier.poll_fds + i)->fd != fd)
+      for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
 	{
-	  (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
-	  (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
-	  (new_poll_fds + j)->revents = (gdb_notifier.poll_fds + i)->revents;
-	  j++;
+	  if ((gdb_notifier.poll_fds + i)->fd != fd)
+	    {
+	      (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
+	      (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
+	      (new_poll_fds + j)->revents = (gdb_notifier.poll_fds + i)->revents;
+	      j++;
+	    }
 	}
+      free (gdb_notifier.poll_fds);
+      gdb_notifier.poll_fds = new_poll_fds;
+      gdb_notifier.num_fds--;
     }
-  free (gdb_notifier.poll_fds);
-  gdb_notifier.poll_fds = new_poll_fds;
-  gdb_notifier.num_fds--;
+  else
 
-#else /* ! HAVE_POLL */
+#endif /* HAVE_POLL */
 
-  index = fd / (NBBY * sizeof (fd_mask));
-  bit = 1 << (fd % (NBBY * sizeof (fd_mask)));
+    {
+      index = fd / (NBBY * sizeof (fd_mask));
+      bit = 1 << (fd % (NBBY * sizeof (fd_mask)));
 
-  if (file_ptr->mask & GDB_READABLE)
-    gdb_notifier.check_masks[index] &= ~bit;
-  if (file_ptr->mask & GDB_WRITABLE)
-    (gdb_notifier.check_masks + MASK_SIZE)[index] &= ~bit;
-  if (file_ptr->mask & GDB_EXCEPTION)
-    (gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] &= ~bit;
+      if (file_ptr->mask & GDB_READABLE)
+	gdb_notifier.check_masks[index] &= ~bit;
+      if (file_ptr->mask & GDB_WRITABLE)
+	(gdb_notifier.check_masks + MASK_SIZE)[index] &= ~bit;
+      if (file_ptr->mask & GDB_EXCEPTION)
+	(gdb_notifier.check_masks + 2 * (MASK_SIZE))[index] &= ~bit;
 
-  /* Find current max fd. */
+      /* Find current max fd. */
 
-  if ((fd + 1) == gdb_notifier.num_fds)
-    {
-      for (gdb_notifier.num_fds = 0; index >= 0; index--)
+      if ((fd + 1) == gdb_notifier.num_fds)
 	{
-	  flags = gdb_notifier.check_masks[index]
-	    | (gdb_notifier.check_masks + MASK_SIZE)[index]
-	    | (gdb_notifier.check_masks + 2 * (MASK_SIZE))[index];
-	  if (flags)
+	  for (gdb_notifier.num_fds = 0; index >= 0; index--)
 	    {
-	      for (i = (NBBY * sizeof (fd_mask)); i > 0; i--)
+	      flags = gdb_notifier.check_masks[index]
+		| (gdb_notifier.check_masks + MASK_SIZE)[index]
+		| (gdb_notifier.check_masks + 2 * (MASK_SIZE))[index];
+	      if (flags)
 		{
-		  if (flags & (((unsigned long) 1) << (i - 1)))
-		    break;
+		  for (i = (NBBY * sizeof (fd_mask)); i > 0; i--)
+		    {
+		      if (flags & (((unsigned long) 1) << (i - 1)))
+			break;
+		    }
+		  gdb_notifier.num_fds = index * (NBBY * sizeof (fd_mask)) + i;
+		  break;
 		}
-	      gdb_notifier.num_fds = index * (NBBY * sizeof (fd_mask)) + i;
-	      break;
 	    }
 	}
     }
-#endif /* HAVE_POLL */
 
   /* Deactivate the file descriptor, by clearing its mask, 
      so that it will not fire again. */
@@ -688,35 +688,40 @@ handle_file_event (int event_file_desc)
 	     events (ready_mask). */
 
 #ifdef HAVE_POLL
-	  error_mask = POLLHUP | POLLERR | POLLNVAL;
-	  mask = (file_ptr->ready_mask & file_ptr->mask) |
-	    (file_ptr->ready_mask & error_mask);
-	  error_mask_returned = mask & error_mask;
-
-	  if (error_mask_returned != 0)
+	  if (!gdb_notifier.use_select)
 	    {
-	      /* Work in progress. We may need to tell somebody what
-	         kind of error we had. */
-	      if (error_mask_returned & POLLHUP)
-		printf_unfiltered ("Hangup detected on fd %d\n", file_ptr->fd);
-	      if (error_mask_returned & POLLERR)
-		printf_unfiltered ("Error detected on fd %d\n", file_ptr->fd);
-	      if (error_mask_returned & POLLNVAL)
-		printf_unfiltered ("Invalid or non-`poll'able fd %d\n", file_ptr->fd);
-	      file_ptr->error = 1;
+	      error_mask = POLLHUP | POLLERR | POLLNVAL;
+	      mask = (file_ptr->ready_mask & file_ptr->mask) |
+		(file_ptr->ready_mask & error_mask);
+	      error_mask_returned = mask & error_mask;
+
+	      if (error_mask_returned != 0)
+		{
+		  /* Work in progress. We may need to tell somebody what
+		     kind of error we had. */
+		  if (error_mask_returned & POLLHUP)
+		    printf_unfiltered ("Hangup detected on fd %d\n", file_ptr->fd);
+		  if (error_mask_returned & POLLERR)
+		    printf_unfiltered ("Error detected on fd %d\n", file_ptr->fd);
+		  if (error_mask_returned & POLLNVAL)
+		    printf_unfiltered ("Invalid or non-`poll'able fd %d\n", file_ptr->fd);
+		  file_ptr->error = 1;
+		}
+	      else
+		file_ptr->error = 0;
 	    }
 	  else
-	    file_ptr->error = 0;
-#else /* ! HAVE_POLL */
-	  if (file_ptr->ready_mask & GDB_EXCEPTION)
+#endif /* HAVE_POLL */
 	    {
-	      printf_unfiltered ("Exception condition detected on fd %d\n", file_ptr->fd);
-	      file_ptr->error = 1;
+	      if (file_ptr->ready_mask & GDB_EXCEPTION)
+		{
+		  printf_unfiltered ("Exception condition detected on fd %d\n", file_ptr->fd);
+		  file_ptr->error = 1;
+		}
+	      else
+		file_ptr->error = 0;
+	      mask = file_ptr->ready_mask & file_ptr->mask;
 	    }
-	  else
-	    file_ptr->error = 0;
-	  mask = file_ptr->ready_mask & file_ptr->mask;
-#endif /* HAVE_POLL */
 
 	  /* Clear the received events for next time around. */
 	  file_ptr->ready_mask = 0;
@@ -744,9 +749,7 @@ gdb_wait_for_event (void)
   int num_found = 0;
   int i;
 
-#ifndef HAVE_POLL
   int mask, bit, index;
-#endif
 
   /* Make sure all output is done before getting another event. */
   gdb_flush (gdb_stdout);
@@ -756,103 +759,114 @@ gdb_wait_for_event (void)
     return -1;
 
 #ifdef HAVE_POLL
-  num_found =
-    poll (gdb_notifier.poll_fds,
-	  (unsigned long) gdb_notifier.num_fds,
-	  gdb_notifier.timeout_valid ? gdb_notifier.timeout : -1);
-
-  /* Don't print anything if we get out of poll because of a
-     signal. */
-  if (num_found == -1 && errno != EINTR)
-    perror_with_name ("Poll");
-
-#else /* ! HAVE_POLL */
-  memcpy (gdb_notifier.ready_masks,
-	  gdb_notifier.check_masks,
-	  3 * MASK_SIZE * sizeof (fd_mask));
-  num_found = select (gdb_notifier.num_fds,
-		      (SELECT_MASK *) & gdb_notifier.ready_masks[0],
-		      (SELECT_MASK *) & gdb_notifier.ready_masks[MASK_SIZE],
-		  (SELECT_MASK *) & gdb_notifier.ready_masks[2 * MASK_SIZE],
-		  gdb_notifier.timeout_valid ? &gdb_notifier.timeout : NULL);
-
-  /* Clear the masks after an error from select. */
-  if (num_found == -1)
-    {
-      memset (gdb_notifier.ready_masks,
-	      0, 3 * MASK_SIZE * sizeof (fd_mask));
-      /* Dont print anything is we got a signal, let gdb handle it. */
-      if (errno != EINTR)
-	perror_with_name ("Select");
+  if (!gdb_notifier.use_select)
+    {
+      num_found =
+	poll (gdb_notifier.poll_fds,
+	      (unsigned long) gdb_notifier.num_fds,
+	      gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1);
+
+      /* Don't print anything if we get out of poll because of a
+	 signal. */
+      if (num_found == -1 && errno != EINTR)
+	perror_with_name ("Poll");
     }
+  else
+
 #endif /* HAVE_POLL */
+    {
+      memcpy (gdb_notifier.ready_masks,
+	      gdb_notifier.check_masks,
+	      3 * MASK_SIZE * sizeof (fd_mask));
+      num_found = select (gdb_notifier.num_fds,
+			  (SELECT_MASK *) & gdb_notifier.ready_masks[0],
+			  (SELECT_MASK *) & gdb_notifier.ready_masks[MASK_SIZE],
+		      (SELECT_MASK *) & gdb_notifier.ready_masks[2 * MASK_SIZE],
+		      gdb_notifier.timeout_valid ?
+					  &gdb_notifier.select_timeout : NULL);
 
+      /* Clear the masks after an error from select. */
+      if (num_found == -1)
+	{
+	  memset (gdb_notifier.ready_masks,
+		  0, 3 * MASK_SIZE * sizeof (fd_mask));
+	  /* Dont print anything is we got a signal, let gdb handle it. */
+	  if (errno != EINTR)
+	    perror_with_name ("Select");
+	}
+    }
+
   /* Enqueue all detected file events. */
 
 #ifdef HAVE_POLL
 
-  for (i = 0; (i < gdb_notifier.num_fds) && (num_found > 0); i++)
+  if (!gdb_notifier.use_select)
     {
-      if ((gdb_notifier.poll_fds + i)->revents)
-	num_found--;
-      else
-	continue;
+      for (i = 0; (i < gdb_notifier.num_fds) && (num_found > 0); i++)
+	{
+	  if ((gdb_notifier.poll_fds + i)->revents)
+	    num_found--;
+	  else
+	    continue;
+
+	  for (file_ptr = gdb_notifier.first_file_handler;
+	       file_ptr != NULL;
+	       file_ptr = file_ptr->next_file)
+	    {
+	      if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd)
+		break;
+	    }
+
+	  if (file_ptr)
+	    {
+	      /* Enqueue an event only if this is still a new event for
+		 this fd. */
+	      if (file_ptr->ready_mask == 0)
+		{
+		  file_event_ptr = create_file_event (file_ptr->fd);
+		  async_queue_event (file_event_ptr, TAIL);
+		}
+	    }
+
+	  file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
+	}
+    }
+  else
 
+#endif /* HAVE_POLL */
+    {
       for (file_ptr = gdb_notifier.first_file_handler;
-	   file_ptr != NULL;
+	   (file_ptr != NULL) && (num_found > 0);
 	   file_ptr = file_ptr->next_file)
 	{
-	  if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd)
-	    break;
-	}
+	  index = file_ptr->fd / (NBBY * sizeof (fd_mask));
+	  bit = 1 << (file_ptr->fd % (NBBY * sizeof (fd_mask)));
+	  mask = 0;
+
+	  if (gdb_notifier.ready_masks[index] & bit)
+	    mask |= GDB_READABLE;
+	  if ((gdb_notifier.ready_masks + MASK_SIZE)[index] & bit)
+	    mask |= GDB_WRITABLE;
+	  if ((gdb_notifier.ready_masks + 2 * (MASK_SIZE))[index] & bit)
+	    mask |= GDB_EXCEPTION;
 
-      if (file_ptr)
-	{
+	  if (!mask)
+	    continue;
+	  else
+	    num_found--;
+
 	  /* Enqueue an event only if this is still a new event for
 	     this fd. */
+
 	  if (file_ptr->ready_mask == 0)
 	    {
 	      file_event_ptr = create_file_event (file_ptr->fd);
 	      async_queue_event (file_event_ptr, TAIL);
 	    }
+	  file_ptr->ready_mask = mask;
 	}
-
-      file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
     }
 
-#else /* ! HAVE_POLL */
-  for (file_ptr = gdb_notifier.first_file_handler;
-       (file_ptr != NULL) && (num_found > 0);
-       file_ptr = file_ptr->next_file)
-    {
-      index = file_ptr->fd / (NBBY * sizeof (fd_mask));
-      bit = 1 << (file_ptr->fd % (NBBY * sizeof (fd_mask)));
-      mask = 0;
-
-      if (gdb_notifier.ready_masks[index] & bit)
-	mask |= GDB_READABLE;
-      if ((gdb_notifier.ready_masks + MASK_SIZE)[index] & bit)
-	mask |= GDB_WRITABLE;
-      if ((gdb_notifier.ready_masks + 2 * (MASK_SIZE))[index] & bit)
-	mask |= GDB_EXCEPTION;
-
-      if (!mask)
-	continue;
-      else
-	num_found--;
-
-      /* Enqueue an event only if this is still a new event for
-         this fd. */
-
-      if (file_ptr->ready_mask == 0)
-	{
-	  file_event_ptr = create_file_event (file_ptr->fd);
-	  async_queue_event (file_event_ptr, TAIL);
-	}
-      file_ptr->ready_mask = mask;
-    }
-#endif /* HAVE_POLL */
-
   return 0;
 }
 \f
@@ -1135,11 +1149,14 @@ poll_timers (void)
       /* Now we need to update the timeout for select/ poll, because we
          don't want to sit there while this timer is expiring. */
 #ifdef HAVE_POLL
-      gdb_notifier.timeout = delta.tv_sec * 1000;
-#else
-      gdb_notifier.timeout.tv_sec = delta.tv_sec;
-      gdb_notifier.timeout.tv_usec = delta.tv_usec;
-#endif
+      if (!gdb_notifier.use_select)
+	gdb_notifier.poll_timeout = delta.tv_sec * 1000;
+      else
+#endif /* HAVE_POLL */
+	{
+	  gdb_notifier.select_timeout.tv_sec = delta.tv_sec;
+	  gdb_notifier.select_timeout.tv_usec = delta.tv_usec;
+	}
       gdb_notifier.timeout_valid = 1;
     }
   else
From dave@hiauly1.hia.nrc.ca Sat Mar 18 07:55:00 2000
From: "John David Anglin" <dave@hiauly1.hia.nrc.ca>
To: msnyder@cygnus.com (Michael Snyder)
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Initialization of hpux_threads
Date: Sat, 18 Mar 2000 07:55:00 -0000
Message-id: <200003181555.KAA02698@hiauly1.hia.nrc.ca>
References: <38D2CB7D.24B6@cygnus.com>
X-SW-Source: 2000-03/msg00328.html
Content-length: 1015

> 
> John David Anglin wrote:
> > 
> > Thu Mar 16 16:49:27 EST 2000  John David Anglin  <dave@hiauly1.hia.nrc.ca>
> > 
> >         * configure.in: Don't call _initialize_hpux_thread twice.
> >         * configure: Regenerated.
> > 
> > --- configure.in.orig   Mon Mar  6 18:30:12 2000
> > +++ configure.in        Thu Mar 16 14:22:26 2000
> > @@ -330,7 +330,6 @@
> >              AC_DEFINE(HAVE_HPUX_THREAD_SUPPORT)
> >              CONFIG_OBS="${CONFIG_OJS} hpux-thread.o"
> >              CONFIG_SRCS="${CONFIG_SRCS} hpux-thread.c"
> > -           CONFIG_INITS="${CONFIG_INITS} hpux-thread.c"
> >           else
> >              AC_MSG_RESULT(no (suppressed because you are not using GCC))
> >           fi
> 
> If someone from HP will approve this, I will check it in...

The problem developed when a typo re CONFIG_INITS was fixed on Feb. 21
(see ChangeLog).

-- 
J. David Anglin                                  dave.anglin@nrc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6605)
From kevinb@cygnus.com Sat Mar 18 14:08:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH RFA] utils.c should not assume that sizeof(long) == 32
Date: Sat, 18 Mar 2000 14:08:00 -0000
Message-id: <1000318220803.ZM11768@ocotillo.lan>
X-SW-Source: 2000-03/msg00329.html
Content-length: 1132

The following patch fixes a problem on IA-64 where I was seeing the
following behavior...

    (gdb) print 3.0 * 4.0
    $1 = 24
    (gdb) print 2.0
    $2 = 4

This bug was also responsible for a number of testsuite failures.

May I check this in?

	* utils.c (floatformat_from_doublest): Don't assume that a long
	will be exactly 32 bits in length.
	
Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.4
diff -u -p -r1.4 utils.c
--- utils.c	2000/03/04 02:23:06	1.4
+++ utils.c	2000/03/18 21:43:59
@@ -2771,7 +2771,7 @@ floatformat_from_doublest (fmt, from, to
       mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
 
       mant *= 4294967296.0;
-      mant_long = (unsigned long) mant;
+      mant_long = ((unsigned long) mant) & 0xffffffffL;
       mant -= mant_long;
 
       /* If the integer bit is implicit, then we need to discard it.
@@ -2782,6 +2782,7 @@ floatformat_from_doublest (fmt, from, to
 	  && fmt->intbit == floatformat_intbit_no)
 	{
 	  mant_long <<= 1;
+	  mant_long &= 0xffffffffL;
 	  mant_bits -= 1;
 	}
 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: HAVE_POLL is not enough - RFA
       [not found]   ` <38D5BE1D.7BB02C99@cygnus.com>
@ 2000-03-20 12:17     ` Elena Zannoni
  0 siblings, 0 replies; 3+ messages in thread
From: Elena Zannoni @ 2000-03-20 12:17 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: Philippe De Muyter, Elena Zannoni, gdb-patches

Agree with Andrew, either of his two suggestions is acceptable.

Elena


Andrew Cagney writes:
 > Philippe De Muyter wrote:
 > > 
 > > I implemented the runtime poll/select selection.  The patch seems huge because
 > > of the indentation changes caused by replacing
 > > #if HAVE_POLL
 > >         some_code
 > > #else
 > >         some_other_code
 > > #endif
 > > 
 > > by
 > > 
 > > #if HAVE_POLL
 > >         if (!use_select)
 > >           {
 > >             some_code
 > >           }
 > >         else
 > > #endif
 > >           {
 > >             some_other_code
 > >           }
 > 
 > Um, to wear the hat of the style police (... :-) I'd suggest instead
 > codeing it as:
 > 
 > 	if (use_poll)
 > 	  {
 > #if HAVE_POLL
 > 	    ...
 > #else
 > 	    internal_error (...);
 > #endif
 > 	  }
 > 	else
 > 	  {
 > 	  }
 > 
 > or even as a psuedo object with a bunch of methods:
 > 
 > 	some_struct.what_are_we_doing (args);
 > 
 > 	Andrew
From jimb@zwingli.cygnus.com Mon Mar 20 12:32:00 2000
From: Jim Blandy <jimb@zwingli.cygnus.com>
To: Kevin Buettner <kevinb@cygnus.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH RFA] symfile.c bounds check
Date: Mon, 20 Mar 2000 12:32:00 -0000
Message-id: <npbt498jse.fsf@zwingli.cygnus.com>
References: <1000318223035.ZM11861@ocotillo.lan>
X-SW-Source: 2000-03/msg00385.html
Content-length: 1282

Yes, please do.

> I was seeing rather severe problems (gdb coredumps; test suite
> wouldn't run at all) on linux/ppc after my recent solib.c changes. 
> The following patch fixes these problems.  (Also, since this is happening,
> MAX_SECTIONS needs to be even bigger.  We probably just ought to
> redesign struct section_addr_info so that it can be dynamically sized.)
> 
> May I check this in?
> 
> 	* symfile.c (syms_from_objfile): Added bounds check prior to
> 	accessing ``other'' array in a section_addr_info struct.
> 
> Index: symfile.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 symfile.c
> --- symfile.c	2000/03/15 19:43:57	1.2
> +++ symfile.c	2000/03/18 22:18:53
> @@ -738,7 +790,9 @@ syms_from_objfile (objfile, addrs, mainl
>   	  else if (strcmp (s->the_bfd_section->name, ".bss") == 0)
>   	    s_addr = addrs->bss_addr;
>   	  else 
> - 	    for (i = 0; !s_addr && addrs->other[i].name; i++)
> + 	    for (i = 0; 
> +	         !s_addr && i < MAX_SECTIONS && addrs->other[i].name;
> +		 i++)
>   	      if (strcmp (s->the_bfd_section->name, addrs->other[i].name) == 0)
>   	        s_addr = addrs->other[i].addr; /* end added for gdb/13815 */
>   
> 
> 
From jimb@zwingli.cygnus.com Mon Mar 20 12:35:00 2000
From: Jim Blandy <jimb@zwingli.cygnus.com>
To: Mark Kettenis <kettenis@wins.uva.nl>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Linux sigtramp detection code moved to its proper place
Date: Mon, 20 Mar 2000 12:35:00 -0000
Message-id: <npaejt8jnp.fsf@zwingli.cygnus.com>
References: <200003162241.RAA19616@zwingli.cygnus.com> <1000316225504.ZM3009@ocotillo.lan> <npsnxp8ix6.fsf@zwingli.cygnus.com> <200003192311.e2JNBI900709@delius.kettenis.local>
X-SW-Source: 2000-03/msg00386.html
Content-length: 245

>    I'm sorry --- this is obviously a tdep issue.  Does the following
>    change look better?
> 
> Sure!  But could you please add i386-linux-tdep.c to the CVS
> repository?

I haven't committed any of this change.  I'll commit all of it now.
From Stephane.Carrez@worldnet.fr Mon Mar 20 12:37:00 2000
From: Stephane Carrez <Stephane.Carrez@worldnet.fr>
To: Andrew Cagney <ac131313@cygnus.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: path for gdb/dwarf2read.c, support 16-bit targets in dwarf-2
Date: Mon, 20 Mar 2000 12:37:00 -0000
Message-id: <38D68C56.856CB00C@worldnet.fr>
References: <38D4DCB0.88313CB2@worldnet.fr> <38D5B6E0.50FF6A5E@cygnus.com>
X-SW-Source: 2000-03/msg00387.html
Content-length: 2464

Hi Andrew,

Andrew Cagney wrote:
> 
> Stephane Carrez wrote:
> >
> > Hi!
> >
> > One part of the patch for dwarf2 correction with 16-bit target has
> > been lost. If you are still not convinced by the fix, have a look
> > at gas/dwarf2dbg.c in out_set_addr() where we obtain the address
> > size in a good way.
> >
> > Can you integrate it?
> 
> FYI,
> 
> My reading of the thread from when this patch was last posted is that it
> wasn't clear that this was a bug and the change was the correct thing to
> do.
> 
For me, it's a bug. The address size specified in dwarf2 is 16 and
because we use arch_size which corresponds to the ELF32/ELF64 size,
gdb stops reading with an error (dwarf2read.c:983):

      if (address_size < address_significant_size)
	{
	  error ("Dwarf Error: bad address size (%ld) in compilation unit header (offset 0x%lx +
11).",
		 (long) cu_header.addr_size,
		 (long) (beg_of_comp_unit - dwarf_info_buffer));


The 'bfd_arch_bits_per_address (bfd)' function was defined for that.
It really returns the size of target address and not the size of ELF
file format.

Here is how we get the address size in GAS (gas/dwarf2dbg.c:307):

  bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;

I would expect gdb to do the same. 

> I'm not sure that there is a GDB bug - GDB appears to have been given
> wrong information.
Yes. It is using the wrong information.

> > Is there any reason why s->arch_size isn't 16 in your case?
I can't change 'arch_size' in my port to make it 16. This would mean
defining and using some ELF16.

The arch_size member is filled in bfd/elfcode.h:1530 with the ARCH_SIZE
define. This ARCH_SIZE define is either 32 or 64 and controls the
reading/writing of the ELF sections (header, symbols and so on).

I can't define some ELF16 for two reasons: first because Motorola
spec says to use ELF32, and second because it means that some symbols and
debugging sections would be limited to 64K which I don't want.

So, the best thing is to fix GDB and have it use the good source of info:-)

	Stephane
 
-----------------------------------------------------------------------
         Home                               Office
E-mail: stcarrez@worldnet.fr               Stephane.Carrez@sun.com
WWW:    http://home.worldnet.fr/stcarrez   http://www.sun.com
Mail:   17, rue Foucher Lepelletier        6, avenue Gustave Eiffel
        92130 Issy Les Moulineaux          78182 Saint Quentin en Yvelines
        France
From jimb@zwingli.cygnus.com Mon Mar 20 12:43:00 2000
From: Jim Blandy <jimb@zwingli.cygnus.com>
To: Eli Zaretskii <eliz@is.elta.co.il>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH] "OVERLAY ON" does not exist.
Date: Mon, 20 Mar 2000 12:43:00 -0000
Message-id: <np8zzd8ja7.fsf@zwingli.cygnus.com>
References: <200003191218.HAA08362@indy.delorie.com>
X-SW-Source: 2000-03/msg00388.html
Content-length: 1213

> Caught this small glitch while running the test suite.
> 
> Okay to commit?

Sure.  But I think it should mention both ways to turn it on:

    Overlay debugging not enabled.  Use either the `overlay auto' or
    the `overlay manual' command.



> 
> 2000-03-16  Eli Zaretskii  <eliz@is.elta.co.il>
> 
> 	* symfile.c (map_overlay_command, unmap_overlay_command): Fix
> 	error message: there's no "overlay on" command.
> 
> --- gdb/symfile.c~0	Thu Feb  3 06:35:14 2000
> +++ gdb/symfile.c	Thu Mar 16 22:57:26 2000
> @@ -2912,7 +2912,7 @@
>    asection *bfdsec;
>  
>    if (!overlay_debugging)
> -    error ("Overlay debugging not enabled.  Use the 'OVERLAY ON' command.");
> +    error ("Overlay debugging not enabled.  Use the 'OVERLAY AUTO' command.");
>  
>    if (args == 0 || *args == 0)
>      error ("Argument required: name of an overlay section");
> @@ -2962,7 +2962,7 @@
>    struct obj_section *sec;
>  
>    if (!overlay_debugging)
> -    error ("Overlay debugging not enabled.  Use the 'OVERLAY ON' command.");
> +    error ("Overlay debugging not enabled.  Use the 'OVERLAY AUTO' command.");
>  
>    if (args == 0 || *args == 0)
>      error ("Argument required: name of an overlay section");
> 
From jimb@zwingli.cygnus.com Mon Mar 20 12:48:00 2000
From: Jim Blandy <jimb@zwingli.cygnus.com>
To: Eli Zaretskii <eliz@is.elta.co.il>
Cc: kettenis@wins.uva.nl, gdb-patches@sourceware.cygnus.com
Subject: Re: RFA: minor watchpoint code cleanup
Date: Mon, 20 Mar 2000 12:48:00 -0000
Message-id: <np7lex8j1u.fsf@zwingli.cygnus.com>
References: <200003180006.TAA26919@zwingli.cygnus.com> <200003190944.EAA07454@indy.delorie.com> <200003192255.e2JMtcs00643@delius.kettenis.local> <200003200958.EAA09356@indy.delorie.com>
X-SW-Source: 2000-03/msg00389.html
Content-length: 64

Yes, yes, but does anyone have comments on my little patch?  :)
From kevinb@cygnus.com Mon Mar 20 14:22:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH] utils.c changes
Date: Mon, 20 Mar 2000 14:22:00 -0000
Message-id: <1000320222159.ZM19650@ocotillo.lan>
X-SW-Source: 2000-03/msg00390.html
Content-length: 1593

I've just committed the patch below.  (Thanks to David Taylor for promptly
reviewing these changes.)

	* utils.c (floatformat_from_doublest): Don't assume that a long
	will be exactly 32 bits in length.  Also...  make sure space
	that we're writing the float to is completely initialized to
	zeroes, even when the number of bits in the float is not
	evenly divisible by FLOATFORMAT_CHAR_BIT.

Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.4
diff -u -p -r1.4 utils.c
--- utils.c	2000/03/04 02:23:06	1.4
+++ utils.c	2000/03/20 21:18:42
@@ -2722,7 +2722,8 @@ floatformat_from_doublest (fmt, from, to
   unsigned char *uto = (unsigned char *) to;
 
   memcpy (&dfrom, from, sizeof (dfrom));
-  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
+  memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1) 
+                    / FLOATFORMAT_CHAR_BIT);
   if (dfrom == 0)
     return;			/* Result is zero */
   if (dfrom != dfrom)		/* Result is NaN */
@@ -2771,7 +2772,7 @@ floatformat_from_doublest (fmt, from, to
       mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
 
       mant *= 4294967296.0;
-      mant_long = (unsigned long) mant;
+      mant_long = ((unsigned long) mant) & 0xffffffffL;
       mant -= mant_long;
 
       /* If the integer bit is implicit, then we need to discard it.
@@ -2782,6 +2783,7 @@ floatformat_from_doublest (fmt, from, to
 	  && fmt->intbit == floatformat_intbit_no)
 	{
 	  mant_long <<= 1;
+	  mant_long &= 0xffffffffL;
 	  mant_bits -= 1;
 	}
 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: HAVE_POLL is not enough - RFA
       [not found] <200003182226.RAA07052@indy.delorie.com>
@ 2000-03-18 15:00 ` Philippe De Muyter
  0 siblings, 0 replies; 3+ messages in thread
From: Philippe De Muyter @ 2000-03-18 15:00 UTC (permalink / raw)
  To: eliz; +Cc: ezannoni, ac131313, gdb-patches

Eli Zaretskii wrote :
> 	* event-loop.c (top-level) [NO_FD_SET]: Deprecate this branch.
> 	Print an error at compile time if we are to use select, but FD_SET
> 	is not available.
> 	(SELECT_MASK, NBBY, FD_SETSIZE, NFDBITS, MASK_SIZE): Define only
> 	if HAVE_POLL is not defined and NO_FD_SET *is* defined.
> 	(create_file_handler) [!HAVE_POLL]: Use FD_SET and FD_CLR.
> 	(delete_file_handler) [!HAVE_POLL]: Use FD_CLR and FD_ISSET.
> 	(gdb_wait_for_event) [!HAVE_POLL]: Copy fd_set sets directly
> 	instead of using memcpy and memset.  Use FD_ISSET.
> 
> +#ifdef NO_FD_SET
> +/* All this stuff below is not required if select is used as God(tm)
> +   intended, with the FD_* macros.  Are there any implementations of
> +   select which don't have FD_SET and other standard FD_* macros?  I
> +   don't think there are, but if I'm wrong, we need to catch them.  */
> +#error FD_SET must be defined if select function is to be used!

I agree completely that your change is the right thing, but it misses
the following sequence :

#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

that is needed a.o. on AIX (See e.g. the sources of bash, screen, mc, uucp,
ncurses, inetutils, cvs or emacs)

Philippe
From cgf@cygnus.com Sat Mar 18 16:40:00 2000
From: Chris Faylor <cgf@cygnus.com>
To: Eli Zaretskii <eliz@is.elta.co.il>
Cc: kettenis@wins.uva.nl, kevinb@cygnus.com, jimb@cygnus.com, gdb-patches@sourceware.cygnus.com
Subject: Re: Linux sigtramp detection code moved to its proper place
Date: Sat, 18 Mar 2000 16:40:00 -0000
Message-id: <20000318194001.B1270@cygnus.com>
References: <200003162241.RAA19616@zwingli.cygnus.com> <jimb@cygnus.com> <1000316225504.ZM3009@ocotillo.lan> <20000316180048.A30640@cygnus.com> <200003162311.e2GNBUH00362@delius.kettenis.local> <20000316193609.D30640@cygnus.com> <200003182227.RAA07055@indy.delorie.com>
X-SW-Source: 2000-03/msg00337.html
Content-length: 1666

On Sat, Mar 18, 2000 at 05:27:17PM -0500, Eli Zaretskii wrote:
>
>> I would be in favor of just creating an i386-linux-tdep.c and working
>> out the 8.3 issues later.  Since there are already 8.3 issues in
>> the gdb source directory, adding one more is not going to aggravate
>> the problem unduly.
>
>I beg to disagree ;-).  Let me explain why.
>
>What I intend to do to resolve the problem of file names clashing in
>the 8+3 namespace is to use the feature of DJTAR, an untar utility
>which comes with DJGPP, to rename files on the fly.  To this end, I
>created a name-mapping file which specifies what files to rename and
>how; this file needs to be submitted to DJTAR when unpacking the
>distribution.  I will make the file itself part of the distribution
>(so DJGPP users will need to unpack that special file first, and then
>the rest).
>
>I already spent a frustrating evening creating this name-mapping file;
>adding any new files that clash with existing files would require me
>to reproduce that file, possibly affecting other files as well.
>
>I respect the decision not to change any names before GDB 5.0 is
>released, but in the meantime could we please not add any new files
>whose names clash?

I am sympathetic to the plight of DOS users but this sounds like it is
something that could, in the short term, be handled by a program or perl
script fairly easily.  If you actually have a solution for DOS, then
maybe that file or script should be part of the distribution and we
should not have to worry about this severe filename limitation.

IMO, in the long-term intelligent use of subdirectories should reduce
the size of all of the filenames.

cgf
From kevinb@cygnus.com Sat Mar 18 23:21:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH RFA] Another utils.c patch
Date: Sat, 18 Mar 2000 23:21:00 -0000
Message-id: <1000319072047.ZM14883@ocotillo.lan>
X-SW-Source: 2000-03/msg00338.html
Content-length: 1006

This fixes another bug uncovered by running the testsuite for the
IA-64...  may I check this one in?

	* utils.c (floatformat_from_doublest): Make sure space that we're
	writing the float to is completely initialized to zeroes, even
	when the number of bits in the float is not evenly divisible
	by FLOATFORMAT_CHAR_BIT.

Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.4
diff -u -p -r1.4 utils.c
--- utils.c	2000/03/04 02:23:06	1.4
+++ utils.c	2000/03/19 07:12:00
@@ -2722,7 +2722,8 @@ floatformat_from_doublest (fmt, from, to
   unsigned char *uto = (unsigned char *) to;
 
   memcpy (&dfrom, from, sizeof (dfrom));
-  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
+  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT
+                  + ((fmt->totalsize % FLOATFORMAT_CHAR_BIT) == 0 ? 0 : 1));
   if (dfrom == 0)
     return;			/* Result is zero */
   if (dfrom != dfrom)		/* Result is NaN */


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2000-03-20 12:17 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <14525.29055.263209.524839@kwikemart.cygnus.com>
2000-03-18  2:28 ` HAVE_POLL is not enough - RFA Philippe De Muyter
     [not found]   ` <38D5BE1D.7BB02C99@cygnus.com>
2000-03-20 12:17     ` Elena Zannoni
     [not found] <200003182226.RAA07052@indy.delorie.com>
2000-03-18 15:00 ` Philippe De Muyter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox