diff options
author | rbb <rbb@13f79535-47bb-0310-9956-ffa450edef68> | 2001-09-13 01:04:23 +0000 |
---|---|---|
committer | rbb <rbb@13f79535-47bb-0310-9956-ffa450edef68> | 2001-09-13 01:04:23 +0000 |
commit | 5beca5e6c79a5bbcf840f871a1165d182c754f1f (patch) | |
tree | 52504645ac604f4c9f92dd1e70af522c6f23a628 /locks/unix | |
parent | c0cc2d31fdf25c87dc0456dd97305139fc35a2ba (diff) | |
download | libapr-5beca5e6c79a5bbcf840f871a1165d182c754f1f.tar.gz |
Add condition variables to the APR set of locking functions.
This does Unix, and provides stubs for all other platforms.
Submitted by: Aaron Bannert <aaron@clove.org>
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@62317 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks/unix')
-rw-r--r-- | locks/unix/Makefile.in | 3 | ||||
-rw-r--r-- | locks/unix/thread_cond.c | 163 |
2 files changed, 165 insertions, 1 deletions
diff --git a/locks/unix/Makefile.in b/locks/unix/Makefile.in index 46b40340b..81820f0d5 100644 --- a/locks/unix/Makefile.in +++ b/locks/unix/Makefile.in @@ -4,7 +4,8 @@ TARGETS = \ crossproc.lo \ intraproc.lo \ thread_mutex.lo \ - thread_rwlock.lo + thread_rwlock.lo \ + thread_cond.lo # bring in rules.mk for standard functionality @INCLUDE_RULES@ diff --git a/locks/unix/thread_cond.c b/locks/unix/thread_cond.c new file mode 100644 index 000000000..b03710fef --- /dev/null +++ b/locks/unix/thread_cond.c @@ -0,0 +1,163 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +#include "thread_mutex.h" +#include "thread_cond.h" + +#if APR_HAS_THREADS + + +static apr_status_t thread_cond_cleanup(void *data) +{ + apr_thread_cond_t *cond = (apr_thread_cond_t *)data; + apr_status_t stat; + + stat = pthread_cond_destroy(cond->cond); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + apr_thread_cond_t *new_cond; + apr_status_t stat; + + new_cond = (apr_thread_cond_t *)apr_pcalloc(pool, + sizeof(apr_thread_cond_t)); + + if (new_cond == NULL) { + return APR_ENOMEM; + } + + new_cond->pool = pool; + new_cond->cond = (pthread_cond_t *)apr_palloc(pool, + sizeof(pthread_cond_t)); + + if (new_cond->cond == NULL) { + return APR_ENOMEM; + } + + if ((stat = pthread_cond_init(new_cond->cond, NULL))) { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + thread_cond_cleanup(new_cond); + return stat; + } + + apr_pool_cleanup_register(new_cond->pool, + (void *)new_cond, thread_cond_cleanup, + apr_pool_cleanup_null); + + *cond = new_cond; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + apr_status_t stat; + + stat = pthread_cond_wait(cond->cond, &mutex->mutex); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + apr_status_t stat; + + stat = pthread_cond_signal(cond->cond); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + apr_status_t stat; + + stat = pthread_cond_broadcast(cond->cond); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + apr_status_t stat; + if ((stat = thread_cond_cleanup(cond)) == APR_SUCCESS) { + apr_pool_cleanup_kill(cond->pool, cond, thread_cond_cleanup); + return APR_SUCCESS; + } + return stat; +} + + +#endif /* APR_HAS_THREADS */ |