1 /* 2 * File: semaphore4t.c 3 * 4 * 5 * -------------------------------------------------------------------------- 6 * 7 * Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems 8 * Copyright(C) 2008 Jason Schmidlapp 9 * 10 * Contact Email: jschmidlapp@users.sourceforge.net 11 * 12 * 13 * Based upon Pthreads-win32 - POSIX Threads Library for Win32 14 * Copyright(C) 1998 John E. Bossom 15 * Copyright(C) 1999,2005 Pthreads-win32 contributors 16 * 17 * Contact Email: rpj@callisto.canberra.edu.au 18 * 19 * The original list of contributors to the Pthreads-win32 project 20 * is contained in the file CONTRIBUTORS.ptw32 included with the 21 * source code distribution. The list can also be seen at the 22 * following World Wide Web location: 23 * http://sources.redhat.com/pthreads-win32/contributors.html 24 * 25 * This library is free software; you can redistribute it and/or 26 * modify it under the terms of the GNU Lesser General Public 27 * License as published by the Free Software Foundation; either 28 * version 2 of the License, or (at your option) any later version. 29 * 30 * This library is distributed in the hope that it will be useful, 31 * but WITHOUT ANY WARRANTY; without even the implied warranty of 32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 33 * Lesser General Public License for more details. 34 * 35 * You should have received a copy of the GNU Lesser General Public 36 * License along with this library in the file COPYING.LIB; 37 * if not, write to the Free Software Foundation, Inc., 38 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 39 * 40 * -------------------------------------------------------------------------- 41 * 42 * Test Synopsis: Verify sem_getvalue returns the correct number of waiters 43 * after threads are cancelled. 44 * - 45 * 46 * Test Method (Validation or Falsification): 47 * - Validation 48 * 49 * Requirements Tested: 50 * - sem_timedwait cancellation. 51 * 52 * Features Tested: 53 * - 54 * 55 * Cases Tested: 56 * - 57 * 58 * Description: 59 * - 60 * 61 * Environment: 62 * - 63 * 64 * Input: 65 * - None. 66 * 67 * Output: 68 * - File name, Line number, and failed expression on failure. 69 * - No output on success. 70 * 71 * Assumptions: 72 * - 73 * 74 * Pass Criteria: 75 * - Process returns zero exit status. 76 * 77 * Fail Criteria: 78 * - Process returns non-zero exit status. 79 */ 80 81 #include "test.h" 82 83 #define MAX_COUNT OS_MAX_SIMUL_THREADS 84 85 static sem_t s; 86 87 static void * 88 thr (void * arg) 89 { 90 if ((int) arg == 5) 91 { 92 // We expect this thread to be cancelled, 93 // so sem_wait should return EINTR. 94 assert(sem_timedwait(&s,NULL) == -1); 95 assert(errno == EINTR); 96 } 97 else 98 { 99 assert(sem_timedwait(&s,NULL) == 0); 100 } 101 102 return NULL; 103 } 104 105 int pthread_test_semaphore4t(void) 106 { 107 int value = 0; 108 int i; 109 pthread_t t[MAX_COUNT+1]; 110 111 assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); 112 assert(sem_getvalue(&s, &value) == 0); 113 assert(value == 0); 114 115 for (i = 1; i <= MAX_COUNT; i++) 116 { 117 assert(pthread_create(&t[i], NULL, thr, (void *) i) == 0); 118 do 119 { 120 sched_yield(); 121 assert(sem_getvalue(&s, &value) == 0); 122 } 123 while (value != -i); 124 assert(-value == i); 125 } 126 127 assert(sem_getvalue(&s, &value) == 0); 128 assert(-value == MAX_COUNT); 129 assert(pthread_cancel(t[5]) == 0); 130 assert(pthread_join(t[5], NULL) == 0); 131 assert(sem_getvalue(&s, &value) == 0); 132 assert(-value == MAX_COUNT - 1); 133 134 for (i = MAX_COUNT - 2; i >= 0; i--) 135 { 136 assert(sem_post(&s) == 0); 137 assert(sem_getvalue(&s, &value) == 0); 138 assert(-value == i); 139 } 140 141 for (i = 1; i <= MAX_COUNT; i++) 142 { 143 if (i != 5) 144 assert(pthread_join(t[i], NULL) == 0); 145 } 146 147 assert(sem_destroy(&s) == 0); 148 149 return 0; 150 } 151 152