stress.c revision e9410dfd93b8e415ecbe3f7e09a085462b27836e
10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew* Copyright (c) 2005, Bull S.A..  All rights reserved.
30dc076565f772bb1953209fb69ea150b494aaa40robbiew* Created by: Sebastien Decugis
40dc076565f772bb1953209fb69ea150b494aaa40robbiew
50dc076565f772bb1953209fb69ea150b494aaa40robbiew* This program is free software; you can redistribute it and/or modify it
60dc076565f772bb1953209fb69ea150b494aaa40robbiew* under the terms of version 2 of the GNU General Public License as
70dc076565f772bb1953209fb69ea150b494aaa40robbiew* published by the Free Software Foundation.
80dc076565f772bb1953209fb69ea150b494aaa40robbiew*
90dc076565f772bb1953209fb69ea150b494aaa40robbiew* This program is distributed in the hope that it would be useful, but
100dc076565f772bb1953209fb69ea150b494aaa40robbiew* WITHOUT ANY WARRANTY; without even the implied warranty of
110dc076565f772bb1953209fb69ea150b494aaa40robbiew* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
120dc076565f772bb1953209fb69ea150b494aaa40robbiew*
130dc076565f772bb1953209fb69ea150b494aaa40robbiew* You should have received a copy of the GNU General Public License along
140dc076565f772bb1953209fb69ea150b494aaa40robbiew* with this program; if not, write the Free Software Foundation, Inc., 59
150dc076565f772bb1953209fb69ea150b494aaa40robbiew* Temple Place - Suite 330, Boston MA 02111-1307, USA.
160dc076565f772bb1953209fb69ea150b494aaa40robbiew
170dc076565f772bb1953209fb69ea150b494aaa40robbiew
180dc076565f772bb1953209fb69ea150b494aaa40robbiew* This stress test aims to test the following assertion:
190dc076565f772bb1953209fb69ea150b494aaa40robbiew
200dc076565f772bb1953209fb69ea150b494aaa40robbiew*  pthread_getschedparam() always returns the scheduling parameters of
210dc076565f772bb1953209fb69ea150b494aaa40robbiew* the queried thread.
220dc076565f772bb1953209fb69ea150b494aaa40robbiew
230dc076565f772bb1953209fb69ea150b494aaa40robbiew* The steps are:
240dc076565f772bb1953209fb69ea150b494aaa40robbiew* -> Create several threads with different scheduling parameters.
250dc076565f772bb1953209fb69ea150b494aaa40robbiew* -> create more threads which call continuously the routine, and check
260dc076565f772bb1953209fb69ea150b494aaa40robbiew* -> that the correct parameters are always returned.
270dc076565f772bb1953209fb69ea150b494aaa40robbiew
280dc076565f772bb1953209fb69ea150b494aaa40robbiew*/
290dc076565f772bb1953209fb69ea150b494aaa40robbiew
300dc076565f772bb1953209fb69ea150b494aaa40robbiew
310dc076565f772bb1953209fb69ea150b494aaa40robbiew/* We are testing conformance to IEEE Std 1003.1, 2003 Edition */
320dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _POSIX_C_SOURCE 200112L
330dc076565f772bb1953209fb69ea150b494aaa40robbiew
340dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
350dc076565f772bb1953209fb69ea150b494aaa40robbiew/****************************** standard includes *****************************************/
360dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
370dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <pthread.h>
380dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdarg.h>
390dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
400dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
410dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
420dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
430dc076565f772bb1953209fb69ea150b494aaa40robbiew
440dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
450dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h>
460dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sched.h>
470dc076565f772bb1953209fb69ea150b494aaa40robbiew
480dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
490dc076565f772bb1953209fb69ea150b494aaa40robbiew/******************************   Test framework   *****************************************/
500dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
510dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "testfrmw.h"
520dc076565f772bb1953209fb69ea150b494aaa40robbiew #include "testfrmw.c"
530dc076565f772bb1953209fb69ea150b494aaa40robbiew/* This header is responsible for defining the following macros:
540dc076565f772bb1953209fb69ea150b494aaa40robbiew * UNRESOLVED(ret, descr);
550dc076565f772bb1953209fb69ea150b494aaa40robbiew *    where descr is a description of the error and ret is an int (error code for example)
560dc076565f772bb1953209fb69ea150b494aaa40robbiew * FAILED(descr);
570dc076565f772bb1953209fb69ea150b494aaa40robbiew *    where descr is a short text saying why the test has failed.
580dc076565f772bb1953209fb69ea150b494aaa40robbiew * PASSED();
590dc076565f772bb1953209fb69ea150b494aaa40robbiew *    No parameter.
600dc076565f772bb1953209fb69ea150b494aaa40robbiew *
610dc076565f772bb1953209fb69ea150b494aaa40robbiew * Both three macros shall terminate the calling process.
620dc076565f772bb1953209fb69ea150b494aaa40robbiew * The testcase shall not terminate in any other maneer.
630dc076565f772bb1953209fb69ea150b494aaa40robbiew *
640dc076565f772bb1953209fb69ea150b494aaa40robbiew * The other file defines the functions
650dc076565f772bb1953209fb69ea150b494aaa40robbiew * void output_init()
660dc076565f772bb1953209fb69ea150b494aaa40robbiew * void output(char * string, ...)
670dc076565f772bb1953209fb69ea150b494aaa40robbiew *
680dc076565f772bb1953209fb69ea150b494aaa40robbiew * Those may be used to output information.
690dc076565f772bb1953209fb69ea150b494aaa40robbiew */
700dc076565f772bb1953209fb69ea150b494aaa40robbiew
710dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
720dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************** Configuration ******************************************/
730dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
740dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifndef VERBOSE
750dc076565f772bb1953209fb69ea150b494aaa40robbiew#define VERBOSE 1
760dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif
770dc076565f772bb1953209fb69ea150b494aaa40robbiew
780dc076565f772bb1953209fb69ea150b494aaa40robbiew#define NTHREADS 30
790dc076565f772bb1953209fb69ea150b494aaa40robbiew
800dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
810dc076565f772bb1953209fb69ea150b494aaa40robbiew/***********************************    Test cases  *****************************************/
820dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/
830dc076565f772bb1953209fb69ea150b494aaa40robbiew
840dc076565f772bb1953209fb69ea150b494aaa40robbiewchar do_it = 1;
850dc076565f772bb1953209fb69ea150b494aaa40robbiewlong long iterations = 0;
860dc076565f772bb1953209fb69ea150b494aaa40robbiew
870dc076565f772bb1953209fb69ea150b494aaa40robbiew/* Handler for user request to terminate */
88e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Coopervoid sighdl(int sig)
890dc076565f772bb1953209fb69ea150b494aaa40robbiew{
900dc076565f772bb1953209fb69ea150b494aaa40robbiew	do
910dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
920dc076565f772bb1953209fb69ea150b494aaa40robbiew		do_it = 0;
930dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
94e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	while (do_it);
950dc076565f772bb1953209fb69ea150b494aaa40robbiew}
960dc076565f772bb1953209fb69ea150b494aaa40robbiew
970dc076565f772bb1953209fb69ea150b494aaa40robbiewtypedef struct _tdata
980dc076565f772bb1953209fb69ea150b494aaa40robbiew{
990dc076565f772bb1953209fb69ea150b494aaa40robbiew	int policy;
1000dc076565f772bb1953209fb69ea150b494aaa40robbiew	int prio;
1010dc076565f772bb1953209fb69ea150b494aaa40robbiew	pthread_t thread;
1020dc076565f772bb1953209fb69ea150b494aaa40robbiew}
1030dc076565f772bb1953209fb69ea150b494aaa40robbiew
1040dc076565f772bb1953209fb69ea150b494aaa40robbiewtestdata_t;
1050dc076565f772bb1953209fb69ea150b494aaa40robbiew
1060dc076565f772bb1953209fb69ea150b494aaa40robbiewtestdata_t td[ 4 ];
1070dc076565f772bb1953209fb69ea150b494aaa40robbiew
1080dc076565f772bb1953209fb69ea150b494aaa40robbiew/* Thread function */
109e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Coopervoid * threaded(void * arg)
1100dc076565f772bb1953209fb69ea150b494aaa40robbiew{
1110dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret = 0;
1120dc076565f772bb1953209fb69ea150b494aaa40robbiew	int i = 0;
1130dc076565f772bb1953209fb69ea150b494aaa40robbiew	int pol;
1140dc076565f772bb1953209fb69ea150b494aaa40robbiew
1150dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sched_param sp;
1160dc076565f772bb1953209fb69ea150b494aaa40robbiew
117e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	while (do_it)
1180dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
119e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		for (i = 0; i < 4; i++)
1200dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
121e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			ret = pthread_getschedparam(td[ i ].thread, &pol, &sp);
1220dc076565f772bb1953209fb69ea150b494aaa40robbiew
123e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			if (ret != 0)
1240dc076565f772bb1953209fb69ea150b494aaa40robbiew			{
125e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper				UNRESOLVED(ret, "Failed to get sched param");
1260dc076565f772bb1953209fb69ea150b494aaa40robbiew			}
1270dc076565f772bb1953209fb69ea150b494aaa40robbiew
128e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			if (pol != td[ i ].policy)
1290dc076565f772bb1953209fb69ea150b494aaa40robbiew			{
130e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper				FAILED("Wrong scheduling policy read");
1310dc076565f772bb1953209fb69ea150b494aaa40robbiew			}
1320dc076565f772bb1953209fb69ea150b494aaa40robbiew
133e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			if (sp.sched_priority != td[ i ].prio)
1340dc076565f772bb1953209fb69ea150b494aaa40robbiew			{
135e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper				FAILED("Wrong scheduling priority read");
1360dc076565f772bb1953209fb69ea150b494aaa40robbiew			}
1370dc076565f772bb1953209fb69ea150b494aaa40robbiew
1380dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
1390dc076565f772bb1953209fb69ea150b494aaa40robbiew
1400dc076565f772bb1953209fb69ea150b494aaa40robbiew		/* We don't really care about concurrent access for this data */
1410dc076565f772bb1953209fb69ea150b494aaa40robbiew		iterations++;
1420dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1430dc076565f772bb1953209fb69ea150b494aaa40robbiew
1440dc076565f772bb1953209fb69ea150b494aaa40robbiew	return NULL;
1450dc076565f772bb1953209fb69ea150b494aaa40robbiew}
1460dc076565f772bb1953209fb69ea150b494aaa40robbiew
1470dc076565f772bb1953209fb69ea150b494aaa40robbiew/* alternative policy threads */
148e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Coopervoid * rt_thread(void * arg)
1490dc076565f772bb1953209fb69ea150b494aaa40robbiew{
1500dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret = 0;
1510dc076565f772bb1953209fb69ea150b494aaa40robbiew
1520dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* This thread does almost nothing but wait... */
153e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	ret = pthread_barrier_wait(arg);
1540dc076565f772bb1953209fb69ea150b494aaa40robbiew
155e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if ((ret != 0) && (ret != PTHREAD_BARRIER_SERIAL_THREAD) )
1560dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
157e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Failed to wait for barrier");
1580dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1590dc076565f772bb1953209fb69ea150b494aaa40robbiew
1600dc076565f772bb1953209fb69ea150b494aaa40robbiew	return NULL;
1610dc076565f772bb1953209fb69ea150b494aaa40robbiew}
1620dc076565f772bb1953209fb69ea150b494aaa40robbiew
1630dc076565f772bb1953209fb69ea150b494aaa40robbiew
1640dc076565f772bb1953209fb69ea150b494aaa40robbiew/* Main function */
165e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooperint main (int argc, char * argv[])
1660dc076565f772bb1953209fb69ea150b494aaa40robbiew{
1670dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret = 0, i;
1680dc076565f772bb1953209fb69ea150b494aaa40robbiew
1690dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sigaction sa;
1700dc076565f772bb1953209fb69ea150b494aaa40robbiew
1710dc076565f772bb1953209fb69ea150b494aaa40robbiew	pthread_barrier_t bar;
1720dc076565f772bb1953209fb69ea150b494aaa40robbiew
1730dc076565f772bb1953209fb69ea150b494aaa40robbiew	pthread_attr_t ta[ 4 ];
1740dc076565f772bb1953209fb69ea150b494aaa40robbiew
1750dc076565f772bb1953209fb69ea150b494aaa40robbiew	pthread_t th[ NTHREADS ];
1760dc076565f772bb1953209fb69ea150b494aaa40robbiew
1770dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sched_param sp;
1780dc076565f772bb1953209fb69ea150b494aaa40robbiew
1790dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Initialize output routine */
1800dc076565f772bb1953209fb69ea150b494aaa40robbiew	output_init();
1810dc076565f772bb1953209fb69ea150b494aaa40robbiew
1820dc076565f772bb1953209fb69ea150b494aaa40robbiew
1830dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Initialize barrier */
184e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	ret = pthread_barrier_init(&bar, NULL, 5);
1850dc076565f772bb1953209fb69ea150b494aaa40robbiew
186e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (ret != 0)
1870dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
188e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Failed to init barrier");
1890dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1900dc076565f772bb1953209fb69ea150b494aaa40robbiew
1910dc076565f772bb1953209fb69ea150b494aaa40robbiew
1920dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Register the signal handler for SIGUSR1 */
193e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	sigemptyset (&sa.sa_mask);
1940dc076565f772bb1953209fb69ea150b494aaa40robbiew
1950dc076565f772bb1953209fb69ea150b494aaa40robbiew	sa.sa_flags = 0;
1960dc076565f772bb1953209fb69ea150b494aaa40robbiew
1970dc076565f772bb1953209fb69ea150b494aaa40robbiew	sa.sa_handler = sighdl;
1980dc076565f772bb1953209fb69ea150b494aaa40robbiew
199e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if ((ret = sigaction (SIGUSR1, &sa, NULL) ))
2000dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
201e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Unable to register signal handler");
2020dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2030dc076565f772bb1953209fb69ea150b494aaa40robbiew
204e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if ((ret = sigaction (SIGALRM, &sa, NULL) ))
2050dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
206e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Unable to register signal handler");
2070dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2080dc076565f772bb1953209fb69ea150b494aaa40robbiew
2090dc076565f772bb1953209fb69ea150b494aaa40robbiew#if VERBOSE > 1
210e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	output("[parent] Signal handler registered\n");
2110dc076565f772bb1953209fb69ea150b494aaa40robbiew
2120dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif
2130dc076565f772bb1953209fb69ea150b494aaa40robbiew
2140dc076565f772bb1953209fb69ea150b494aaa40robbiew	td[ 0 ].policy = td[ 1 ].policy = SCHED_FIFO;
2150dc076565f772bb1953209fb69ea150b494aaa40robbiew
2160dc076565f772bb1953209fb69ea150b494aaa40robbiew	td[ 2 ].policy = td[ 3 ].policy = SCHED_RR;
2170dc076565f772bb1953209fb69ea150b494aaa40robbiew
218e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	td[ 0 ].prio = sched_get_priority_min(SCHED_FIFO);
2190dc076565f772bb1953209fb69ea150b494aaa40robbiew
220e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (td[ 0 ].prio == -1)
2210dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
222e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(errno, "Failed to get scheduler range value");
2230dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2240dc076565f772bb1953209fb69ea150b494aaa40robbiew
225e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	td[ 1 ].prio = sched_get_priority_max(SCHED_FIFO);
2260dc076565f772bb1953209fb69ea150b494aaa40robbiew
227e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (td[ 1 ].prio == -1)
2280dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
229e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(errno, "Failed to get scheduler range value");
2300dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2310dc076565f772bb1953209fb69ea150b494aaa40robbiew
232e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	td[ 2 ].prio = sched_get_priority_min(SCHED_RR);
2330dc076565f772bb1953209fb69ea150b494aaa40robbiew
234e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (td[ 2 ].prio == -1)
2350dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
236e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(errno, "Failed to get scheduler range value");
2370dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2380dc076565f772bb1953209fb69ea150b494aaa40robbiew
239e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	td[ 3 ].prio = sched_get_priority_max(SCHED_RR);
2400dc076565f772bb1953209fb69ea150b494aaa40robbiew
241e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (td[ 3 ].prio == -1)
2420dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
243e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(errno, "Failed to get scheduler range value");
2440dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2450dc076565f772bb1953209fb69ea150b494aaa40robbiew
2460dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Initialize the threads attributes and create the RT threads */
247e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	for (i = 0; i < 4; i++)
2480dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
249e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_attr_init(&ta[ i ]);
2500dc076565f772bb1953209fb69ea150b494aaa40robbiew
251e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2520dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
253e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "Failed to initialize thread attribute");
2540dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2550dc076565f772bb1953209fb69ea150b494aaa40robbiew
256e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_attr_setinheritsched(&ta[ i ], PTHREAD_EXPLICIT_SCHED);
2570dc076565f772bb1953209fb69ea150b494aaa40robbiew
258e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2590dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
260e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "Failed to set explicit scheduling attribute");
2610dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2620dc076565f772bb1953209fb69ea150b494aaa40robbiew
2630dc076565f772bb1953209fb69ea150b494aaa40robbiew		sp.sched_priority = td[ i ].prio;
2640dc076565f772bb1953209fb69ea150b494aaa40robbiew
265e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_attr_setschedparam(&ta[ i ], &sp);
2660dc076565f772bb1953209fb69ea150b494aaa40robbiew
267e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2680dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
269e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "failed to set thread attribute sched param");
2700dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2710dc076565f772bb1953209fb69ea150b494aaa40robbiew
272e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_attr_setschedpolicy(&ta[ i ], td[ i ].policy);
2730dc076565f772bb1953209fb69ea150b494aaa40robbiew
274e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2750dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
276e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "failed to set thread attribute sched prio");
2770dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2780dc076565f772bb1953209fb69ea150b494aaa40robbiew
279e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_create(&td[ i ].thread, &ta[ i ], rt_thread, &bar);
2800dc076565f772bb1953209fb69ea150b494aaa40robbiew
281e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2820dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
283e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "Failed to create a RT thread -- need more privilege?");
2840dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2850dc076565f772bb1953209fb69ea150b494aaa40robbiew
2860dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2870dc076565f772bb1953209fb69ea150b494aaa40robbiew
2880dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Create the worker threads */
289e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	for (i = 0; i < NTHREADS; i++)
2900dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
291e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_create(&th[ i ], NULL, threaded, NULL);
2920dc076565f772bb1953209fb69ea150b494aaa40robbiew
293e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
2940dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
295e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "failed to create a worker thread");
2960dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
2970dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
2980dc076565f772bb1953209fb69ea150b494aaa40robbiew
2990dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Wait for the worker threads to finish */
300e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	for (i = 0; i < NTHREADS; i++)
3010dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
302e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_join(th[ i ], NULL);
3030dc076565f772bb1953209fb69ea150b494aaa40robbiew
304e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
3050dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
306e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "failed to join a worker thread");
3070dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
3080dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
3090dc076565f772bb1953209fb69ea150b494aaa40robbiew
3100dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Join the barrier to terminate the RT threads */
311e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	ret = pthread_barrier_wait(&bar);
3120dc076565f772bb1953209fb69ea150b494aaa40robbiew
313e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if ((ret != 0) && (ret != PTHREAD_BARRIER_SERIAL_THREAD) )
3140dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
315e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Failed to wait for the barrier");
3160dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
3170dc076565f772bb1953209fb69ea150b494aaa40robbiew
3180dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Join the RT threads */
319e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	for (i = 0; i < 4; i++)
3200dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
321e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		ret = pthread_join(td[ i ].thread, NULL);
3220dc076565f772bb1953209fb69ea150b494aaa40robbiew
323e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		if (ret != 0)
3240dc076565f772bb1953209fb69ea150b494aaa40robbiew		{
325e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper			UNRESOLVED(ret, "Failed to join a thread");
3260dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
3270dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
3280dc076565f772bb1953209fb69ea150b494aaa40robbiew
3290dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Done! */
330e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	output("pthread_getschedparam stress test PASSED -- %llu iterations\n", iterations);
3310dc076565f772bb1953209fb69ea150b494aaa40robbiew
332e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	ret = pthread_barrier_destroy(&bar);
3330dc076565f772bb1953209fb69ea150b494aaa40robbiew
334e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	if (ret != 0)
3350dc076565f772bb1953209fb69ea150b494aaa40robbiew	{
336e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper		UNRESOLVED(ret, "Failed to destroy the barrier");
3370dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
3380dc076565f772bb1953209fb69ea150b494aaa40robbiew
3390dc076565f772bb1953209fb69ea150b494aaa40robbiew	PASSED;
3400dc076565f772bb1953209fb69ea150b494aaa40robbiew}
3410dc076565f772bb1953209fb69ea150b494aaa40robbiew
3420dc076565f772bb1953209fb69ea150b494aaa40robbiew
343