1 .\"
   2 .\" This file and its contents are supplied under the terms of the
   3 .\" Common Development and Distribution License ("CDDL"), version 1.0.
   4 .\" You may only use this file in accordance with the terms of version
   5 .\" 1.0 of the CDDL.
   6 .\"
   7 .\" A full copy of the text of the CDDL should have accompanied this
   8 .\" source.  A copy of the CDDL is also available via the Internet at
   9 .\" http://www.illumos.org/license/CDDL.
  10 .\"
  11 .\"
  12 .\" Copyright 2016 Joyent, Inc.
  13 .\"
  14 .Dd Aug 20, 2019
  15 .Dt PTHREAD_ATTR_GET_NP 3C
  16 .Os
  17 .Sh NAME
  18 .Nm pthread_attr_get_np
  19 .Nd get pthread attributes of a running thread
  20 .Sh SYNOPSIS
  21 .In pthread.h
  22 .Ft int
  23 .Fo pthread_attr_get_np
  24 .Fa "pthread_t thread"
  25 .Fa "pthread_attr_t *attr"
  26 .Fc
  27 .Sh DESCRIPTION
  28 The
  29 .Fn pthread_attr_get_np
  30 function provides a way to get the attributes of the thread
  31 .Fa thread
  32 after it has been created.
  33 This function is most commonly used to obtain the actual location and size of a
  34 thread's stack.
  35 .Pp
  36 The attributes pointer,
  37 .Fa attr ,
  38 will be filled in with the current attributes for the thread.
  39 The attributes should be allocated by a call to
  40 .Xr pthread_attr_init 3C
  41 prior to calling the
  42 .Fn pthread_attr_get_np
  43 function.
  44 When
  45 .Fa attr
  46 is done being used, it should be destroyed through a call to
  47 .Xr pthread_attr_destroy 3C .
  48 .Pp
  49 The attributes of the thread
  50 .Fa thread
  51 will be the same as those passed in at the time
  52 .Xr pthread_create 3C
  53 was called (or the default set if none were specified), except that the
  54 following values will be updated:
  55 .Bl -tag -width Sy
  56 .It Sy Thread Stack Size
  57 If no explicit stack size was specified, then
  58 .Fa attr
  59 will contain the actual size of the stack.
  60 .Pp
  61 If the size of the stack was specified, then it may have been changed to
  62 ensure that the required alignment of the platform is satisfied.
  63 .It Sy The Stack Address
  64 If no stack address was specified, then
  65 .Fa attr
  66 will contain the actual address of the stack that the system allocated
  67 for the thread.
  68 .It Sy Thread Detach State
  69 The detach state, whether or not the thread may be joined by a call to
  70 .Xr pthread_join 3C ,
  71 may have changed since the process was created due to a call to
  72 .Xr pthread_detach 3C .
  73 .Fa attr
  74 will reflect the current setting of
  75 .Fa thread .
  76 .It Sy Thread Scheduling Parameter
  77 The scheduling parameter attribute will be updated with the current
  78 scheduling parameter of
  79 .Fa thread .
  80 This is the same information as available through
  81 .Xr pthread_getschedparam 3C
  82 and it is the preferred interface for obtaining that information.
  83 .It Sy Thread Scheduling Policy
  84 The scheduling policy attribute of
  85 .Fa attr
  86 will be updated with the current scheduling policy being applied to the
  87 thread.
  88 This may have changed, for example, due to a call to
  89 .Xr pthread_setschedparam 3C .
  90 As with the thread's scheduling parameter, the preferred interface for
  91 obtaining this information is by using
  92 .Xr pthread_getschedparam 3C .
  93 .It Sy Thread Guard Size
  94 The value of the guard size attribute for the thread will be updated to
  95 reflect the actual size of the guard installed for
  96 .Fa thread .
  97 For more information on the guard size of a thread and its purpose, see
  98 .Xr pthread_attr_getguardsize 3C .
  99 .El
 100 .Sh RETURN VALUES
 101 Upon successful completion, the
 102 .Fn pthread_attr_get_np
 103 and
 104 .Fn pthread_getattr_np
 105 functions return
 106 .Sy 0 .
 107 Otherwise, an error number is returned to indicate the error.
 108 .Sh EXAMPLES
 109 The following program demonstrates how to use these functions to get
 110 the location and stack size of a newly created thread.
 111 .Bd -literal
 112 #include <assert.h>
 113 #include <errno.h>
 114 #include <pthread.h>
 115 #include <stdio.h>
 116 #include <stdlib.h>
 117 #include <string.h>
 118 
 119 static pthread_t g_thr;
 120 
 121 void *
 122 print_stackinfo(void *arg)
 123 {
 124         int ret;
 125         pthread_attr_t attr;
 126         pthread_t *thrp = arg;
 127         void *stk;
 128         size_t stksize;
 129 
 130         if (pthread_attr_init(&attr) != 0) {
 131                 fprintf(stderr, "failed to init attr: %s\\n",
 132                     strerror(errno));
 133                 exit(1);
 134         }
 135 
 136         if (pthread_attr_get_np(*thrp, &attr) != 0) {
 137                 fprintf(stderr, "failed to get thread attributes: %s\\n",
 138                     strerror(errno));
 139                 exit(1);
 140         }
 141 
 142         ret = pthread_attr_getstackaddr(&attr, &stk);
 143         assert(ret == 0);
 144         ret = pthread_attr_getstacksize(&attr, &stksize);
 145         assert(ret == 0);
 146         (void) printf("stack base is at %p, it is %d bytes large\\n",
 147             stk, stksize);
 148         return (NULL);
 149 }
 150 
 151 int
 152 main(void)
 153 {
 154         int ret;
 155 
 156         if ((ret = pthread_create(&g_thr, NULL, print_stackinfo,
 157             &g_thr) != 0)) {
 158                 fprintf(stderr, "failed to create a thread: %s\\n",
 159                     strerror(errno));
 160                 exit(1);
 161         }
 162 
 163         pthread_join(g_thr, NULL);
 164         return (0);
 165 }
 166 .Ed
 167 .Sh ERRORS
 168 The
 169 .Fn pthread_attr_get_np
 170 function will fail if:
 171 .Bl -tag -width Er
 172 .It Er EINVAL
 173 The pthread_attr_t object
 174 .Fa attr
 175 was not properly initialized with a call to
 176 .Xr pthread_attr_init 3C .
 177 .It Er ESRCH
 178 No thread could be found corresponding to the specified thread ID,
 179 .Fa thread .
 180 .El
 181 .Sh INTERFACE STABILITY
 182 .Sy Committed
 183 .Sh MT-LEVEL
 184 .Sy MT-Safe
 185 .Sh SEE ALSO
 186 .Xr pthread_attr_destroy 3C ,
 187 .Xr pthread_attr_getdetachstate 3C ,
 188 .Xr pthread_attr_getguardsize 3C ,
 189 .Xr pthread_attr_getinheritsched 3C ,
 190 .Xr pthread_attr_getschedparam 3C ,
 191 .Xr pthread_attr_getschedpolicy 3C ,
 192 .Xr pthread_attr_getscope 3C ,
 193 .Xr pthread_attr_getstackaddr 3C ,
 194 .Xr pthread_attr_getstacksize 3C ,
 195 .Xr pthread_attr_init 3C ,
 196 .Xr pthread_create 3C ,
 197 .Xr pthread_detach 3C ,
 198 .Xr pthread_getschedparam 3C ,
 199 .Xr pthread_setschedparam 3C ,
 200 .Xr attributes 5 ,
 201 .Xr threads 5