| Index: gdb/common/linux-procfs.c
|
| diff --git a/gdb/common/linux-procfs.c b/gdb/common/linux-procfs.c
|
| index 421f36edb46a671f1fa8152d37a6963078db8c4a..a5aa8305f7d855c4aca2c41f6ebbe4ac23aee51d 100644
|
| --- a/gdb/common/linux-procfs.c
|
| +++ b/gdb/common/linux-procfs.c
|
| @@ -28,28 +28,93 @@
|
| /* Return the TGID of LWPID from /proc/pid/status. Returns -1 if not
|
| found. */
|
|
|
| -int
|
| -linux_proc_get_tgid (int lwpid)
|
| +static int
|
| +linux_proc_get_int (pid_t lwpid, const char *field)
|
| {
|
| + size_t field_len = strlen (field);
|
| FILE *status_file;
|
| char buf[100];
|
| - int tgid = -1;
|
| + int retval = -1;
|
|
|
| snprintf (buf, sizeof (buf), "/proc/%d/status", (int) lwpid);
|
| status_file = fopen (buf, "r");
|
| - if (status_file != NULL)
|
| + if (status_file == NULL)
|
| {
|
| - while (fgets (buf, sizeof (buf), status_file))
|
| - {
|
| - if (strncmp (buf, "Tgid:", 5) == 0)
|
| - {
|
| - tgid = strtoul (buf + strlen ("Tgid:"), NULL, 10);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - fclose (status_file);
|
| + warning (_("unable to open /proc file '%s'"), buf);
|
| + return -1;
|
| }
|
|
|
| - return tgid;
|
| + while (fgets (buf, sizeof (buf), status_file))
|
| + if (strncmp (buf, field, field_len) == 0 && buf[field_len] == ':')
|
| + {
|
| + retval = strtol (&buf[field_len + 1], NULL, 10);
|
| + break;
|
| + }
|
| +
|
| + fclose (status_file);
|
| + return retval;
|
| +}
|
| +
|
| +/* Return the TGID of LWPID from /proc/pid/status. Returns -1 if not
|
| + found. */
|
| +
|
| +int
|
| +linux_proc_get_tgid (pid_t lwpid)
|
| +{
|
| + return linux_proc_get_int (lwpid, "Tgid");
|
| +}
|
| +
|
| +/* See linux-procfs.h. */
|
| +
|
| +pid_t
|
| +linux_proc_get_tracerpid (pid_t lwpid)
|
| +{
|
| + return linux_proc_get_int (lwpid, "TracerPid");
|
| +}
|
| +
|
| +/* Return non-zero if 'State' of /proc/PID/status contains STATE. */
|
| +
|
| +static int
|
| +linux_proc_pid_has_state (pid_t pid, const char *state)
|
| +{
|
| + char buffer[100];
|
| + FILE *procfile;
|
| + int retval;
|
| + int have_state;
|
| +
|
| + xsnprintf (buffer, sizeof (buffer), "/proc/%d/status", (int) pid);
|
| + procfile = fopen (buffer, "r");
|
| + if (procfile == NULL)
|
| + {
|
| + warning (_("unable to open /proc file '%s'"), buffer);
|
| + return 0;
|
| + }
|
| +
|
| + have_state = 0;
|
| + while (fgets (buffer, sizeof (buffer), procfile) != NULL)
|
| + if (strncmp (buffer, "State:", 6) == 0)
|
| + {
|
| + have_state = 1;
|
| + break;
|
| + }
|
| + retval = (have_state && strstr (buffer, state) != NULL);
|
| + fclose (procfile);
|
| + return retval;
|
| +}
|
| +
|
| +/* Detect `T (stopped)' in `/proc/PID/status'.
|
| + Other states including `T (tracing stop)' are reported as false. */
|
| +
|
| +int
|
| +linux_proc_pid_is_stopped (pid_t pid)
|
| +{
|
| + return linux_proc_pid_has_state (pid, "T (stopped)");
|
| +}
|
| +
|
| +/* See linux-procfs.h declaration. */
|
| +
|
| +int
|
| +linux_proc_pid_is_zombie (pid_t pid)
|
| +{
|
| + return linux_proc_pid_has_state (pid, "Z (zombie)");
|
| }
|
|
|