Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <yao@codesourcery.com>
To: Pedro Alves <palves@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: Re: [PATCH 3/4] New agent command 'kill' and used by gdbserver
Date: Wed, 20 Jun 2012 13:49:00 -0000	[thread overview]
Message-ID: <4FE1D4D4.4070506@codesourcery.com> (raw)
In-Reply-To: <4FDB8BF0.4050502@redhat.com>

On 06/16/2012 03:24 AM, Pedro Alves wrote:
> 
> I'd really rather see that fixed now.  Even with single process,
> you may get here without a selected inferior at all.  We just need
> to lookup a thread of PID, and select it as current_inferior for the
> duration of run_inferior_command, I think?  (wrapped with the
> save_inferior dance).
> 
>> > +int
>> > +kill_inferior (int pid)
>> > +{
> 
>> > +  char buf[IPA_CMD_BUF_SIZE];
>> > +
>> > +  if (!maybe_write_ipa_not_loaded (buf))
>> > +    {
>> > +      strcpy (buf, "close");
>> > +      /* FIXME: It is wrong to assume PID is the current process.  In
>> > +	 a multiple-process scenario, we may run inferior command on
>> > +	 the wrong process.  */
>> > +      run_inferior_command (buf, strlen (buf) + 1);
>> > +    }
> 
> I'd rather have this whole block be factored out to a function
> in tracepoint.c (tracepoint_about_to_kill for example).  More so
> with a fix to set current_inferior around run_inferior_command.
> Then we wouldn't have to export details of the IPA, such as
> maybe_write_ipa_not_loaded or run_inferior_command.

Here is the new one.

-- 
Yao (齐尧) 

gdb/gdbserver:

2012-06-14  Yao Qi  <yao@codesourcery.com>

	* server.h: Declare gdb_agent_about_to_close.
	* target.c (kill_inferior): Include "agent.h".
	New.  Send command 'kill'.
	* target.h (kill_inferior): Removed macro.
	* tracepoint.c (gdb_agent_about_to_close): New.
	(gdb_agent_helper_thread): Handle command 'close'.
	Wait endlessly until the inferior stops.
---
 gdb/gdbserver/server.h     |    1 +
 gdb/gdbserver/target.c     |    8 +++++++
 gdb/gdbserver/target.h     |    3 +--
 gdb/gdbserver/tracepoint.c |   53 +++++++++++++++++++++++++++++++++++++++++++-
 5 files changed, 66 insertions(+), 3 deletions(-)

diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 02dfa29..752bc3b 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -467,6 +467,7 @@ void stop_tracing (void);
 
 int claim_trampoline_space (ULONGEST used, CORE_ADDR *trampoline);
 int have_fast_tracepoint_trampoline_buffer (char *msgbuf);
+void gdb_agent_about_to_close (int pid);
 #endif
 
 struct traceframe;
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 7539476..e8b2b08 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -182,3 +182,11 @@ target_waitstatus_to_string (const struct target_waitstatus *ws)
 
   return buf;
 }
+
+int
+kill_inferior (int pid)
+{
+  gdb_agent_about_to_close (pid);
+
+  return (*the_target->kill) (pid);
+}
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 0cf5687..9f96e04 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -409,8 +409,7 @@ void set_target_ops (struct target_ops *);
 #define myattach(pid) \
   (*the_target->attach) (pid)
 
-#define kill_inferior(pid) \
-  (*the_target->kill) (pid)
+int kill_inferior (int);
 
 #define detach_inferior(pid) \
   (*the_target->detach) (pid)
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 8fcaa46..7ad77f0 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -3923,6 +3923,38 @@ cmd_qtstmat (char *packet)
     run_inferior_command (packet, strlen (packet) + 1);
 }
 
