Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Nick Roberts <nickrob@snap.net.nz>
To: Daniel Jacobowitz <drow@false.org>
Cc: gdb@sources.redhat.com
Subject: Re: Merge of nickrob-async-20060513 to mainline?
Date: Tue, 26 Sep 2006 08:41:00 -0000	[thread overview]
Message-ID: <17688.59135.24869.397517@kahikatea.snap.net.nz> (raw)
In-Reply-To: <20060830214257.GA5397@nevyn.them.org>

 > > Instead of GDB waiting for the enferior to stop directly, it creates a
 > > signal thread to do that.  This means that the main thread can continue to
 > > process the event loop.  When the inferior does stop, the signal thread
 > > writes to a file which GDB detects through handle_file_event in the event
 > > loop. It then calls inferior_event_handler.
 > 
 > OK, this is easily mimicable without threads, at least on GNU/Linux.

I'm starting to do this now.  I still use a pipe to write to a file descriptor
but instead of a separate thread I use a while loop in gdb_wait_for_event.
I've only done it for select because that's all I know but I guess a similar
thing could be done for poll.  It seems to work reasonably well for single
threaded inferiors but get's stuck again with multi-threaded ones.  The
multi-threaded code in linux-nat.c just seems so convoluted (maybe threads
are more easily handled with a Mach kernel).

Below is a (pseudo) diff fragment that should (hopefully) give the general
idea.  Do you mean something along these lines?  If yes, I'll try to get it
to work more generally.

-- 
Nick                                           http://www.inet.net.nz/~nickrob


*** linux-nat.c	18 Sep 2006 16:44:40 +1200	1.50

+ static int gdb_fetch_event (int* ptr_status)
+ {
+   struct timeval tv;
+   fd_set fds;
+   int msg[2], ret;
+ 
+   FD_ZERO (&fds);
+   FD_SET (gdb_status[0], &fds);
+   tv.tv_sec = 0;
+   tv.tv_usec = 0;
+ 
+   msg[0] = 0;
+   ret = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+   if (ret)
+     {
+       read (gdb_status[0], msg, 2*sizeof (int));
+       *ptr_status = msg[1];
+     }
+   
+   return msg[0];
+ }
+ 
  static ptid_t
  linux_nat_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
  {
***************
*** 1956,1962 **** (linux_nat_wait)
      {
        pid_t lwpid;
  
!       lwpid = my_waitpid (pid, &status, options);
        if (lwpid > 0)
  	{
  	  gdb_assert (pid == -1 || lwpid == pid);
--- 2094,2106 ----
      {
        pid_t lwpid;
  
!       if (target_can_async_p () && gdb_post_startup)
! 	{
! 	  gdb_file_event = 0;
! 	  lwpid = gdb_fetch_event (&status);
! 	}
!       else
! 	lwpid = my_waitpid (pid, &status, options);
        if (lwpid > 0)
  	{
  	  gdb_assert (pid == -1 || lwpid == pid);


*** event-loop.c (gdb_wait_for_event) 11 Feb 2006 11:01:43 +1300	1.29

        gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
        gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
        gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
!       num_found = gdb_select (gdb_notifier.num_fds,
! 			      &gdb_notifier.ready_masks[0],
! 			      &gdb_notifier.ready_masks[1],
! 			      &gdb_notifier.ready_masks[2],
! 			      gdb_notifier.timeout_valid
! 			      ? &gdb_notifier.select_timeout : NULL);
  
        /* Clear the masks after an error from select. */
        if (num_found == -1)
--- 765,806 ----
        gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
        gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
        gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
! 
!       if (event_loop_p)
! 	{
! 	  struct timeval tv;
! 
! 	  while (num_found == 0)
! 	    {
! 	      msg[0] = waitpid (-1, ptr_status, WNOHANG);
!       
! 	      if (msg[0] > 0)
! 		{
! 		  msg[1] = *ptr_status;
! 		  write (gdb_status[1], msg, 2*sizeof (int));
! 		  gdb_file_event = 1;
! 		}
! 
! 	      tv.tv_sec = 0;
! 	      tv.tv_usec = 1000;
! 
! 	      gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
! 	      gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
! 	      gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
! 
! 	      num_found = gdb_select (gdb_notifier.num_fds,
! 				      &gdb_notifier.ready_masks[0],
! 				      &gdb_notifier.ready_masks[1],
! 				      &gdb_notifier.ready_masks[2],
! 				      &tv);
! 	    }
! 	} else
! 	num_found = gdb_select (gdb_notifier.num_fds,
! 				&gdb_notifier.ready_masks[0],
! 				&gdb_notifier.ready_masks[1],
! 				&gdb_notifier.ready_masks[2],
! 				gdb_notifier.timeout_valid
! 				? &gdb_notifier.select_timeout : NULL);


  parent reply	other threads:[~2006-09-26  8:41 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-30  2:27 Nick Roberts
2006-08-30  2:33 ` Daniel Jacobowitz
2006-08-30  3:21   ` Nick Roberts
2006-08-30  4:01     ` Daniel Jacobowitz
2006-08-30 12:31       ` Eli Zaretskii
2006-08-30 21:34       ` Nick Roberts
2006-08-30 21:43         ` Daniel Jacobowitz
2006-08-30 23:45           ` Nick Roberts
2006-09-26  8:41           ` Nick Roberts [this message]
2006-09-26 12:38             ` Daniel Jacobowitz
2006-09-26 22:12               ` Nick Roberts
2006-09-26 22:24                 ` Daniel Jacobowitz
2006-09-26 23:40                   ` Nick Roberts
2006-09-29  1:50                   ` Nick Roberts
2006-10-06  0:53               ` Nick Roberts
2006-10-06  1:26                 ` Daniel Jacobowitz
2006-10-06  2:13                   ` Nick Roberts
2006-10-06  3:24                     ` Daniel Jacobowitz
2006-10-08  3:46                       ` Nick Roberts
2006-10-09 18:00                         ` async implies sync, was " Michael Snyder
2006-10-09 20:28                           ` async implies sync Nick Roberts
2006-08-31 21:03     ` Merge of nickrob-async-20060513 to mainline? Mark Kettenis
2006-08-31 21:49       ` Nick Roberts
2006-08-31 22:29         ` Daniel Jacobowitz
2006-08-31 22:40           ` Nick Roberts
2006-08-31 22:53             ` Michael Snyder
2006-08-31 23:33               ` Nick Roberts
2006-08-31 23:37                 ` Daniel Jacobowitz
2006-08-31 23:59                   ` Jim Ingham

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=17688.59135.24869.397517@kahikatea.snap.net.nz \
    --to=nickrob@snap.net.nz \
    --cc=drow@false.org \
    --cc=gdb@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox