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