10dc076565f772bb1953209fb69ea150b494aaa40robbiew/* 20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2004, 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 14fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc., 15fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 160dc076565f772bb1953209fb69ea150b494aaa40robbiew 170dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is a stress test for the function pthread_cond_timedwait. 180dc076565f772bb1953209fb69ea150b494aaa40robbiew * 190dc076565f772bb1953209fb69ea150b494aaa40robbiew * It aims to check the following assertion: 202c28215423293e443469a07ae7011135d058b671Garrett Cooper * When a cancel request unblocks the thread, 210dc076565f772bb1953209fb69ea150b494aaa40robbiew * it must not consume any pending condition signal request. 222c28215423293e443469a07ae7011135d058b671Garrett Cooper 230dc076565f772bb1953209fb69ea150b494aaa40robbiew * The steps are: 240dc076565f772bb1953209fb69ea150b494aaa40robbiew * -> Create a bunch of threads waiting on a condvar. 250dc076565f772bb1953209fb69ea150b494aaa40robbiew * -> At the same time (using a barrier) one thread is canceled and the condition is signaled. 260dc076565f772bb1953209fb69ea150b494aaa40robbiew * -> Test checks that the cond signaling was not lost (at least one thread must have woken cleanly). 270dc076565f772bb1953209fb69ea150b494aaa40robbiew * -> Then everything is cleaned up and started again. 282c28215423293e443469a07ae7011135d058b671Garrett Cooper 290dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 302c28215423293e443469a07ae7011135d058b671Garrett Cooper 310dc076565f772bb1953209fb69ea150b494aaa40robbiew /* We are testing conformance to IEEE Std 1003.1, 2003 Edition */ 32354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define _POSIX_C_SOURCE 200112L 332c28215423293e443469a07ae7011135d058b671Garrett Cooper 340dc076565f772bb1953209fb69ea150b494aaa40robbiew /* We need the XSI extention for the mutex attributes */ 350dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifndef WITHOUT_XOPEN 36354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define _XOPEN_SOURCE 600 370dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 380dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 390dc076565f772bb1953209fb69ea150b494aaa40robbiew/****************************** standard includes *****************************************/ 400dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 41354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <pthread.h> 42354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <stdarg.h> 43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <stdio.h> 44354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <stdlib.h> 45354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <unistd.h> 460dc076565f772bb1953209fb69ea150b494aaa40robbiew 47354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <errno.h> 48354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <signal.h> 49354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <string.h> 50354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <time.h> 512c28215423293e443469a07ae7011135d058b671Garrett Cooper 520dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 530dc076565f772bb1953209fb69ea150b494aaa40robbiew/****************************** Test framework *****************************************/ 540dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include "testfrmw.h" 56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include "testfrmw.c" 570dc076565f772bb1953209fb69ea150b494aaa40robbiew /* This header is responsible for defining the following macros: 582c28215423293e443469a07ae7011135d058b671Garrett Cooper * UNRESOLVED(ret, descr); 590dc076565f772bb1953209fb69ea150b494aaa40robbiew * where descr is a description of the error and ret is an int (error code for example) 600dc076565f772bb1953209fb69ea150b494aaa40robbiew * FAILED(descr); 610dc076565f772bb1953209fb69ea150b494aaa40robbiew * where descr is a short text saying why the test has failed. 620dc076565f772bb1953209fb69ea150b494aaa40robbiew * PASSED(); 630dc076565f772bb1953209fb69ea150b494aaa40robbiew * No parameter. 642c28215423293e443469a07ae7011135d058b671Garrett Cooper * 650dc076565f772bb1953209fb69ea150b494aaa40robbiew * Both three macros shall terminate the calling process. 660dc076565f772bb1953209fb69ea150b494aaa40robbiew * The testcase shall not terminate in any other maneer. 672c28215423293e443469a07ae7011135d058b671Garrett Cooper * 680dc076565f772bb1953209fb69ea150b494aaa40robbiew * The other file defines the functions 690dc076565f772bb1953209fb69ea150b494aaa40robbiew * void output_init() 700dc076565f772bb1953209fb69ea150b494aaa40robbiew * void output(char * string, ...) 712c28215423293e443469a07ae7011135d058b671Garrett Cooper * 720dc076565f772bb1953209fb69ea150b494aaa40robbiew * Those may be used to output information. 730dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 740dc076565f772bb1953209fb69ea150b494aaa40robbiew 750dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 760dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************** Configuration ******************************************/ 770dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 780dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifndef SCALABILITY_FACTOR 790dc076565f772bb1953209fb69ea150b494aaa40robbiew#define SCALABILITY_FACTOR 1 800dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 810dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifndef VERBOSE 820dc076565f772bb1953209fb69ea150b494aaa40robbiew#define VERBOSE 1 830dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 840dc076565f772bb1953209fb69ea150b494aaa40robbiew 850dc076565f772bb1953209fb69ea150b494aaa40robbiew/* Size of the "bunch" of threads -- the real number will be 2 more threads per scenarii */ 860dc076565f772bb1953209fb69ea150b494aaa40robbiew#define NCHILDREN (20) 870dc076565f772bb1953209fb69ea150b494aaa40robbiew 880dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TIMEOUT (60) 890dc076565f772bb1953209fb69ea150b494aaa40robbiew 900dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifndef WITHOUT_ALTCLK 91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define USE_ALTCLK /* make tests with MONOTONIC CLOCK if supported */ 920dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 930dc076565f772bb1953209fb69ea150b494aaa40robbiew 940dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 950dc076565f772bb1953209fb69ea150b494aaa40robbiew/*********************************** Test case *****************************************/ 960dc076565f772bb1953209fb69ea150b494aaa40robbiew/********************************************************************************************/ 970dc076565f772bb1953209fb69ea150b494aaa40robbiew 980dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifdef WITHOUT_XOPEN 990dc076565f772bb1953209fb69ea150b494aaa40robbiew/* We define those to avoid compilation errors, but they won't be used */ 1000dc076565f772bb1953209fb69ea150b494aaa40robbiew#define PTHREAD_MUTEX_DEFAULT 0 1010dc076565f772bb1953209fb69ea150b494aaa40robbiew#define PTHREAD_MUTEX_NORMAL 0 1020dc076565f772bb1953209fb69ea150b494aaa40robbiew#define PTHREAD_MUTEX_ERRORCHECK 0 1030dc076565f772bb1953209fb69ea150b494aaa40robbiew#define PTHREAD_MUTEX_RECURSIVE 0 1040dc076565f772bb1953209fb69ea150b494aaa40robbiew 1050dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 1060dc076565f772bb1953209fb69ea150b494aaa40robbiew 107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct _scenar { 108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int m_type; /* Mutex type to use */ 109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int mc_pshared; /* 0: mutex and cond are process-private (default) ~ !0: Both are process-shared, if supported */ 110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int c_clock; /* 0: cond uses the default clock. ~ !0: Cond uses monotonic clock, if supported. */ 111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int fork; /* 0: Test between threads. ~ !0: Test across processes, if supported (mmap) */ 112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *descr; /* Case description */ 113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} scenarii[] = { 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao { 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 0, 0, 0, "Default mutex"} 116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 0, 0, 0, "Normal mutex"} 118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 0, 0, 0, "Errorcheck mutex"} 120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 0, 0, 0, "Recursive mutex"} 122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 1, 0, 0, "PShared default mutex"} 125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 1, 0, 0, "Pshared normal mutex"} 127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 1, 0, 0, "Pshared errorcheck mutex"} 129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 1, 0, 0, "Pshared recursive mutex"} 131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 1, 0, 1, 134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared default mutex across processes"} 135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 1, 0, 1, 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared normal mutex across processes"} 138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 1, 0, 1, 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared errorcheck mutex across processes"} 141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 1, 0, 1, 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared recursive mutex across processes"} 1440dc076565f772bb1953209fb69ea150b494aaa40robbiew 1450dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifdef USE_ALTCLK 146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 1, 1, 1, 148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared default mutex and alt clock condvar across processes"} 149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 1, 1, 1, 151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared normal mutex and alt clock condvar across processes"} 152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 1, 1, 1, 154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared errorcheck mutex and alt clock condvar across processes"} 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 1, 1, 1, 157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared recursive mutex and alt clock condvar across processes"} 158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 0, 1, 0, 161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Default mutex and alt clock condvar"} 162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 0, 1, 0, 164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Normal mutex and alt clock condvar"} 165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 0, 1, 0, 167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Errorcheck mutex and alt clock condvar"} 168354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 0, 1, 0, 170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Recursive mutex and alt clock condvar"} 171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_DEFAULT, 1, 1, 0, 174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "PShared default mutex and alt clock condvar"} 175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_NORMAL, 1, 1, 0, 177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared normal mutex and alt clock condvar"} 178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_ERRORCHECK, 1, 1, 0, 180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared errorcheck mutex and alt clock condvar"} 181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao , { 182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_MUTEX_RECURSIVE, 1, 1, 0, 183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Pshared recursive mutex and alt clock condvar"} 1840dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 1850dc076565f772bb1953209fb69ea150b494aaa40robbiew}; 186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 1870dc076565f772bb1953209fb69ea150b494aaa40robbiew#define NSCENAR (sizeof(scenarii)/sizeof(scenarii[0])) 1880dc076565f772bb1953209fb69ea150b494aaa40robbiew 1890dc076565f772bb1953209fb69ea150b494aaa40robbiew/* This is the shared structure for all threads related to the same condvar */ 190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct celldata { 1910dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_t workers[NCHILDREN * SCALABILITY_FACTOR + 2]; 1920dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_t signaler; 1930dc076565f772bb1953209fb69ea150b494aaa40robbiew 1940dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_barrier_t bar; 1950dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_mutex_t mtx; 1960dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_cond_t cnd; 1970dc076565f772bb1953209fb69ea150b494aaa40robbiew clockid_t cid; 1980dc076565f772bb1953209fb69ea150b494aaa40robbiew 1990dc076565f772bb1953209fb69ea150b494aaa40robbiew int boolean; 2000dc076565f772bb1953209fb69ea150b494aaa40robbiew int count; 2012c28215423293e443469a07ae7011135d058b671Garrett Cooper 2020dc076565f772bb1953209fb69ea150b494aaa40robbiew long canceled; 2030dc076565f772bb1953209fb69ea150b494aaa40robbiew long cancelfailed; 2040dc076565f772bb1953209fb69ea150b494aaa40robbiew long cnttotal; 2050dc076565f772bb1953209fb69ea150b494aaa40robbiew} cells[NSCENAR * SCALABILITY_FACTOR]; 2060dc076565f772bb1953209fb69ea150b494aaa40robbiew 207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar do_it = 1; 2080dc076565f772bb1953209fb69ea150b494aaa40robbiewpthread_attr_t ta; 2090dc076565f772bb1953209fb69ea150b494aaa40robbiew 210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid cleanup(void *arg) 2110dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 2120dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret; 213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct celldata *cd = (struct celldata *)arg; 2142c28215423293e443469a07ae7011135d058b671Garrett Cooper 2150dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Unlock the mutex */ 2160dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_unlock(&(cd->mtx)); 217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to unlock mutex in cancel handler"); 219354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2202c28215423293e443469a07ae7011135d058b671Garrett Cooper 2210dc076565f772bb1953209fb69ea150b494aaa40robbiew} 2220dc076565f772bb1953209fb69ea150b494aaa40robbiew 223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *worker(void *arg) 2240dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 2250dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret; 226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct celldata *cd = (struct celldata *)arg; 2270dc076565f772bb1953209fb69ea150b494aaa40robbiew struct timespec ts; 2282c28215423293e443469a07ae7011135d058b671Garrett Cooper 2290dc076565f772bb1953209fb69ea150b494aaa40robbiew /* lock the mutex */ 2300dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_lock(&(cd->mtx)); 231354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 232354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Unable to lock mutex in worker"); 233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2342c28215423293e443469a07ae7011135d058b671Garrett Cooper 2350dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Tell the cellmaster we are ready (count++) */ 2360dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->count += 1; 2372c28215423293e443469a07ae7011135d058b671Garrett Cooper 2380dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Timeout = now + TIMEOUT */ 2390dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = clock_gettime(cd->cid, &ts); 240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(errno, "Gettime failed"); 242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2430dc076565f772bb1953209fb69ea150b494aaa40robbiew ts.tv_sec += TIMEOUT * SCALABILITY_FACTOR; 2442c28215423293e443469a07ae7011135d058b671Garrett Cooper 2450dc076565f772bb1953209fb69ea150b494aaa40robbiew /* register cleanup handler */ 2460dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_cleanup_push(cleanup, arg); 2472c28215423293e443469a07ae7011135d058b671Garrett Cooper 248354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao do { 249354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* cond timedwait (while boolean == false) */ 2500dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_cond_timedwait(&(cd->cnd), &(cd->mtx), &ts); 2512c28215423293e443469a07ae7011135d058b671Garrett Cooper 2520dc076565f772bb1953209fb69ea150b494aaa40robbiew /* if timeout => failed (lost signal) */ 253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret == ETIMEDOUT) { 254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao FAILED 255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("Timeout occured. A condition signal was probably lost."); 2560dc076565f772bb1953209fb69ea150b494aaa40robbiew } 2572c28215423293e443469a07ae7011135d058b671Garrett Cooper 258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Cond timedwait failed"); 260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2612c28215423293e443469a07ae7011135d058b671Garrett Cooper 2620dc076565f772bb1953209fb69ea150b494aaa40robbiew } while (cd->boolean == 0); 2632c28215423293e443469a07ae7011135d058b671Garrett Cooper 2640dc076565f772bb1953209fb69ea150b494aaa40robbiew /* broadcast the condition */ 2650dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_cond_broadcast(&(cd->cnd)); 266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Broadcasting the condition failed"); 268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2692c28215423293e443469a07ae7011135d058b671Garrett Cooper 2700dc076565f772bb1953209fb69ea150b494aaa40robbiew /* unregister the cleanup */ 2710dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_cleanup_pop(0); 2722c28215423293e443469a07ae7011135d058b671Garrett Cooper 2730dc076565f772bb1953209fb69ea150b494aaa40robbiew /* unlock the mutex */ 2740dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_unlock(&(cd->mtx)); 275354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 276354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Unable to unlock the mutex"); 277354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2782c28215423293e443469a07ae7011135d058b671Garrett Cooper 2790dc076565f772bb1953209fb69ea150b494aaa40robbiew return NULL; 2800dc076565f772bb1953209fb69ea150b494aaa40robbiew} 2810dc076565f772bb1953209fb69ea150b494aaa40robbiew 282354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *signaler(void *arg) 2830dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 2840dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret; 285354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct celldata *cd = (struct celldata *)arg; 2862c28215423293e443469a07ae7011135d058b671Garrett Cooper 2870dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Lock the mutex if required */ 288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (cd->boolean == -1) { 2890dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_lock(&(cd->mtx)); 290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 291354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "mutex lock failed in signaler"); 292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 2930dc076565f772bb1953209fb69ea150b494aaa40robbiew } 2942c28215423293e443469a07ae7011135d058b671Garrett Cooper 2950dc076565f772bb1953209fb69ea150b494aaa40robbiew /* wait the barrier */ 2960dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_barrier_wait(&(cd->bar)); 297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((ret != 0) && (ret != PTHREAD_BARRIER_SERIAL_THREAD)) { 298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Barrier wait failed"); 299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3002c28215423293e443469a07ae7011135d058b671Garrett Cooper 3010dc076565f772bb1953209fb69ea150b494aaa40robbiew /* signal the cond */ 3020dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_cond_signal(&(cd->cnd)); 303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Signaling the cond failed"); 305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3062c28215423293e443469a07ae7011135d058b671Garrett Cooper 3070dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Unlock the mutex if required */ 308354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (cd->boolean == -1) { 3090dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_unlock(&(cd->mtx)); 310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "mutex unlock failed in signaler"); 312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3130dc076565f772bb1953209fb69ea150b494aaa40robbiew } 3142c28215423293e443469a07ae7011135d058b671Garrett Cooper 3150dc076565f772bb1953209fb69ea150b494aaa40robbiew return NULL; 3160dc076565f772bb1953209fb69ea150b494aaa40robbiew} 3170dc076565f772bb1953209fb69ea150b494aaa40robbiew 318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *cellmanager(void *arg) 3190dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 3200dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret, i; 321354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao struct celldata *cd = (struct celldata *)arg; 3220dc076565f772bb1953209fb69ea150b494aaa40robbiew struct timespec ts; 3230dc076565f772bb1953209fb69ea150b494aaa40robbiew int randval; 324354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao void *w_ret; 3252c28215423293e443469a07ae7011135d058b671Garrett Cooper 3260dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->canceled = 0; 3270dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->cancelfailed = 0; 3280dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->cnttotal = 0; 3292c28215423293e443469a07ae7011135d058b671Garrett Cooper 3300dc076565f772bb1953209fb69ea150b494aaa40robbiew /* while do_it */ 331354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while (do_it) { 3320dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Initialize some stuff */ 3330dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->boolean = 0; 3340dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->count = 0; 3350dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->cnttotal += 1; 3362c28215423293e443469a07ae7011135d058b671Garrett Cooper 3370dc076565f772bb1953209fb69ea150b494aaa40robbiew /* create the workers */ 338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NCHILDREN * SCALABILITY_FACTOR + 2; i++) { 339354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_create(&(cd->workers[i]), &ta, worker, arg); 341354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 342354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 343354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Unable to create enough threads"); 344354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3450dc076565f772bb1953209fb69ea150b494aaa40robbiew } 3462c28215423293e443469a07ae7011135d058b671Garrett Cooper 3470dc076565f772bb1953209fb69ea150b494aaa40robbiew /* choose a (pseudo) random thread to cancel */ 3480dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = clock_gettime(cd->cid, &ts); 349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 350354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(errno, "Failed to read clock"); 351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao randval = 353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (ts.tv_sec + 354354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (ts.tv_nsec >> 10)) % (NCHILDREN * SCALABILITY_FACTOR + 2); 3552c28215423293e443469a07ae7011135d058b671Garrett Cooper 3560dc076565f772bb1953209fb69ea150b494aaa40robbiew /* wait for the workers to be ready */ 357354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao do { 3580dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_lock(&(cd->mtx)); 359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Mutex lock failed"); 361354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3622c28215423293e443469a07ae7011135d058b671Garrett Cooper 3630dc076565f772bb1953209fb69ea150b494aaa40robbiew i = cd->count; 3642c28215423293e443469a07ae7011135d058b671Garrett Cooper 3650dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutex_unlock(&(cd->mtx)); 366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Mutex unlock failed"); 368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3690dc076565f772bb1953209fb69ea150b494aaa40robbiew } while (i < NCHILDREN * SCALABILITY_FACTOR + 2); 3702c28215423293e443469a07ae7011135d058b671Garrett Cooper 371e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper /* Set the boolean (1 => no lock in signaler; -1 => lock) */ 372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao cd->boolean = (ts.tv_sec & 1) ? -1 : 1; 3732c28215423293e443469a07ae7011135d058b671Garrett Cooper 3740dc076565f772bb1953209fb69ea150b494aaa40robbiew /* create the signaler */ 3750dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_create(&(cd->signaler), &ta, signaler, arg); 376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to create signaler thread"); 378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3792c28215423293e443469a07ae7011135d058b671Garrett Cooper 3800dc076565f772bb1953209fb69ea150b494aaa40robbiew /* wait the barrier */ 3810dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_barrier_wait(&(cd->bar)); 382354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((ret != 0) && (ret != PTHREAD_BARRIER_SERIAL_THREAD)) { 383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to wait for the barrier"); 384354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 3852c28215423293e443469a07ae7011135d058b671Garrett Cooper 3860dc076565f772bb1953209fb69ea150b494aaa40robbiew /* cancel the chosen thread */ 3870dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_cancel(cd->workers[randval]); 3880dc076565f772bb1953209fb69ea150b494aaa40robbiew 389354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* it is possible the thread is already terminated -- so we don't stop on error */ 390354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 391354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 2 3920dc076565f772bb1953209fb69ea150b494aaa40robbiew output("%d\n", randval); 393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 394354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao cd->cancelfailed += 1; 3950dc076565f772bb1953209fb69ea150b494aaa40robbiew } 3962c28215423293e443469a07ae7011135d058b671Garrett Cooper 3970dc076565f772bb1953209fb69ea150b494aaa40robbiew /* join every threads */ 3980dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_join(cd->signaler, NULL); 399354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 400354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to join the signaler thread"); 401354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4022c28215423293e443469a07ae7011135d058b671Garrett Cooper 403354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NCHILDREN * SCALABILITY_FACTOR + 2; i++) { 4040dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_join(cd->workers[i], &w_ret); 405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 406354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Unable to join a worker"); 407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4080dc076565f772bb1953209fb69ea150b494aaa40robbiew if (w_ret == PTHREAD_CANCELED) 4090dc076565f772bb1953209fb69ea150b494aaa40robbiew cd->canceled += 1; 4100dc076565f772bb1953209fb69ea150b494aaa40robbiew } 4110dc076565f772bb1953209fb69ea150b494aaa40robbiew } 4122c28215423293e443469a07ae7011135d058b671Garrett Cooper 4130dc076565f772bb1953209fb69ea150b494aaa40robbiew return NULL; 4140dc076565f772bb1953209fb69ea150b494aaa40robbiew} 4150dc076565f772bb1953209fb69ea150b494aaa40robbiew 4160dc076565f772bb1953209fb69ea150b494aaa40robbiewvoid sighdl(int sig) 4170dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 4180dc076565f772bb1953209fb69ea150b494aaa40robbiew /* do_it = 0 */ 419354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao do { 420354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao do_it = 0; 421354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4220dc076565f772bb1953209fb69ea150b494aaa40robbiew while (do_it); 4230dc076565f772bb1953209fb69ea150b494aaa40robbiew} 4240dc076565f772bb1953209fb69ea150b494aaa40robbiew 425354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char *argv[]) 4260dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 4270dc076565f772bb1953209fb69ea150b494aaa40robbiew int ret, i, j; 4280dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigaction sa; 4290dc076565f772bb1953209fb69ea150b494aaa40robbiew 4300dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_mutexattr_t ma; 4310dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_condattr_t ca; 4320dc076565f772bb1953209fb69ea150b494aaa40robbiew clockid_t cid = CLOCK_REALTIME; 4330dc076565f772bb1953209fb69ea150b494aaa40robbiew long canceled = 0; 4340dc076565f772bb1953209fb69ea150b494aaa40robbiew long cancelfailed = 0; 4350dc076565f772bb1953209fb69ea150b494aaa40robbiew long cnttotal = 0; 4362c28215423293e443469a07ae7011135d058b671Garrett Cooper 4370dc076565f772bb1953209fb69ea150b494aaa40robbiew long pshared, monotonic, cs; 4382c28215423293e443469a07ae7011135d058b671Garrett Cooper 4390dc076565f772bb1953209fb69ea150b494aaa40robbiew pthread_t mngrs[NSCENAR * SCALABILITY_FACTOR]; 4400dc076565f772bb1953209fb69ea150b494aaa40robbiew 4410dc076565f772bb1953209fb69ea150b494aaa40robbiew output_init(); 4422c28215423293e443469a07ae7011135d058b671Garrett Cooper 4430dc076565f772bb1953209fb69ea150b494aaa40robbiew /* check the system abilities */ 4440dc076565f772bb1953209fb69ea150b494aaa40robbiew pshared = sysconf(_SC_THREAD_PROCESS_SHARED); 4450dc076565f772bb1953209fb69ea150b494aaa40robbiew cs = sysconf(_SC_CLOCK_SELECTION); 4460dc076565f772bb1953209fb69ea150b494aaa40robbiew monotonic = sysconf(_SC_MONOTONIC_CLOCK); 4472c28215423293e443469a07ae7011135d058b671Garrett Cooper 448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 0 4490dc076565f772bb1953209fb69ea150b494aaa40robbiew output("Test starting\n"); 4500dc076565f772bb1953209fb69ea150b494aaa40robbiew output("System abilities:\n"); 4510dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" TPS : %li\n", pshared); 4520dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" CS : %li\n", cs); 4530dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" MON : %li\n", monotonic); 4540dc076565f772bb1953209fb69ea150b494aaa40robbiew if ((cs < 0) || (monotonic < 0)) 4550dc076565f772bb1953209fb69ea150b494aaa40robbiew output("Alternative clock won't be tested\n"); 456354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 4572c28215423293e443469a07ae7011135d058b671Garrett Cooper 4580dc076565f772bb1953209fb69ea150b494aaa40robbiew if (monotonic < 0) 4590dc076565f772bb1953209fb69ea150b494aaa40robbiew cs = -1; 4602c28215423293e443469a07ae7011135d058b671Garrett Cooper 461354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef USE_ALTCLK 4620dc076565f772bb1953209fb69ea150b494aaa40robbiew if (cs > 0) 463354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao output 464354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("Implementation supports the MONOTONIC CLOCK but option is disabled in test.\n"); 465354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 4660dc076565f772bb1953209fb69ea150b494aaa40robbiew 4670dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Initialize the celldatas according to scenarii */ 468354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NSCENAR; i++) { 469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 470354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao output("[parent] Preparing attributes for: %s\n", 471354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao scenarii[i].descr); 472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef WITHOUT_XOPEN 4730dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Mutex attributes DISABLED -> not used\n"); 474354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 475354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 4760dc076565f772bb1953209fb69ea150b494aaa40robbiew 4770dc076565f772bb1953209fb69ea150b494aaa40robbiew /* set / reset everything */ 4780dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutexattr_init(&ma); 479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 480354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 481354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Unable to initialize the mutex attribute object"); 482354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4830dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_condattr_init(&ca); 484354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 485354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 486354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Unable to initialize the cond attribute object"); 487354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef WITHOUT_XOPEN 4890dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Set the mutex type */ 4900dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutexattr_settype(&ma, scenarii[i].m_type); 491354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 492354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "[parent] Unable to set mutex type"); 493354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 494354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 4950dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Mutex type : %i\n", scenarii[i].m_type); 496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 497354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 4982c28215423293e443469a07ae7011135d058b671Garrett Cooper 4990dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Set the pshared attributes, if supported */ 500354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((pshared > 0) && (scenarii[i].mc_pshared != 0)) { 501354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 502354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_mutexattr_setpshared(&ma, 503354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_PROCESS_SHARED); 504354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 505354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Unable to set the mutex process-shared"); 507354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 508354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 509354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_condattr_setpshared(&ca, 510354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PTHREAD_PROCESS_SHARED); 511354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 512354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 513354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Unable to set the cond var process-shared"); 514354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 515354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 5160dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Mutex & cond are process-shared\n"); 517354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5180dc076565f772bb1953209fb69ea150b494aaa40robbiew } 519354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 5200dc076565f772bb1953209fb69ea150b494aaa40robbiew else { 5210dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Mutex & cond are process-private\n"); 5220dc076565f772bb1953209fb69ea150b494aaa40robbiew } 523354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5242c28215423293e443469a07ae7011135d058b671Garrett Cooper 5250dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Set the alternative clock, if supported */ 526354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef USE_ALTCLK 527354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((cs > 0) && (scenarii[i].c_clock != 0)) { 5280dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_condattr_setclock(&ca, CLOCK_MONOTONIC); 529354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 530354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 531354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Unable to set the monotonic clock for the cond"); 532354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 533354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 5340dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Cond uses the Monotonic clock\n"); 535354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5360dc076565f772bb1953209fb69ea150b494aaa40robbiew } 537354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 5380dc076565f772bb1953209fb69ea150b494aaa40robbiew else { 5390dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Cond uses the default clock\n"); 5400dc076565f772bb1953209fb69ea150b494aaa40robbiew } 541354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5420dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_condattr_getclock(&ca, &cid); 543354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 544354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Unable to get clock from cond attr"); 545354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 546354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5472c28215423293e443469a07ae7011135d058b671Garrett Cooper 5480dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Initialize all the mutex and condvars which uses those attributes */ 549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (j = 0; j < SCALABILITY_FACTOR; j++) { 5500dc076565f772bb1953209fb69ea150b494aaa40robbiew cells[i + j * NSCENAR].cid = cid; 5512c28215423293e443469a07ae7011135d058b671Garrett Cooper 5520dc076565f772bb1953209fb69ea150b494aaa40robbiew /* initialize the condvar */ 553354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 554354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_cond_init(&(cells[i + j * NSCENAR].cnd), 555354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao &ca); 556354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 557354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Cond init failed"); 558354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5592c28215423293e443469a07ae7011135d058b671Garrett Cooper 5600dc076565f772bb1953209fb69ea150b494aaa40robbiew /* initialize the mutex */ 561354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 562354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_mutex_init(&(cells[i + j * NSCENAR].mtx), 563354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao &ma); 564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Mutex init failed"); 566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5672c28215423293e443469a07ae7011135d058b671Garrett Cooper 5680dc076565f772bb1953209fb69ea150b494aaa40robbiew /* initialize the barrier */ 569354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ret = 570354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pthread_barrier_init(&(cells[i + j * NSCENAR].bar), 571354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao NULL, 2); 572354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 573354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to init barrier"); 574354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5750dc076565f772bb1953209fb69ea150b494aaa40robbiew } 5762c28215423293e443469a07ae7011135d058b671Garrett Cooper 5770dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_condattr_destroy(&ca); 578354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 579354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 580354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Failed to destroy the cond var attribute object"); 581354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5822c28215423293e443469a07ae7011135d058b671Garrett Cooper 5830dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_mutexattr_destroy(&ma); 584354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 585354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 586354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "Failed to destroy the mutex attribute object"); 587354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5880dc076565f772bb1953209fb69ea150b494aaa40robbiew } 589354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 5900dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] All condvars & mutex are ready\n"); 591354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 5922c28215423293e443469a07ae7011135d058b671Garrett Cooper 5930dc076565f772bb1953209fb69ea150b494aaa40robbiew /* register the signal handler */ 594354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigemptyset(&sa.sa_mask); 5950dc076565f772bb1953209fb69ea150b494aaa40robbiew sa.sa_flags = 0; 5960dc076565f772bb1953209fb69ea150b494aaa40robbiew sa.sa_handler = sighdl; 597354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((ret = sigaction(SIGUSR1, &sa, NULL))) { 598354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Unable to register signal handler"); 599354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 600354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 6010dc076565f772bb1953209fb69ea150b494aaa40robbiew output("[parent] Signal handler registered\n"); 602354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 6032c28215423293e443469a07ae7011135d058b671Garrett Cooper 6040dc076565f772bb1953209fb69ea150b494aaa40robbiew /* Initialize the thread attribute object */ 6050dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_attr_init(&ta); 606354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 607354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, 608354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "[parent] Failed to initialize a thread attribute object"); 609354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6100dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_attr_setstacksize(&ta, sysconf(_SC_THREAD_STACK_MIN)); 611354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 612354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "[parent] Failed to set thread stack size"); 613354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6142c28215423293e443469a07ae7011135d058b671Garrett Cooper 6150dc076565f772bb1953209fb69ea150b494aaa40robbiew /* create the NSCENAR * SCALABILITY_FACTOR manager threads */ 616354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NSCENAR * SCALABILITY_FACTOR; i++) { 617e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper ret = pthread_create(&mngrs[i], &ta, cellmanager, &(cells[i])); 6180dc076565f772bb1953209fb69ea150b494aaa40robbiew /* In case of failure we can exit; the child process will die after a while */ 619354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 620354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "[Parent] Failed to create a thread"); 621354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 622354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 6230dc076565f772bb1953209fb69ea150b494aaa40robbiew if ((i % 4) == 0) 624354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao output("[parent] %i manager threads created...\n", 625354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao i + 1); 626354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 6270dc076565f772bb1953209fb69ea150b494aaa40robbiew } 6282c28215423293e443469a07ae7011135d058b671Garrett Cooper 629354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 630354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao output("[parent] All %i manager threads are running...\n", 631354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao NSCENAR * SCALABILITY_FACTOR); 632354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 6332c28215423293e443469a07ae7011135d058b671Garrett Cooper 6340dc076565f772bb1953209fb69ea150b494aaa40robbiew /* join the manager threads and destroy the cells */ 635354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (i = 0; i < NSCENAR * SCALABILITY_FACTOR; i++) { 636e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper ret = pthread_join(mngrs[i], NULL); 637354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 638354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "[Parent] Failed to join a thread"); 639354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6402c28215423293e443469a07ae7011135d058b671Garrett Cooper 6410dc076565f772bb1953209fb69ea150b494aaa40robbiew canceled += cells[i].canceled; 6420dc076565f772bb1953209fb69ea150b494aaa40robbiew cancelfailed += cells[i].cancelfailed; 6430dc076565f772bb1953209fb69ea150b494aaa40robbiew cnttotal += cells[i].cnttotal; 6442c28215423293e443469a07ae7011135d058b671Garrett Cooper 6450dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_barrier_destroy(&(cells[i].bar)); 646354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 647354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to destroy a barrier"); 648354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6492c28215423293e443469a07ae7011135d058b671Garrett Cooper 6500dc076565f772bb1953209fb69ea150b494aaa40robbiew ret = pthread_cond_destroy(&(cells[i].cnd)); 651354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 652354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to destroy a cond"); 653354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6542c28215423293e443469a07ae7011135d058b671Garrett Cooper 6552c28215423293e443469a07ae7011135d058b671Garrett Cooper ret = pthread_mutex_destroy(&(cells[i].mtx)); 656354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (ret != 0) { 657354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao UNRESOLVED(ret, "Failed to destroy a mutex"); 658354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 6590dc076565f772bb1953209fb69ea150b494aaa40robbiew } 6602c28215423293e443469a07ae7011135d058b671Garrett Cooper 6610dc076565f772bb1953209fb69ea150b494aaa40robbiew /* exit */ 662354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 0 6630dc076565f772bb1953209fb69ea150b494aaa40robbiew output("Test passed\n"); 6640dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" Total loops : %8li\n", cnttotal); 665354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 666354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#if VERBOSE > 1 6670dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" Failed cancel request: %8li\n", cancelfailed); 6680dc076565f772bb1953209fb69ea150b494aaa40robbiew output(" Canceled threads : %8li\n", canceled); 669354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 6700dc076565f772bb1953209fb69ea150b494aaa40robbiew 6710dc076565f772bb1953209fb69ea150b494aaa40robbiew PASSED; 672ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 673