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