159612Sjasone/**************************************************************************** 259612Sjasone * 359612Sjasone * Copyright (C) 2000 Jason Evans <jasone@freebsd.org>. 459612Sjasone * All rights reserved. 559612Sjasone * 659612Sjasone * Redistribution and use in source and binary forms, with or without 759612Sjasone * modification, are permitted provided that the following conditions 859612Sjasone * are met: 959612Sjasone * 1. Redistributions of source code must retain the above copyright 1059612Sjasone * notice(s), this list of conditions and the following disclaimer as 1159612Sjasone * the first lines of this file unmodified other than the possible 1259612Sjasone * addition of one or more copyright notices. 1359612Sjasone * 2. Redistributions in binary form must reproduce the above copyright 1459612Sjasone * notice(s), this list of conditions and the following disclaimer in 1559612Sjasone * the documentation and/or other materials provided with the 1659612Sjasone * distribution. 1759612Sjasone * 1859612Sjasone * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 1959612Sjasone * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2059612Sjasone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2159612Sjasone * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE 2259612Sjasone * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2359612Sjasone * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2459612Sjasone * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2559612Sjasone * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2659612Sjasone * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2759612Sjasone * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 2859612Sjasone * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2959612Sjasone * 3059612Sjasone **************************************************************************** 3159612Sjasone * 3259612Sjasone * sem test. 3359612Sjasone * 3459612Sjasone * $FreeBSD$ 3559612Sjasone * 3659612Sjasone ****************************************************************************/ 3759612Sjasone 3859612Sjasone#include <assert.h> 3959612Sjasone#include <stdio.h> 4059612Sjasone#include <fcntl.h> 4159612Sjasone#include <errno.h> 4259612Sjasone#include <semaphore.h> 4359612Sjasone#include <pthread.h> 4459612Sjasone 4559612Sjasone#define NTHREADS 10 4659612Sjasone 4759612Sjasonevoid * 4859612Sjasoneentry(void * a_arg) 4959612Sjasone{ 5059612Sjasone sem_t * sem = (sem_t *) a_arg; 5159612Sjasone 5259612Sjasone sem_wait(sem); 5359612Sjasone fprintf(stderr, "Got semaphore\n"); 5459612Sjasone 5559612Sjasone return NULL; 5659612Sjasone} 5759612Sjasone 5859612Sjasoneint 5959612Sjasonemain() 6059612Sjasone{ 6159612Sjasone sem_t sem_a, sem_b; 6259612Sjasone pthread_t threads[NTHREADS]; 6359612Sjasone unsigned i; 6459612Sjasone int val; 6559612Sjasone 6659612Sjasone fprintf(stderr, "Test begin\n"); 6759612Sjasone 6859612Sjasone#ifdef _LIBC_R_ 6959612Sjasone assert(-1 == sem_init(&sem_b, 1, 0)); 7059612Sjasone assert(EPERM == errno); 7159612Sjasone#endif 7259612Sjasone 7359612Sjasone assert(0 == sem_init(&sem_b, 0, 0)); 7459612Sjasone assert(0 == sem_getvalue(&sem_b, &val)); 7559612Sjasone assert(0 == val); 7659612Sjasone 7759612Sjasone assert(0 == sem_post(&sem_b)); 7859612Sjasone assert(0 == sem_getvalue(&sem_b, &val)); 7959612Sjasone assert(1 == val); 8059612Sjasone 8159612Sjasone assert(0 == sem_wait(&sem_b)); 8259612Sjasone assert(-1 == sem_trywait(&sem_b)); 8359612Sjasone assert(EAGAIN == errno); 8459612Sjasone assert(0 == sem_post(&sem_b)); 8559612Sjasone assert(0 == sem_trywait(&sem_b)); 8659612Sjasone assert(0 == sem_post(&sem_b)); 8759612Sjasone assert(0 == sem_wait(&sem_b)); 8859612Sjasone assert(0 == sem_post(&sem_b)); 8959612Sjasone 9059612Sjasone#ifdef _LIBC_R_ 9159612Sjasone assert(SEM_FAILED == sem_open("/foo", O_CREAT | O_EXCL, 0644, 0)); 9259612Sjasone assert(ENOSYS == errno); 9359612Sjasone 9459612Sjasone assert(-1 == sem_close(&sem_b)); 9559612Sjasone assert(ENOSYS == errno); 9659612Sjasone 9759612Sjasone assert(-1 == sem_unlink("/foo")); 9859612Sjasone assert(ENOSYS == errno); 9959612Sjasone#endif 10059612Sjasone 10159612Sjasone assert(0 == sem_destroy(&sem_b)); 10259612Sjasone 10359612Sjasone assert(0 == sem_init(&sem_a, 0, 0)); 10459612Sjasone 10559612Sjasone for (i = 0; i < NTHREADS; i++) { 10659612Sjasone pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 10759612Sjasone } 10859612Sjasone 10959612Sjasone for (i = 0; i < NTHREADS; i++) { 11059612Sjasone assert(0 == sem_post(&sem_a)); 11159612Sjasone } 11259612Sjasone 11359612Sjasone for (i = 0; i < NTHREADS; i++) { 11459612Sjasone pthread_join(threads[i], NULL); 11559612Sjasone } 11659612Sjasone 11759612Sjasone for (i = 0; i < NTHREADS; i++) { 11859612Sjasone pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 11959612Sjasone } 12059612Sjasone 12159612Sjasone for (i = 0; i < NTHREADS; i++) { 12259612Sjasone assert(0 == sem_post(&sem_a)); 12359612Sjasone } 12459612Sjasone 12559612Sjasone for (i = 0; i < NTHREADS; i++) { 12659612Sjasone pthread_join(threads[i], NULL); 12759612Sjasone } 12859612Sjasone 12959612Sjasone assert(0 == sem_destroy(&sem_a)); 13059612Sjasone 13159612Sjasone fprintf(stderr, "Test end\n"); 13259612Sjasone return 0; 13359612Sjasone} 134