e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * This file and its contents are supplied under the terms of the
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * You may only use this file in accordance with the terms of version
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * 1.0 of the CDDL.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * A full copy of the text of the CDDL should have accompanied this
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * source. A copy of the CDDL is also available via the Internet at
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * http://www.illumos.org/license/CDDL.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Copyright 2016 Joyent, Inc.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Test and verify that pthrad_attr_get_np works as we expect.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Verify the following:
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o ESRCH
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o stack size is set to a valid value after a thread is created.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o main thread can grab an alternate thread's info.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o custom guard size is honored
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o detach state
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - detached 1
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - joinable 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - changing 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o daemon state
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - enabled 1
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - disabled 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o scope
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - system 1
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - process 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o inheritable
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - inherit 1
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - explicit 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o priority
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - honors change 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * o policy
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * - honours change 2
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * For each of the cases above we explicitly go through and create the set of
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * attributes as marked above and then inside of a thread, verify that the
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * attributes match what we expect. Because each case ends up in creating a
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * detached thread, we opt to have both it and the main thread enter a barrier
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * to indicate that we have completed the test successfully.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <errno.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <limits.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <stdio.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <pthread.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <unistd.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <ucontext.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <sched.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <strings.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <stdlib.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <sys/procfs.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#include <sys/debug.h>
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Currently these are only defined in thr_uberdata.h. Rather than trying and
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * fight with libc headers, just explicitly define them here.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#define PTHREAD_CREATE_DAEMON_NP 0x100 /* = THR_DAEMON */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#define PTHREAD_CREATE_NONDAEMON_NP 0
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchiextern int pthread_attr_setdaemonstate_np(pthread_attr_t *, int);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchiextern int pthread_attr_getdaemonstate_np(const pthread_attr_t *, int *);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi#define PGN_TEST_PRI 23
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic pthread_attr_t pgn_attr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic pthread_attr_t pgn_thr_attr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic pthread_barrier_t pgn_barrier;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Verify that the stack pointer of a context is consistent with where the
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * attributes indicate.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_verif_thr_stack(pthread_attr_t *attr)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi size_t stksz;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi void *stk;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi ucontext_t ctx;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi uint32_t sp;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(getcontext(&ctx));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getstack(attr, &stk, &stksz));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3P(stk, !=, NULL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(stksz, !=, 0);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi sp = ctx.uc_mcontext.gregs[R_SP];
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3U(sp, >, (uintptr_t)stk);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3U(sp, <, (uintptr_t)stk + stksz);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_test_fini(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int ret;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi ret = pthread_barrier_wait(&pgn_barrier);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY(ret == 0 || ret == PTHREAD_BARRIER_SERIAL_THREAD);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_destroy(&pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_destroy(&pgn_thr_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_barrier_destroy(&pgn_barrier));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_test_init(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_init(&pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_init(&pgn_thr_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_barrier_init(&pgn_barrier, NULL, 2));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/* ARGSUSED */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_one_thr(void *arg)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int odetach, ndetach;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int odaemon, ndaemon;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int oscope, nscope;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int oinherit, ninherit;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_verif_thr_stack(&pgn_attr);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdetachstate(&pgn_thr_attr, &odetach));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(odetach, ==, ndetach);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ndetach, ==, PTHREAD_CREATE_DETACHED);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdaemonstate_np(&pgn_thr_attr, &odaemon));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdaemonstate_np(&pgn_attr, &ndaemon));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(odaemon, ==, ndaemon);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ndaemon, ==, PTHREAD_CREATE_DAEMON_NP);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getscope(&pgn_thr_attr, &oscope));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getscope(&pgn_attr, &nscope));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(oscope, ==, nscope);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(nscope, ==, PTHREAD_SCOPE_SYSTEM);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getinheritsched(&pgn_thr_attr, &oinherit));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getinheritsched(&pgn_attr, &ninherit));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(oinherit, ==, ninherit);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ninherit, ==, PTHREAD_INHERIT_SCHED);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi return (NULL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_one(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int ret;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pthread_t thr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_init();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setdetachstate(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_CREATE_DETACHED));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setdaemonstate_np(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_CREATE_DAEMON_NP));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setscope(&pgn_thr_attr, PTHREAD_SCOPE_SYSTEM));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setinheritsched(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_INHERIT_SCHED));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_create(&thr, &pgn_thr_attr, pgn_set_one_thr, NULL));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi /*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Verify it's not joinable.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi ret = pthread_join(thr, NULL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ret, ==, EINVAL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi /*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * At this point we let the test continue and wait on the barrier. We'll
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * wake up when the other thread is done.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_fini();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/* ARGSUSED */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_two_thr(void *arg)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int odetach, ndetach;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int odaemon, ndaemon;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int oscope, nscope;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int oinherit, ninherit;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int opolicy, npolicy;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi struct sched_param oparam, nparam;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_verif_thr_stack(&pgn_attr);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdetachstate(&pgn_thr_attr, &odetach));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(odetach, ==, ndetach);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ndetach, ==, PTHREAD_CREATE_JOINABLE);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdaemonstate_np(&pgn_thr_attr, &odaemon));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdaemonstate_np(&pgn_attr, &ndaemon));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(odaemon, ==, ndaemon);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ndaemon, ==, PTHREAD_CREATE_NONDAEMON_NP);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getscope(&pgn_thr_attr, &oscope));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getscope(&pgn_attr, &nscope));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(oscope, ==, nscope);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(nscope, ==, PTHREAD_SCOPE_PROCESS);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getinheritsched(&pgn_thr_attr, &oinherit));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getinheritsched(&pgn_attr, &ninherit));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(oinherit, ==, ninherit);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ninherit, ==, PTHREAD_EXPLICIT_SCHED);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getschedpolicy(&pgn_thr_attr, &opolicy));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getschedpolicy(&pgn_attr, &npolicy));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(opolicy, ==, npolicy);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(npolicy, ==, SCHED_FSS);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi /*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * Now that we've validated the basics, go ahead and test the changes,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * which include making sure that we see updates via
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * pthread_setschedparam() and pthread_detach().
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_detach(pthread_self()));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi opolicy = SCHED_FX;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi oparam.sched_priority = PGN_TEST_PRI;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_setschedparam(pthread_self(), opolicy, &oparam));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_get_np(pthread_self(), &pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getdetachstate(&pgn_attr, &ndetach));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(odetach, !=, ndetach);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ndetach, ==, PTHREAD_CREATE_DETACHED);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getschedpolicy(&pgn_attr, &npolicy));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getschedparam(&pgn_attr, &nparam));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(opolicy, ==, npolicy);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(npolicy, ==, SCHED_FX);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(oparam.sched_priority, ==, nparam.sched_priority);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(nparam.sched_priority, ==, PGN_TEST_PRI);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi return (NULL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_two(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pthread_t thr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_init();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setdetachstate(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_CREATE_JOINABLE));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setdaemonstate_np(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_CREATE_NONDAEMON_NP));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setscope(&pgn_thr_attr, PTHREAD_SCOPE_PROCESS));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setinheritsched(&pgn_thr_attr,
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi PTHREAD_EXPLICIT_SCHED));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_setschedpolicy(&pgn_thr_attr, SCHED_FSS));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_create(&thr, &pgn_thr_attr, pgn_set_two_thr, NULL));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi /*
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * At this point we let the test continue and wait on the barrier. We'll
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi * wake up when the other thread is done.
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_fini();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi/* ARGSUSED */
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchistatic void *
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_three_thr(void *arg)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(pthread_barrier_wait(&pgn_barrier), !=, 1);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi return (NULL);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchivoid
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchipgn_set_three(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pthread_t thr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pthread_attr_t altattr, selfattr;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi void *altstk, *selfstk;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi size_t altsz, selfsz;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_init(&altattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_init(&selfattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_init();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_create(&thr, NULL, pgn_set_three_thr, NULL));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_get_np(thr, &altattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_get_np(pthread_self(), &selfattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getstack(&selfattr, &selfstk, &selfsz));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_getstack(&altattr, &altstk, &altsz));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3P(altstk, !=, selfstk);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_test_fini();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_destroy(&selfattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_destroy(&altattr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchiint
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchimain(void)
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi{
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi int ret;
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY0(pthread_attr_init(&pgn_attr));
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi ret = pthread_attr_get_np(UINT32_MAX, &pgn_attr);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi VERIFY3S(ret, ==, ESRCH);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_set_one();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_set_two();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi pgn_set_three();
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi exit(0);
e56998eefc33ead0f12b364be915dd6bfc12a3f5Robert Mustacchi}