diff options
author | Martin Nagy <mnagy@redhat.com> | 2009-03-30 13:01:56 +0200 |
---|---|---|
committer | Martin Nagy <mnagy@redhat.com> | 2009-03-30 13:08:32 +0200 |
commit | a148a9f5f2659c60a534f82d0ec8736f90afa223 (patch) | |
tree | 2244198110d012ec0afa16a1a3eee64ee4057061 /src/semaphore.c | |
parent | dd3b35c40b5709f8ea3ded23d4bb5fb4a9320352 (diff) | |
download | ldap_driver-a148a9f5f2659c60a534f82d0ec8736f90afa223.tar.gz ldap_driver-a148a9f5f2659c60a534f82d0ec8736f90afa223.tar.xz ldap_driver-a148a9f5f2659c60a534f82d0ec8736f90afa223.zip |
Prepare the tree for conversion to autoconf.
All source files are now moved to src/ and the old Makefile is removed.
Diffstat (limited to 'src/semaphore.c')
-rw-r--r-- | src/semaphore.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/semaphore.c b/src/semaphore.c new file mode 100644 index 0000000..33ae9f8 --- /dev/null +++ b/src/semaphore.c @@ -0,0 +1,108 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Note: This implementation doesn't prevent from starvation. This means that + * if a thread signals the semaphore and then waits for it, it may catch it's + * own signal. However, for our purposes, this shouldn't be needed. + */ + +#include <isc/condition.h> +#include <isc/result.h> +#include <isc/util.h> + +#include "semaphore.h" + +/* + * Initialize a semaphore. + * + * sem - allocated semaphore that will be initialized + * value - number of times we can acquire the semaphore. + */ +isc_result_t +semaphore_init(semaphore_t *sem, int value) +{ + isc_result_t result; + + REQUIRE(sem != NULL); + REQUIRE(value > 0); + + sem->value = value; + result = isc_mutex_init(&sem->mutex); + if (result != ISC_R_SUCCESS) + return result; + + result = isc_condition_init(&sem->cond); + if (result != ISC_R_SUCCESS) + isc_mutex_destroy(&sem->mutex); + + return result; +} + +/* + * Destroy a semaphore. + * + * sem - semaphore to be destroyed. + */ +void +semaphore_destroy(semaphore_t *sem) +{ + if (sem == NULL) + return; + + RUNTIME_CHECK(isc_mutex_destroy(&sem->mutex) == ISC_R_SUCCESS); + RUNTIME_CHECK(isc_condition_destroy(&sem->cond) == ISC_R_SUCCESS); +} + +/* + * Wait on semaphore. This operation will try to acquire a lock on the + * semaphore. If the semaphore is already acquired as many times at it allows, + * the function will block until someone releases the lock. + */ +void +semaphore_wait(semaphore_t *sem) +{ + REQUIRE(sem != NULL); + + LOCK(&sem->mutex); + + sem->value--; + if (sem->value < 0) + WAIT(&sem->cond, &sem->mutex); + + UNLOCK(&sem->mutex); +} + +/* + * Release the semaphore. This will make sure that another thread (probably + * already waiting) will be able to acquire the semaphore. + */ +void +semaphore_signal(semaphore_t *sem) +{ + REQUIRE(sem != NULL); + + LOCK(&sem->mutex); + + sem->value++; + if (sem->value >= 0) + SIGNAL(&sem->cond); + + UNLOCK(&sem->mutex); +} |