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)"); |
} |