This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Remove lwp -> pid conversion in linux_nat_xfer_partial


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b67aeab02c05fdd654f132a550dd4f196cb1f6d3

commit b67aeab02c05fdd654f132a550dd4f196cb1f6d3
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Wed Mar 22 10:35:07 2017 -0400

    Remove lwp -> pid conversion in linux_nat_xfer_partial
    
    The linux_nat_xfer_partial does a conversion of inferior_ptid: if it's
    an LWP (ptid::lwp != 0), it builds a new ptid with the lwp as
    the pid and assigns that temporarily to inferior_ptid.  For example, if
    inferior_ptid is:
    
      { .pid = 1234, .lwp = 1235 }
    
    it will assign this to inferior_ptid for the duration of the call:
    
      { .pid = 1235, .lwp = 0 }
    
    Instead of doing this, this patch teaches the inf-ptrace implementation
    of xfer_partial to deal with ptids representing lwps by using
    get_ptrace_pid.
    
    Also, in linux_proc_xfer_spu and linux_proc_xfer_partial, we use ptid_get_lwp
    instead of ptid_get_pid.  While not strictly necessary, since the content of
    /proc/<pid> and /proc/<lwp> should be the same, it's a bit safer, because:
    
    - some files under /proc/<pid>/ may not work if the <pid> thread is
      running, just like ptrace requires a stopped thread.  The current
      thread's lwp id is more likely to be in the necessary state (stopped).
    
    - if the leader (<pid>) had exited and is thus now zombie, then several
      files under "/proc/<pid>" won't work, while they will if you use
      "/proc/<lwp>".
    
    The testsuite found no regression on native amd64 linux.
    
    gdb/ChangeLog:
    
    	* inf-ptrace.c (inf_ptrace_xfer_partial): Get pid from ptid
    	using get_ptrace_pid.
    	* linux-nat.c (linux_nat_xfer_partial): Don't set/restore
    	inferior_ptid.
    	(linux_proc_xfer_partial, linux_proc_xfer_spu): Use lwp of
    	inferior_ptid instead of pid.

Diff:
---
 gdb/ChangeLog    |  9 +++++++++
 gdb/inf-ptrace.c |  2 +-
 gdb/linux-nat.c  | 13 +++----------
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a621048..8bb9e21 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2017-03-22  Simon Marchi  <simon.marchi@polymtl.ca>
+
+	* inf-ptrace.c (inf_ptrace_xfer_partial): Get pid from ptid
+	using get_ptrace_pid.
+	* linux-nat.c (linux_nat_xfer_partial): Don't set/restore
+	inferior_ptid.
+	(linux_proc_xfer_partial, linux_proc_xfer_spu): Use lwp of
+	inferior_ptid instead of pid.
+
 2017-03-22  Yao Qi  <yao.qi@linaro.org>
 
 	* aarch64-tdep.c: Wrap locally used classes in anonymous
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 61d2426..f912d28 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -520,7 +520,7 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
 			 const gdb_byte *writebuf,
 			 ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
 {
-  pid_t pid = ptid_get_pid (inferior_ptid);
+  pid_t pid = get_ptrace_pid (inferior_ptid);
 
   switch (object)
     {
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 73ef2d4..dff0da5 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -3890,7 +3890,6 @@ linux_nat_xfer_partial (struct target_ops *ops, enum target_object object,
 			const gdb_byte *writebuf,
 			ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
 {
-  struct cleanup *old_chain;
   enum target_xfer_status xfer;
 
   if (object == TARGET_OBJECT_SIGNAL_INFO)
@@ -3903,15 +3902,9 @@ linux_nat_xfer_partial (struct target_ops *ops, enum target_object object,
   if (object == TARGET_OBJECT_MEMORY && ptid_equal (inferior_ptid, null_ptid))
     return TARGET_XFER_EOF;
 
-  old_chain = save_inferior_ptid ();
-
-  if (ptid_lwp_p (inferior_ptid))
-    inferior_ptid = pid_to_ptid (ptid_get_lwp (inferior_ptid));
-
   xfer = linux_ops->to_xfer_partial (ops, object, annex, readbuf, writebuf,
 				     offset, len, xfered_len);
 
-  do_cleanups (old_chain);
   return xfer;
 }
 
@@ -4001,8 +3994,8 @@ linux_proc_xfer_partial (struct target_ops *ops, enum target_object object,
 
   /* We could keep this file open and cache it - possibly one per
      thread.  That requires some juggling, but is even faster.  */
-  xsnprintf (filename, sizeof filename, "/proc/%d/mem",
-	     ptid_get_pid (inferior_ptid));
+  xsnprintf (filename, sizeof filename, "/proc/%ld/mem",
+	     ptid_get_lwp (inferior_ptid));
   fd = gdb_open_cloexec (filename, ((readbuf ? O_RDONLY : O_WRONLY)
 				    | O_LARGEFILE), 0);
   if (fd == -1)
@@ -4095,7 +4088,7 @@ linux_proc_xfer_spu (struct target_ops *ops, enum target_object object,
   char buf[128];
   int fd = 0;
   int ret = -1;
-  int pid = ptid_get_pid (inferior_ptid);
+  int pid = ptid_get_lwp (inferior_ptid);
 
   if (!annex)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]