sem_d.c revision 59612
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: head/lib/libkse/test/sem_d.c 59612 2000-04-24 21:07:45Z jasone $ 3559612Sjasone * 3659612Sjasone ****************************************************************************/ 3759612Sjasone 3859612Sjasone#define _REENTRANT 3959612Sjasone 4059612Sjasone#include <assert.h> 4159612Sjasone#include <stdio.h> 4259612Sjasone#include <fcntl.h> 4359612Sjasone#include <errno.h> 4459612Sjasone#include <semaphore.h> 4559612Sjasone#include <pthread.h> 4659612Sjasone 4759612Sjasone#define NTHREADS 10 4859612Sjasone 4959612Sjasonevoid * 5059612Sjasoneentry(void * a_arg) 5159612Sjasone{ 5259612Sjasone sem_t * sem = (sem_t *) a_arg; 5359612Sjasone 5459612Sjasone sem_wait(sem); 5559612Sjasone fprintf(stderr, "Got semaphore\n"); 5659612Sjasone 5759612Sjasone return NULL; 5859612Sjasone} 5959612Sjasone 6059612Sjasoneint 6159612Sjasonemain() 6259612Sjasone{ 6359612Sjasone sem_t sem_a, sem_b; 6459612Sjasone pthread_t threads[NTHREADS]; 6559612Sjasone unsigned i; 6659612Sjasone int val; 6759612Sjasone 6859612Sjasone fprintf(stderr, "Test begin\n"); 6959612Sjasone 7059612Sjasone#ifdef _LIBC_R_ 7159612Sjasone assert(-1 == sem_init(&sem_b, 1, 0)); 7259612Sjasone assert(EPERM == errno); 7359612Sjasone#endif 7459612Sjasone 7559612Sjasone assert(0 == sem_init(&sem_b, 0, 0)); 7659612Sjasone assert(0 == sem_getvalue(&sem_b, &val)); 7759612Sjasone assert(0 == val); 7859612Sjasone 7959612Sjasone assert(0 == sem_post(&sem_b)); 8059612Sjasone assert(0 == sem_getvalue(&sem_b, &val)); 8159612Sjasone assert(1 == val); 8259612Sjasone 8359612Sjasone assert(0 == sem_wait(&sem_b)); 8459612Sjasone assert(-1 == sem_trywait(&sem_b)); 8559612Sjasone assert(EAGAIN == errno); 8659612Sjasone assert(0 == sem_post(&sem_b)); 8759612Sjasone assert(0 == sem_trywait(&sem_b)); 8859612Sjasone assert(0 == sem_post(&sem_b)); 8959612Sjasone assert(0 == sem_wait(&sem_b)); 9059612Sjasone assert(0 == sem_post(&sem_b)); 9159612Sjasone 9259612Sjasone#ifdef _LIBC_R_ 9359612Sjasone assert(SEM_FAILED == sem_open("/foo", O_CREAT | O_EXCL, 0644, 0)); 9459612Sjasone assert(ENOSYS == errno); 9559612Sjasone 9659612Sjasone assert(-1 == sem_close(&sem_b)); 9759612Sjasone assert(ENOSYS == errno); 9859612Sjasone 9959612Sjasone assert(-1 == sem_unlink("/foo")); 10059612Sjasone assert(ENOSYS == errno); 10159612Sjasone#endif 10259612Sjasone 10359612Sjasone assert(0 == sem_destroy(&sem_b)); 10459612Sjasone 10559612Sjasone assert(0 == sem_init(&sem_a, 0, 0)); 10659612Sjasone 10759612Sjasone for (i = 0; i < NTHREADS; i++) { 10859612Sjasone pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 10959612Sjasone } 11059612Sjasone 11159612Sjasone for (i = 0; i < NTHREADS; i++) { 11259612Sjasone assert(0 == sem_post(&sem_a)); 11359612Sjasone } 11459612Sjasone 11559612Sjasone for (i = 0; i < NTHREADS; i++) { 11659612Sjasone pthread_join(threads[i], NULL); 11759612Sjasone } 11859612Sjasone 11959612Sjasone for (i = 0; i < NTHREADS; i++) { 12059612Sjasone pthread_create(&threads[i], NULL, entry, (void *) &sem_a); 12159612Sjasone } 12259612Sjasone 12359612Sjasone for (i = 0; i < NTHREADS; i++) { 12459612Sjasone assert(0 == sem_post(&sem_a)); 12559612Sjasone } 12659612Sjasone 12759612Sjasone for (i = 0; i < NTHREADS; i++) { 12859612Sjasone pthread_join(threads[i], NULL); 12959612Sjasone } 13059612Sjasone 13159612Sjasone assert(0 == sem_destroy(&sem_a)); 13259612Sjasone 13359612Sjasone fprintf(stderr, "Test end\n"); 13459612Sjasone return 0; 13559612Sjasone} 136