diff options
Diffstat (limited to 'usr/src/lib/libproc/common/Plwpregs.c')
-rw-r--r-- | usr/src/lib/libproc/common/Plwpregs.c | 37 |
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; |