+/* Sent the agent a command to close it.  */
+
+void
+gdb_agent_about_to_close (int pid)
+{
+  char buf[IPA_CMD_BUF_SIZE];
+
+  if (!maybe_write_ipa_not_loaded (buf))
+    {
+      struct thread_info *save_inferior;
+      struct inferior_list_entry *inf = all_threads.head;
+
+      save_inferior = current_inferior;
+
+      /* Find a certain thread which belongs to process PID.  */
+      while (inf != NULL)
+	{
+	  if (ptid_get_pid (inf->id) == pid)
+	    break;
+	  inf = inf->next;
+	}
+
+      current_inferior = (struct thread_info *) inf;
+
+      strcpy (buf, "close");
+
+      run_inferior_command (buf, strlen (buf) + 1);
+
+      current_inferior = save_inferior;
+    }
+}
+
 /* Return the minimum instruction size needed for fast tracepoints as a
    hexadecimal number.  */
 
@@ -7033,6 +7065,7 @@ gdb_agent_helper_thread (void *arg)
 	  int fd;
 	  char buf[1];
 	  int ret;
+	  int stop_loop = 0;
 
 	  tmp = sizeof (sockaddr);
 
@@ -7065,8 +7098,12 @@ gdb_agent_helper_thread (void *arg)
 
 	  if (cmd_buf[0])
 	    {
+	      if (strncmp ("close", cmd_buf, 5) == 0)
+		{
+		  stop_loop = 1;
+		}
 #ifdef HAVE_UST
-	      if (strcmp ("qTfSTM", cmd_buf) == 0)
+	      else if (strcmp ("qTfSTM", cmd_buf) == 0)
 		{
 		  cmd_qtfstm (cmd_buf);
 		}
@@ -7098,6 +7135,20 @@ gdb_agent_helper_thread (void *arg)
 	  /* Fix compiler's warning: ignoring return value of 'write'.  */
 	  ret = write (fd, buf, 1);
 	  close (fd);
+
+	  if (stop_loop)
+	    {
+	      close (listen_fd);
+	      unlink (agent_socket_name);
+
+	      /* Sleep endlessly to wait the whole inferior stops.  This
+		 thread can not exit because GDB or GDBserver may still need
+		 'current_inferior' (representing this thread) to access
+		 inferior memory.  Otherwise, this thread exits earlier than
+		 other threads, and 'current_inferior' is set to NULL.  */
+	      while (1)
+		sleep (10);
+	    }
 	}
     }
 
-- 
1.7.9.5


  reply	other threads:[~2012-06-20 13:49 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-09 12:47 [PATCH 0/4] PR14161: a partial fix Yao Qi
2012-06-09 12:47 ` [PATCH 4/4] gdb: kfail for PR14161 Yao Qi
2012-06-12 16:21   ` Pedro Alves
2012-06-14 15:01     ` Yao Qi
2012-06-15 19:33       ` Pedro Alves
2012-06-20 13:55         ` Yao Qi
2012-06-09 12:47 ` [PATCH 3/4] New agent command 'kill' and used by gdbserver Yao Qi
2012-06-09 13:11   ` Eli Zaretskii
2012-06-12 16:14   ` Pedro Alves
2012-06-14 14:50     ` Yao Qi
2012-06-14 16:37       ` Eli Zaretskii
2012-06-15 19:25       ` Pedro Alves
2012-06-20 13:49         ` Yao Qi [this message]
2012-06-21 16:05           ` Pedro Alves
2012-06-09 12:47 ` [PATCH 1/4] New test for removing socket file in gdb.trace/strace.exp Yao Qi
2012-06-12 14:51   ` Pedro Alves
2012-06-14 14:39     ` Yao Qi
2012-06-15 19:00       ` Pedro Alves
2012-06-20 13:46         ` Yao Qi
2012-06-21 15:56           ` Pedro Alves
2012-06-27  3:55             ` Yao Qi
2012-06-09 12:47 ` [PATCH 2/4] Remove socket file at exit Yao Qi
2012-06-12 15:14   ` Pedro Alves
2012-06-14 14:44     ` Yao Qi
2012-06-15 19:02       ` Pedro Alves
2012-07-27  8:19 ` [committed] : [PATCH 0/4] PR14161: a partial fix Yao Qi

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=4FE1D4D4.4070506@codesourcery.com \
    --to=yao@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@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