xref: /illumos-gate/usr/src/test/libc-tests/tests/threads/pthread_attr_get_np.c (revision 0cc4b3ed113ebd5447f33e18c4a6323f75aa1fe5)
1*e56998eeSRobert Mustacchi /*
2*e56998eeSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*e56998eeSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*e56998eeSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*e56998eeSRobert Mustacchi  * 1.0 of the CDDL.
6*e56998eeSRobert Mustacchi  *
7*e56998eeSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*e56998eeSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*e56998eeSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*e56998eeSRobert Mustacchi  */
11*e56998eeSRobert Mustacchi 
12*e56998eeSRobert Mustacchi /*
13*e56998eeSRobert Mustacchi  * Copyright 2016 Joyent, Inc.
14*e56998eeSRobert Mustacchi  */
15*e56998eeSRobert Mustacchi 
16*e56998eeSRobert Mustacchi /*
17*e56998eeSRobert Mustacchi  * Test and verify that pthrad_attr_get_np works as we expect.
18*e56998eeSRobert Mustacchi  *
19*e56998eeSRobert Mustacchi  * Verify the following:
20*e56998eeSRobert Mustacchi  *   o ESRCH
21*e56998eeSRobert Mustacchi  *   o stack size is set to a valid value after a thread is created.
22*e56998eeSRobert Mustacchi  *   o main thread can grab an alternate thread's info.
23*e56998eeSRobert Mustacchi  *   o custom guard size is honored
24*e56998eeSRobert Mustacchi  *   o detach state
25*e56998eeSRobert Mustacchi  *   	- detached	1
26*e56998eeSRobert Mustacchi  *   	- joinable		2
27*e56998eeSRobert Mustacchi  *   	- changing		2
28*e56998eeSRobert Mustacchi  *   o daemon state
29*e56998eeSRobert Mustacchi  *   	- enabled	1
30*e56998eeSRobert Mustacchi  *   	- disabled		2
31*e56998eeSRobert Mustacchi  *   o scope
32*e56998eeSRobert Mustacchi  *   	- system	1
33*e56998eeSRobert Mustacchi  *   	- process		2
34*e56998eeSRobert Mustacchi  *   o inheritable
35*e56998eeSRobert Mustacchi  *   	- inherit	1
36*e56998eeSRobert Mustacchi  *   	- explicit		2
37*e56998eeSRobert Mustacchi  *   o priority
38*e56998eeSRobert Mustacchi  *   	- honors change		2
39*e56998eeSRobert Mustacchi  *   o policy
40*e56998eeSRobert Mustacchi  *   	- honours change	2
41*e56998eeSRobert Mustacchi  *
42*e56998eeSRobert Mustacchi  *
43*e56998eeSRobert Mustacchi  * For each of the cases above we explicitly go through and create the set of
44*e56998eeSRobert Mustacchi  * attributes as marked above and then inside of a thread, verify that the
45*e56998eeSRobert Mustacchi  * attributes match what we expect. Because each case ends up in creating a
46*e56998eeSRobert Mustacchi  * detached thread, we opt to have both it and the main thread enter a barrier
47*e56998eeSRobert Mustacchi  * to indicate that we have completed the test successfully.
48*e56998eeSRobert Mustacchi  */
49*e56998eeSRobert Mustacchi 
50*e56998eeSRobert Mustacchi #include <errno.h>
51*e56998eeSRobert Mustacchi #include <limits.h>
52*e56998eeSRobert Mustacchi #include <stdio.h>
53*e56998eeSRobert Mustacchi #include <pthread.h>
54*e56998eeSRobert Mustacchi #include <unistd.h>
55*e56998eeSRobert Mustacchi #include <ucontext.h>
56*e56998eeSRobert Mustacchi #include <sched.h>
57*e56998eeSRobert Mustacchi #include <strings.h>
58*e56998eeSRobert Mustacchi #include <stdlib.h>
59*e56998eeSRobert Mustacchi 
60*e56998eeSRobert Mustacchi #include <sys/procfs.h>
61*e56998eeSRobert Mustacchi #include <sys/debug.h>
62*e56998eeSRobert Mustacchi 
63*e56998eeSRobert Mustacchi /*
64*e56998eeSRobert Mustacchi  * Currently these are only defined in thr_uberdata.h. Rather than trying and
65*e56998eeSRobert Mustacchi  * fight with libc headers, just explicitly define them here.
66*e56998eeSRobert Mustacchi  */
67*e56998eeSRobert Mustacchi #define	PTHREAD_CREATE_DAEMON_NP	0x100	/* = THR_DAEMON */
68*e56998eeSRobert Mustacchi #define	PTHREAD_CREATE_NONDAEMON_NP	0
69*e56998eeSRobert Mustacchi extern	int	pthread_attr_setdaemonstate_np(pthread_attr_t *, int);
70*e56998eeSRobert Mustacchi extern	int	pthread_attr_getdaemonstate_np(const pthread_attr_t *, int *);
71*e56998eeSRobert Mustacchi 
72*e56998eeSRobert Mustacchi #define	PGN_TEST_PRI	23
73*e56998eeSRobert Mustacchi 
74*e56998eeSRobert Mustacchi static pthread_attr_t pgn_attr;
75*e56998eeSRobert Mustacchi static pthread_attr_t pgn_thr_attr;
76*e56998eeSRobert Mustacchi static pthread_barrier_t pgn_barrier;
77*e56998eeSRobert Mustacchi 
78*e56998eeSRobert Mustacchi 
79*e56998eeSRobert Mustacchi /*
80*e56998eeSRobert Mustacchi  * Verify that the stack pointer of a context is consistent with where the
81*e56998eeSRobert Mustacchi  * attributes indicate.
82*e56998eeSRobert Mustacchi  */
83*e56998eeSRobert Mustacchi static void
pgn_verif_thr_stack(pthread_attr_t * attr)84*e56998eeSRobert Mustacchi pgn_verif_thr_stack(pthread_attr_t *attr)
85*e56998eeSRobert Mustacchi {
86*e56998eeSRobert Mustacchi 	size_t stksz;
87*e56998eeSRobert Mustacchi 	void *stk;
88*e56998eeSRobert Mustacchi 	ucontext_t ctx;
89*e56998eeSRobert Mustacchi 	uint32_t sp;
90*e56998eeSRobert Mustacchi 
91*e56998eeSRobert Mustacchi 	VERIFY0(getcontext(&ctx));
92*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getstack(attr, &stk, &stksz));
93*e56998eeSRobert Mustacchi 	VERIFY3P(stk, !=, NULL);
94*e56998eeSRobert Mustacchi 	VERIFY3S(stksz, !=, 0);
95*e56998eeSRobert Mustacchi 	sp = ctx.uc_mcontext.gregs[R_SP];
96*e56998eeSRobert Mustacchi 	VERIFY3U(sp, >, (uintptr_t)stk);
97*e56998eeSRobert Mustacchi 	VERIFY3U(sp, <, (uintptr_t)stk + stksz);
98*e56998eeSRobert Mustacchi }
99*e56998eeSRobert Mustacchi 
100*e56998eeSRobert Mustacchi 
101*e56998eeSRobert Mustacchi static void
pgn_test_fini(void)102*e56998eeSRobert Mustacchi pgn_test_fini(void)
103*e56998eeSRobert Mustacchi {
104*e56998eeSRobert Mustacchi 	int ret;
105*e56998eeSRobert Mustacchi 
106*e56998eeSRobert Mustacchi 	ret = pthread_barrier_wait(&pgn_barrier);
107*e56998eeSRobert Mustacchi 	VERIFY(ret == 0 || ret == PTHREAD_BARRIER_SERIAL_THREAD);
108*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_destroy(&pgn_attr));
109*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_destroy(&pgn_thr_attr));
110*e56998eeSRobert Mustacchi 	VERIFY0(pthread_barrier_destroy(&pgn_barrier));
111*e56998eeSRobert Mustacchi }
112*e56998eeSRobert Mustacchi 
113*e56998eeSRobert Mustacchi static void
pgn_test_init(void)114*e56998eeSRobert Mustacchi pgn_test_init(void)
115*e56998eeSRobert Mustacchi {
116*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_init(&pgn_attr));
117*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_init(&pgn_thr_attr));
118*e56998eeSRobert Mustacchi 	VERIFY0(pthread_barrier_init(&pgn_barrier, NULL, 2));
119*e56998eeSRobert Mustacchi }
120*e56998eeSRobert Mustacchi 
121*e56998eeSRobert Mustacchi /* ARGSUSED */
122*e56998eeSRobert Mustacchi static void *
pgn_set_one_thr(void * arg)123*e56998eeSRobert Mustacchi pgn_set_one_thr(void *arg)
124*e56998eeSRobert Mustacchi {
125*e56998eeSRobert Mustacchi 	int odetach, ndetach;
126*e56998eeSRobert Mustacchi 	int odaemon, ndaemon;
127*e56998eeSRobert Mustacchi 	int oscope, nscope;
128*e56998eeSRobert Mustacchi 	int oinherit, ninherit;
129*e56998eeSRobert Mustacchi 
130*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
131*e56998eeSRobert Mustacchi 	pgn_verif_thr_stack(&pgn_attr);
132*e56998eeSRobert Mustacchi 
133*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdetachstate(&pgn_thr_attr, &odetach));
134*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
135*e56998eeSRobert Mustacchi 
136*e56998eeSRobert Mustacchi 	VERIFY3S(odetach, ==, ndetach);
137*e56998eeSRobert Mustacchi 	VERIFY3S(ndetach, ==, PTHREAD_CREATE_DETACHED);
138*e56998eeSRobert Mustacchi 
139*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdaemonstate_np(&pgn_thr_attr, &odaemon));
140*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdaemonstate_np(&pgn_attr, &ndaemon));
141*e56998eeSRobert Mustacchi 
142*e56998eeSRobert Mustacchi 	VERIFY3S(odaemon, ==, ndaemon);
143*e56998eeSRobert Mustacchi 	VERIFY3S(ndaemon, ==, PTHREAD_CREATE_DAEMON_NP);
144*e56998eeSRobert Mustacchi 
145*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getscope(&pgn_thr_attr, &oscope));
146*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getscope(&pgn_attr, &nscope));
147*e56998eeSRobert Mustacchi 
148*e56998eeSRobert Mustacchi 	VERIFY3S(oscope, ==, nscope);
149*e56998eeSRobert Mustacchi 	VERIFY3S(nscope, ==, PTHREAD_SCOPE_SYSTEM);
150*e56998eeSRobert Mustacchi 
151*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getinheritsched(&pgn_thr_attr, &oinherit));
152*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getinheritsched(&pgn_attr, &ninherit));
153*e56998eeSRobert Mustacchi 
154*e56998eeSRobert Mustacchi 	VERIFY3S(oinherit, ==, ninherit);
155*e56998eeSRobert Mustacchi 	VERIFY3S(ninherit, ==, PTHREAD_INHERIT_SCHED);
156*e56998eeSRobert Mustacchi 
157*e56998eeSRobert Mustacchi 	VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
158*e56998eeSRobert Mustacchi 	return (NULL);
159*e56998eeSRobert Mustacchi }
160*e56998eeSRobert Mustacchi 
161*e56998eeSRobert Mustacchi static void
pgn_set_one(void)162*e56998eeSRobert Mustacchi pgn_set_one(void)
163*e56998eeSRobert Mustacchi {
164*e56998eeSRobert Mustacchi 	int ret;
165*e56998eeSRobert Mustacchi 	pthread_t thr;
166*e56998eeSRobert Mustacchi 
167*e56998eeSRobert Mustacchi 	pgn_test_init();
168*e56998eeSRobert Mustacchi 
169*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setdetachstate(&pgn_thr_attr,
170*e56998eeSRobert Mustacchi 	    PTHREAD_CREATE_DETACHED));
171*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setdaemonstate_np(&pgn_thr_attr,
172*e56998eeSRobert Mustacchi 	    PTHREAD_CREATE_DAEMON_NP));
173*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setscope(&pgn_thr_attr, PTHREAD_SCOPE_SYSTEM));
174*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setinheritsched(&pgn_thr_attr,
175*e56998eeSRobert Mustacchi 	    PTHREAD_INHERIT_SCHED));
176*e56998eeSRobert Mustacchi 
177*e56998eeSRobert Mustacchi 	VERIFY0(pthread_create(&thr, &pgn_thr_attr, pgn_set_one_thr, NULL));
178*e56998eeSRobert Mustacchi 
179*e56998eeSRobert Mustacchi 	/*
180*e56998eeSRobert Mustacchi 	 * Verify it's not joinable.
181*e56998eeSRobert Mustacchi 	 */
182*e56998eeSRobert Mustacchi 	ret = pthread_join(thr, NULL);
183*e56998eeSRobert Mustacchi 	VERIFY3S(ret, ==, EINVAL);
184*e56998eeSRobert Mustacchi 
185*e56998eeSRobert Mustacchi 	/*
186*e56998eeSRobert Mustacchi 	 * At this point we let the test continue and wait on the barrier. We'll
187*e56998eeSRobert Mustacchi 	 * wake up when the other thread is done.
188*e56998eeSRobert Mustacchi 	 */
189*e56998eeSRobert Mustacchi 	pgn_test_fini();
190*e56998eeSRobert Mustacchi }
191*e56998eeSRobert Mustacchi 
192*e56998eeSRobert Mustacchi /* ARGSUSED */
193*e56998eeSRobert Mustacchi static void *
pgn_set_two_thr(void * arg)194*e56998eeSRobert Mustacchi pgn_set_two_thr(void *arg)
195*e56998eeSRobert Mustacchi {
196*e56998eeSRobert Mustacchi 	int odetach, ndetach;
197*e56998eeSRobert Mustacchi 	int odaemon, ndaemon;
198*e56998eeSRobert Mustacchi 	int oscope, nscope;
199*e56998eeSRobert Mustacchi 	int oinherit, ninherit;
200*e56998eeSRobert Mustacchi 	int opolicy, npolicy;
201*e56998eeSRobert Mustacchi 	struct sched_param oparam, nparam;
202*e56998eeSRobert Mustacchi 
203*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
204*e56998eeSRobert Mustacchi 	pgn_verif_thr_stack(&pgn_attr);
205*e56998eeSRobert Mustacchi 
206*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdetachstate(&pgn_thr_attr, &odetach));
207*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
208*e56998eeSRobert Mustacchi 
209*e56998eeSRobert Mustacchi 	VERIFY3S(odetach, ==, ndetach);
210*e56998eeSRobert Mustacchi 	VERIFY3S(ndetach, ==, PTHREAD_CREATE_JOINABLE);
211*e56998eeSRobert Mustacchi 
212*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdaemonstate_np(&pgn_thr_attr, &odaemon));
213*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdaemonstate_np(&pgn_attr, &ndaemon));
214*e56998eeSRobert Mustacchi 
215*e56998eeSRobert Mustacchi 	VERIFY3S(odaemon, ==, ndaemon);
216*e56998eeSRobert Mustacchi 	VERIFY3S(ndaemon, ==, PTHREAD_CREATE_NONDAEMON_NP);
217*e56998eeSRobert Mustacchi 
218*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getscope(&pgn_thr_attr, &oscope));
219*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getscope(&pgn_attr, &nscope));
220*e56998eeSRobert Mustacchi 
221*e56998eeSRobert Mustacchi 	VERIFY3S(oscope, ==, nscope);
222*e56998eeSRobert Mustacchi 	VERIFY3S(nscope, ==, PTHREAD_SCOPE_PROCESS);
223*e56998eeSRobert Mustacchi 
224*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getinheritsched(&pgn_thr_attr, &oinherit));
225*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getinheritsched(&pgn_attr, &ninherit));
226*e56998eeSRobert Mustacchi 
227*e56998eeSRobert Mustacchi 	VERIFY3S(oinherit, ==, ninherit);
228*e56998eeSRobert Mustacchi 	VERIFY3S(ninherit, ==, PTHREAD_EXPLICIT_SCHED);
229*e56998eeSRobert Mustacchi 
230*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getschedpolicy(&pgn_thr_attr, &opolicy));
231*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getschedpolicy(&pgn_attr, &npolicy));
232*e56998eeSRobert Mustacchi 
233*e56998eeSRobert Mustacchi 	VERIFY3S(opolicy, ==, npolicy);
234*e56998eeSRobert Mustacchi 	VERIFY3S(npolicy, ==, SCHED_FSS);
235*e56998eeSRobert Mustacchi 
236*e56998eeSRobert Mustacchi 	/*
237*e56998eeSRobert Mustacchi 	 * Now that we've validated the basics, go ahead and test the changes,
238*e56998eeSRobert Mustacchi 	 * which include making sure that we see updates via
239*e56998eeSRobert Mustacchi 	 * pthread_setschedparam() and pthread_detach().
240*e56998eeSRobert Mustacchi 	 */
241*e56998eeSRobert Mustacchi 	VERIFY0(pthread_detach(pthread_self()));
242*e56998eeSRobert Mustacchi 
243*e56998eeSRobert Mustacchi 	opolicy = SCHED_FX;
244*e56998eeSRobert Mustacchi 	oparam.sched_priority = PGN_TEST_PRI;
245*e56998eeSRobert Mustacchi 	VERIFY0(pthread_setschedparam(pthread_self(), opolicy, &oparam));
246*e56998eeSRobert Mustacchi 
247*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
248*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
249*e56998eeSRobert Mustacchi 
250*e56998eeSRobert Mustacchi 	VERIFY3S(odetach, !=, ndetach);
251*e56998eeSRobert Mustacchi 	VERIFY3S(ndetach, ==, PTHREAD_CREATE_DETACHED);
252*e56998eeSRobert Mustacchi 
253*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getschedpolicy(&pgn_attr, &npolicy));
254*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getschedparam(&pgn_attr, &nparam));
255*e56998eeSRobert Mustacchi 
256*e56998eeSRobert Mustacchi 	VERIFY3S(opolicy, ==, npolicy);
257*e56998eeSRobert Mustacchi 	VERIFY3S(npolicy, ==, SCHED_FX);
258*e56998eeSRobert Mustacchi 
259*e56998eeSRobert Mustacchi 	VERIFY3S(oparam.sched_priority, ==, nparam.sched_priority);
260*e56998eeSRobert Mustacchi 	VERIFY3S(nparam.sched_priority, ==, PGN_TEST_PRI);
261*e56998eeSRobert Mustacchi 
262*e56998eeSRobert Mustacchi 	VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
263*e56998eeSRobert Mustacchi 
264*e56998eeSRobert Mustacchi 	return (NULL);
265*e56998eeSRobert Mustacchi }
266*e56998eeSRobert Mustacchi 
267*e56998eeSRobert Mustacchi static void
pgn_set_two(void)268*e56998eeSRobert Mustacchi pgn_set_two(void)
269*e56998eeSRobert Mustacchi {
270*e56998eeSRobert Mustacchi 	pthread_t thr;
271*e56998eeSRobert Mustacchi 
272*e56998eeSRobert Mustacchi 	pgn_test_init();
273*e56998eeSRobert Mustacchi 
274*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setdetachstate(&pgn_thr_attr,
275*e56998eeSRobert Mustacchi 	    PTHREAD_CREATE_JOINABLE));
276*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setdaemonstate_np(&pgn_thr_attr,
277*e56998eeSRobert Mustacchi 	    PTHREAD_CREATE_NONDAEMON_NP));
278*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setscope(&pgn_thr_attr, PTHREAD_SCOPE_PROCESS));
279*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setinheritsched(&pgn_thr_attr,
280*e56998eeSRobert Mustacchi 	    PTHREAD_EXPLICIT_SCHED));
281*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_setschedpolicy(&pgn_thr_attr, SCHED_FSS));
282*e56998eeSRobert Mustacchi 
283*e56998eeSRobert Mustacchi 	VERIFY0(pthread_create(&thr, &pgn_thr_attr, pgn_set_two_thr, NULL));
284*e56998eeSRobert Mustacchi 
285*e56998eeSRobert Mustacchi 	/*
286*e56998eeSRobert Mustacchi 	 * At this point we let the test continue and wait on the barrier. We'll
287*e56998eeSRobert Mustacchi 	 * wake up when the other thread is done.
288*e56998eeSRobert Mustacchi 	 */
289*e56998eeSRobert Mustacchi 	pgn_test_fini();
290*e56998eeSRobert Mustacchi }
291*e56998eeSRobert Mustacchi 
292*e56998eeSRobert Mustacchi /* ARGSUSED */
293*e56998eeSRobert Mustacchi static void *
pgn_set_three_thr(void * arg)294*e56998eeSRobert Mustacchi pgn_set_three_thr(void *arg)
295*e56998eeSRobert Mustacchi {
296*e56998eeSRobert Mustacchi 	VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
297*e56998eeSRobert Mustacchi 
298*e56998eeSRobert Mustacchi 	return (NULL);
299*e56998eeSRobert Mustacchi }
300*e56998eeSRobert Mustacchi 
301*e56998eeSRobert Mustacchi void
pgn_set_three(void)302*e56998eeSRobert Mustacchi pgn_set_three(void)
303*e56998eeSRobert Mustacchi {
304*e56998eeSRobert Mustacchi 	pthread_t thr;
305*e56998eeSRobert Mustacchi 	pthread_attr_t altattr, selfattr;
306*e56998eeSRobert Mustacchi 	void *altstk, *selfstk;
307*e56998eeSRobert Mustacchi 	size_t altsz, selfsz;
308*e56998eeSRobert Mustacchi 
309*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_init(&altattr));
310*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_init(&selfattr));
311*e56998eeSRobert Mustacchi 	pgn_test_init();
312*e56998eeSRobert Mustacchi 
313*e56998eeSRobert Mustacchi 	VERIFY0(pthread_create(&thr, NULL, pgn_set_three_thr, NULL));
314*e56998eeSRobert Mustacchi 
315*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_get_np(thr, &altattr));
316*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_get_np(pthread_self(), &selfattr));
317*e56998eeSRobert Mustacchi 
318*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getstack(&selfattr, &selfstk, &selfsz));
319*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_getstack(&altattr, &altstk, &altsz));
320*e56998eeSRobert Mustacchi 	VERIFY3P(altstk, !=, selfstk);
321*e56998eeSRobert Mustacchi 
322*e56998eeSRobert Mustacchi 	pgn_test_fini();
323*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_destroy(&selfattr));
324*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_destroy(&altattr));
325*e56998eeSRobert Mustacchi }
326*e56998eeSRobert Mustacchi 
327*e56998eeSRobert Mustacchi int
main(void)328*e56998eeSRobert Mustacchi main(void)
329*e56998eeSRobert Mustacchi {
330*e56998eeSRobert Mustacchi 	int ret;
331*e56998eeSRobert Mustacchi 
332*e56998eeSRobert Mustacchi 	VERIFY0(pthread_attr_init(&pgn_attr));
333*e56998eeSRobert Mustacchi 
334*e56998eeSRobert Mustacchi 	ret = pthread_attr_get_np(UINT32_MAX, &pgn_attr);
335*e56998eeSRobert Mustacchi 	VERIFY3S(ret, ==, ESRCH);
336*e56998eeSRobert Mustacchi 
337*e56998eeSRobert Mustacchi 	pgn_set_one();
338*e56998eeSRobert Mustacchi 	pgn_set_two();
339*e56998eeSRobert Mustacchi 	pgn_set_three();
340*e56998eeSRobert Mustacchi 
341*e56998eeSRobert Mustacchi 	exit(0);
342*e56998eeSRobert Mustacchi }
343