.\"
.\" This file and its contents are supplied under the terms of the
.\" Common Development and Distribution License ("CDDL"), version 1.0.
.\" You may only use this file in accordance with the terms of version
.\" 1.0 of the CDDL.
.\"
.\" A full copy of the text of the CDDL should have accompanied this
.\" source.  A copy of the CDDL is also available via the Internet at
.\" http://www.illumos.org/license/CDDL.
.\"
.\"
.\" Copyright 2015 Joyent, Inc.
.\"
.Dd May 11, 2016
.Dt PLWP_STACK 3PROC
.Os
.Sh NAME
.Nm Plwp_stack ,
.Nm Plwp_alt_stack ,
.Nm Plwp_main_stack ,
.Nm Lstack ,
.Nm Lalt_stack ,
.Nm Lmain_stack
.Nd get thread stack information
.Sh LIBRARY
.Lb libproc
.Sh SYNOPSIS
.In libproc.h
.Ft int
.Fo Plwp_stack
.Fa "struct ps_prochandle *P"
.Fa "lwpid_t lwpid"
.Fa "stack_t *stkp"
.Fc
.Ft int
.Fo Plwp_alt_stack
.Fa "struct ps_prochandle *P"
.Fa "lwpid_t lwpid"
.Fa "stack_t *stkp"
.Fc
.Ft int
.Fo Plwp_main_stack
.Fa "struct ps_prochandle *P"
.Fa "lwpid_t lwpid"
.Fa "stack_t *stkp"
.Fc
.Ft int
.Fo Lalt_stack
.Fa "struct ps_lwphandle *L"
.Fa "stack_t *stkp"
.Fc
.Ft int
.Fo Lmain_stack
.Fa "struct ps_lwphandle *L"
.Fa "stack_t *stkp"
.Fc
.Ft int
.Fo Lstack
.Fa "struct ps_lwphandle *L"
.Fa "stack_t *stkp"
.Fc
.Sh DESCRIPTION
The
.Fn Plwp_stack ,
.Fn Plwp_alt_stack ,
and
.Fn Plwp_main_stack
functions obtain information about the size and address of the stacks
for the thread identified by
.Fa lwpid
in the process handle
.Fa P .
.Pp
Each thread in a process has its own stack which is used both for
maintaining function call sequences and the storing of local variables.
A thread may also configure a different stack to handle specific
signals.
This stack is often called the
.Em alternate stack .
Whether or not the alternate stack is used may be controlled through the
.Xr sigaction 2
and
.Xr sigaltstack 2
functions .
.Pp
The
.Fn Plwp_stack
function fills in
.Fa stkp
with the information about the thread's currently executing stack,
whether the alternate or main one.
.Pp
The
.Fn Plwp_alt_stack
function fills in
.Fa stkp
with the information about the thread's alternate stack, if it's
configured.
.Pp
The
.Fn Plwp_main_stack
function fills in
.Fa stkp
with the information about the thread's main stack, regardless of if there
is an alternate stack or it is executing one.
.Pp
Process handles that refer to files, obtained through
.Xr Pgrab_file 3PROC ,
do not have any stack information and these functions will always fail
on them.
.Pp
The
.Fn Lalt_stack ,
.Fn Lmain_stack ,
and
.Fn Lstack
functions are identical to the
.Fn Plwp_alt_stack ,
.Fn Plwp_main_stack ,
and
.Fn Plwp_main_stack
functions, except rather than specifying a thread to operate on, they
operate on the thread handle
.Fa L ,
which specifies the thread to operate on.
.Sh RETURN VALUES
Upon successful completion, the
.Fn Plwp_stack ,
.Fn Plwp_alt_stack ,
.Fn Plwp_main_stack ,
.Fn Lalt_stack ,
.Fn Lmain_stack ,
and
.Fn Lstack
functions return
.Sy 0
and fills in
.Fa stkp
with information about the appropriate stack.
Otherwise,
.Sy -1
is returned,
.Sy errno
is updated with the error, and
.Fa stkp
is not modified.
.Sh ERRORS
For a full list of possible errors also see the
.Sy DIAGNOSTICS
section in
.Xr proc 5 .
.Pp
The
.Fn Plwp_stack ,
.Fn Plwp_alt_stack ,
and
.Fn Plwp_main_stack
function will fail if:
.Bl -tag -width Er
.It Er ENODATA
The process handle
.Fa P
refers to a grabbed file, not an active process or core.
.It Er EINVAL
The process handle
.Fa P
refers to a core file and the specified thread does not exist.
.It Er ENOENT
The process handle
.Fa P
refers to an active process and the specified thread does not exist.
.El
.Pp
The
.Fn Plwp_alt_stack
and
.Fn Lalt_stack
functions will fail if:
.Bl -tag -width Er
.It Er ENODATA
The thread identified by
.Fa lwpid
did not have an alternate stack enabled.
.El
.Sh INTERFACE STABILITY
.Sy Uncommitted
.Sh MT-LEVEL
See
.Sy LOCKING
in
.Xr libproc 3LIB .
.Sh SEE ALSO
.Xr sigaction 2 ,
.Xr sigaltstack 2 ,
.Xr libproc 3LIB ,
.Xr proc 5