From f971a3462face662ae8ef220a18a98354d625d54 Mon Sep 17 00:00:00 2001 From: Bryan Cantrill Date: Tue, 2 Apr 2013 13:52:19 -0700 Subject: 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 Reviewed by: Joshua M. Clulow Reviewed by: Robert Mustacchi Reviewed by: Richard Lowe Reviewed by: Garrett D'Amore Reviewed by: Eric Schrock Approved by: Richard Lowe --- usr/src/lib/libproc/common/Plwpregs.c | 37 ++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'usr/src/lib/libproc/common/Plwpregs.c') 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 #include @@ -348,6 +350,39 @@ Plwp_getpsinfo(struct ps_prochandle *P, lwpid_t lwpid, lwpsinfo_t *lps) return (-1); } +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) { -- cgit v1.2.3