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);
next prev 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