summaryrefslogtreecommitdiff
path: root/usr/src/lib/libproc/common/Plwpregs.c
diff options
context:
space:
mode:
authorBryan Cantrill <bryan@joyent.com>2013-04-02 13:52:19 -0700
committerRobert Mustacchi <rm@joyent.com>2013-04-12 12:00:00 -0700
commitf971a3462face662ae8ef220a18a98354d625d54 (patch)
tree5df66b69056387f6e3dd5e158930a663daab92dc /usr/src/lib/libproc/common/Plwpregs.c
parentabc79d9dd51e98eafb6fc25b4a0b4f66bef40b00 (diff)
downloadillumos-joyent-f971a3462face662ae8ef220a18a98354d625d54.tar.gz
3673 core dumping is abysmally slow
3671 left behind enemy lines, agent LWP can go rogue 3670 add visibility into agent LWP's spymaster Reviewed by: Keith M Wesolowski <keith.wesolowski@joyent.com> Reviewed by: Joshua M. Clulow <jmc@joyent.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Eric Schrock <eric.schrock@delphix.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libproc/common/Plwpregs.c')
-rw-r--r--usr/src/lib/libproc/common/Plwpregs.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/usr/src/lib/libproc/common/Plwpregs.c b/usr/src/lib/libproc/common/Plwpregs.c
index 76f658a458..7549bc142d 100644
--- a/usr/src/lib/libproc/common/Plwpregs.c
+++ b/usr/src/lib/libproc/common/Plwpregs.c
@@ -23,7 +23,9 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ */
#include <sys/types.h>
#include <sys/uio.h>
@@ -349,6 +351,39 @@ Plwp_getpsinfo(struct ps_prochandle *P, lwpid_t lwpid, lwpsinfo_t *lps)
}
int
+Plwp_getspymaster(struct ps_prochandle *P, lwpid_t lwpid, psinfo_t *ps)
+{
+ lwpstatus_t lps;
+
+ if (P->state == PS_IDLE) {
+ errno = ENODATA;
+ return (-1);
+ }
+
+ if (getlwpstatus(P, lwpid, &lps) != 0)
+ return (-1);
+
+ if (!(lps.pr_flags & PR_AGENT)) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ if (P->state != PS_DEAD) {
+ return (getlwpfile(P, lwpid, "spymaster",
+ ps, sizeof (psinfo_t)));
+ }
+
+ if (P->spymaster.pr_nlwp != 0) {
+ (void) memcpy(ps, &P->spymaster, sizeof (psinfo_t));
+ return (0);
+ }
+
+ errno = ENODATA;
+
+ return (-1);
+}
+
+int
Plwp_stack(struct ps_prochandle *P, lwpid_t lwpid, stack_t *stkp)
{
uintptr_t addr;