This is the mail archive of the
gdb-prs@sources.redhat.com
mailing list for the GDB project.
Re: threads/1576: Linux 2.6 thread status path in /proc has changed
- From: George J Karabin <gkarabin at pobox dot com>
- To: nobody at sources dot redhat dot com
- Cc: gdb-prs at sources dot redhat dot com,
- Date: 27 Feb 2004 17:28:00 -0000
- Subject: Re: threads/1576: Linux 2.6 thread status path in /proc has changed
- Reply-to: George J Karabin <gkarabin at pobox dot com>
The following reply was made to PR threads/1576; it has been noted by GNATS.
From: George J Karabin <gkarabin@pobox.com>
To: gdb-gnats@sources.redhat.com
Cc: gdb-patches@sources.redhat.com
Subject: Re: threads/1576: Linux 2.6 thread status path in /proc has changed
Date: Fri, 27 Feb 2004 09:19:37 -0800
This is a multi-part message in MIME format.
--------------080906030706080100020103
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
I filed this bug last night, with a patch. The patch could be a little
cleaner, I guess. I shouldn't make assumptions about inlining the "get"
functions. Take 2 is attached.
The details on the when the change crept into the kernel are a little
sketchy, but you can get the gist of it here:
http://www.ussg.iu.edu/hypermail/linux/kernel/0310.0/0052.html
Best regards,
- George
--------------080906030706080100020103
Content-Type: text/x-diff;
name="gdb-6.0post-pre-2.6.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="gdb-6.0post-pre-2.6.patch"
diff -Naur gdb+dejagnu-20031117/gdb-pre-2.6/lin-lwp.c gdb+dejagnu-20031117/gdb/lin-lwp.c
--- gdb+dejagnu-20031117/gdb-pre-2.6/lin-lwp.c 2003-10-08 13:05:56.000000000 -0700
+++ gdb+dejagnu-20031117/gdb/lin-lwp.c 2004-02-27 08:24:40.658222000 -0800
@@ -837,12 +837,12 @@
the appropriate bits in PENDING, and return 1 - otherwise return 0. */
static int
-lin_lwp_has_pending (int pid, sigset_t *pending, sigset_t *flush_mask)
+lin_lwp_has_pending (ptid_t ptid, sigset_t *pending, sigset_t *flush_mask)
{
sigset_t blocked, ignored;
int i;
- linux_proc_pending_signals (pid, pending, &blocked, &ignored);
+ linux_proc_pending_signals (ptid, pending, &blocked, &ignored);
if (!flush_mask)
return 0;
@@ -894,7 +894,7 @@
lp->status = 0;
}
- while (lin_lwp_has_pending (GET_LWP (lp->ptid), &pending, flush_mask))
+ while (lin_lwp_has_pending (lp->ptid, &pending, flush_mask))
{
int ret;
diff -Naur gdb+dejagnu-20031117/gdb-pre-2.6/linux-nat.h gdb+dejagnu-20031117/gdb/linux-nat.h
--- gdb+dejagnu-20031117/gdb-pre-2.6/linux-nat.h 2003-09-13 19:04:44.000000000 -0700
+++ gdb+dejagnu-20031117/gdb/linux-nat.h 2004-02-27 08:24:40.677221000 -0800
@@ -67,7 +67,7 @@
struct target_ops *target);
/* Find process PID's pending signal set from /proc/pid/status. */
-void linux_proc_pending_signals (int pid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored);
+void linux_proc_pending_signals (ptid_t ptid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored);
/* linux-nat functions for handling fork events. */
extern void linux_record_stopped_pid (int pid);
diff -Naur gdb+dejagnu-20031117/gdb-pre-2.6/linux-proc.c gdb+dejagnu-20031117/gdb/linux-proc.c
--- gdb+dejagnu-20031117/gdb-pre-2.6/linux-proc.c 2003-10-01 13:36:56.000000000 -0700
+++ gdb+dejagnu-20031117/gdb/linux-proc.c 2004-02-27 08:33:45.348508000 -0800
@@ -689,19 +689,28 @@
to match. */
void
-linux_proc_pending_signals (int pid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored)
+linux_proc_pending_signals (ptid_t ptid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored)
{
FILE *procfile;
char buffer[MAXPATHLEN], fname[MAXPATHLEN];
- int signum;
+ int signum, pid;
+ long lwp;
+
+ pid = ptid_get_pid (ptid);
+ lwp = ptid_get_lwp (ptid);
sigemptyset (pending);
sigemptyset (blocked);
sigemptyset (ignored);
- sprintf (fname, "/proc/%d/status", pid);
+ sprintf (fname, "/proc/%d/task/%ld/status", pid, lwp);
procfile = fopen (fname, "r");
if (procfile == NULL)
- error ("Could not open %s", fname);
+ {
+ sprintf (fname, "/proc/%ld/status", lwp);
+ procfile = fopen (fname, "r");
+ if (procfile == NULL)
+ error ("Could not get status for task %ld", lwp);
+ }
while (fgets (buffer, MAXPATHLEN, procfile) != NULL)
{
--------------080906030706080100020103--