.\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk
.\"     <mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.TH PTHREAD_ATTR_SETSTACK 3 2017-09-15 "Linux" "Linux Programmer's Manual"
.SH NAME
pthread_attr_setstack, pthread_attr_getstack \- set/get stack
attributes in thread attributes object
.SH SYNOPSIS
.nf
.B #include <pthread.h>
.PP
.BI "int pthread_attr_setstack(pthread_attr_t *" attr ,
.BI "                          void *" stackaddr ", size_t " stacksize );
.BI "int pthread_attr_getstack(const pthread_attr_t *" attr ,
.BI "                          void **" stackaddr ", size_t *" stacksize );
.PP
Compile and link with \fI\-pthread\fP.
.fi
.PP
.in -4n
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.in
.PP
.ad l
.BR pthread_attr_getstack (),
.BR pthread_attr_setstack ():
.RS 4
_POSIX_C_SOURCE\ >=\ 200112L
.RE
.ad b
.SH DESCRIPTION
The
.BR pthread_attr_setstack ()
function sets the stack address and stack size attributes of the
thread attributes object referred to by
.I attr
to the values specified in
.IR stackaddr
and
.IR stacksize ,
respectively.
These attributes specify the location and size of the stack that should
be used by a thread that is created using the thread attributes object
.IR attr .
.PP
.I stackaddr
should point to the lowest addressable byte of a buffer of
.I stacksize
bytes that was allocated by the caller.
The pages of the allocated buffer should be both readable and writable.
.PP
The
.BR pthread_attr_getstack ()
function returns the stack address and stack size attributes of the
thread attributes object referred to by
.I attr
in the buffers pointed to by
.IR stackaddr
and
.IR stacksize ,
respectively.
.SH RETURN VALUE
On success, these functions return 0;
on error, they return a nonzero error number.
.SH ERRORS
.BR pthread_attr_setstack ()
can fail with the following error:
.TP
.B EINVAL
.I stacksize
is less than
.BR PTHREAD_STACK_MIN
(16384) bytes.
On some systems, this error may also occur if
.IR stackaddr
or
.IR "stackaddr\ +\ stacksize"
is not suitably aligned.
.PP
POSIX.1 also documents an
.BR EACCES
error if the stack area described by
.I stackaddr
and
.I stacksize
is not both readable and writable by the caller.
.SH VERSIONS
These functions are provided by glibc since version 2.2.
.SH ATTRIBUTES
For an explanation of the terms used in this section, see
.BR attributes (7).
.TS
allbox;
lbw24 lb lb
l l l.
Interface	Attribute	Value
T{
.BR pthread_attr_setstack (),
.BR pthread_attr_getstack ()
T}	Thread safety	MT-Safe
.TE
.SH CONFORMING TO
POSIX.1-2001, POSIX.1-2008.
.SH NOTES
These functions are provided for applications that must ensure that
a thread's stack is placed in a particular location.
For most applications, this is not necessary,
and the use of these functions should be avoided.
(Use
.BR pthread_attr_setstacksize (3)
if an application simply requires a stack size other than the default.)
.PP
When an application employs
.BR pthread_attr_setstack (),
it takes over the responsibility of allocating the stack.
Any guard size value that was set using
.BR pthread_attr_setguardsize (3)
is ignored.
If deemed necessary,
it is the application's responsibility to allocate a guard area
(one or more pages protected against reading and writing)
to handle the possibility of stack overflow.
.PP
The address specified in
.I stackaddr
should be suitably aligned:
for full portability, align it on a page boundary
.RI ( sysconf(_SC_PAGESIZE) ).
.BR posix_memalign (3)
may be useful for allocation.
Probably,
.IR stacksize
should also be a multiple of the system page size.
.PP
If
.I attr
is used to create multiple threads, then the caller must change the
stack address attribute between calls to
.BR pthread_create (3);
otherwise, the threads will attempt to use the same memory area
for their stacks, and chaos will ensue.
.SH EXAMPLE
See
.BR pthread_attr_init (3).
.SH SEE ALSO
.ad l
.nh
.BR mmap (2),
.BR mprotect (2),
.BR posix_memalign (3),
.BR pthread_attr_init (3),
.BR pthread_attr_setguardsize (3),
.BR pthread_attr_setstackaddr (3),
.BR pthread_attr_setstacksize (3),
.BR pthread_create (3),
.BR pthreads (7)
