1 /**************************************************************************** 2 * 3 * Copyright (C) 2000 Jason Evans <jasone@freebsd.org>. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice(s), this list of conditions and the following disclaimer as 11 * the first lines of this file unmodified other than the possible 12 * addition of one or more copyright notices. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice(s), this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 28 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 **************************************************************************** 31 * 32 * sem test. 33 * 34 * $FreeBSD: src/lib/libc_r/test/sem_d.c,v 1.1.2.2 2001/06/22 21:44:27 jasone Exp $ 35 * 36 ****************************************************************************/ 37 38 #include <assert.h> 39 #include <stdio.h> 40 #include <fcntl.h> 41 #include <errno.h> 42 #include <pthread.h> 43 #include <semaphore.h> 44 45 #define NTHREADS 10 46 47 void * 48 entry(void * a_arg) 49 { 50 sem_t * sem = (sem_t *) a_arg; 51 52 sem_wait(sem); 53 fprintf(stderr, "Got semaphore\n"); 54 55 return NULL; 56 } 57 58 int 59 main() 60 { 61 sem_t sem_a, sem_b; 62 pthread_t threads[NTHREADS]; 63 unsigned i; 64 int val; 65 66 fprintf(stderr, "Test begin\n"); 67 68 #ifdef _LIBC_R_ 69 assert(-1 == sem_init(&sem_b, 1, 0)); 70 assert(EPERM == errno); 71 #endif 72 73 assert(0 == sem_init(&sem_b, 0, 0)); 74 assert(0 == sem_getvalue(&sem_b, &val)); 75 assert(0 == val); 76 77 assert(0 == sem_post(&sem_b)); 78 assert(0 == sem_getvalue(&sem_b, &val)); 79 assert(1 == val); 80 81 assert(0 == sem_wait(&sem_b)); 82 assert(-1 == sem_trywait(&sem_b)); 83 assert(EAGAIN == errno); 84 assert(0 == sem_post(&sem_b)); 85 assert(0 == sem_trywait(&sem_b)); 86 assert(0 == sem_post(&sem_b)); 87 assert(0 == sem_wait(&sem_b)); 88 assert(0 == sem_post(&sem_b)); 89 90 #ifdef _LIBC_R_ 91 assert(SEM_FAILED == sem_open("/foo", O_CREAT | O_EXCL, 0644, 0)); 92 assert(ENOSYS == errno); 93 94 assert(-1 == sem_close(&sem_b)); 95 assert(ENOSYS == errno); 96 97 assert(-1 == sem_unlink("/foo")); 98 assert(ENOSYS == errno); 99 #endif 100 101 assert(0 == sem_destroy(&sem_b)); 102 103 assert(0 == sem_init(&sem_a, 0, 0)); 104 105 for (i = 0; i < NTHREADS; i++) { 106 pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 107 } 108 109 for (i = 0; i < NTHREADS; i++) { 110 assert(0 == sem_post(&sem_a)); 111 } 112 113 for (i = 0; i < NTHREADS; i++) { 114 pthread_join(threads[i], NULL); 115 } 116 117 for (i = 0; i < NTHREADS; i++) { 118 pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 119 } 120 121 for (i = 0; i < NTHREADS; i++) { 122 assert(0 == sem_post(&sem_a)); 123 } 124 125 for (i = 0; i < NTHREADS; i++) { 126 pthread_join(threads[i], NULL); 127 } 128 129 assert(0 == sem_destroy(&sem_a)); 130 131 fprintf(stderr, "Test end\n"); 132 return 0; 133 } 134