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