This is a bite-sized chunk of the previous mega-patch. The unfortunate thing with this patch is that there are many new files added, and they all happen to share common names. So I've done two things: 1) attached the "interesting" files inline in this message for public reviewal, and 2) attached a patch and a tarball containing the new files in their preserved patch structures. (That means that in order to apply this, one must untar the tarball *and* apply the patch.)
What does this patch give us? - Thread mutexes in APR (what used to be called INTRAPROCESS locks). - apr_thread_mutex_t is fully implemented for UNIX, I've provided stubs elsewhere to keep us building. Hopefully this should be much easier to digest than the previous patch. Please excuse the tarball for the sake of namespace protection. Again: this patch does not change any existing functionality, it only adds the implementation of the new lock API in parallel with the old one. -aaron --------------------------------------------------------- Public Headers: (apr_thread_mutex.h) /* ==================================================================== * 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 [EMAIL PROTECTED] * * 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/>. */ #ifndef APR_THREAD_MUTEX_H #define APR_THREAD_MUTEX_H #include "apr.h" #include "apr_pools.h" #include "apr_errno.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * @file apr_thread_mutex.h * @brief APR Thread Mutex Routines */ /** * @defgroup APR_ThreadMutex Thread Mutex Routines * @ingroup APR * @{ */ typedef struct apr_thread_mutex_t apr_thread_mutex_t; /** * Create and initialize a mutex that can be used to synchronize threads. * @param mutex the memory address where the newly created mutex will be * stored. * @param pool the pool from which to allocate the mutex. */ APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, apr_pool_t *pool); /** * Acquire the lock for the given mutex. If the mutex is already locked, * the current thread will be put to sleep until the lock becomes available. * @param mutex the mutex on which to acquire the lock. */ APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex); /** * Attempt to acquire the lock for the given mutex. If the mutex has already * been acquired, the call returns immediately with APR_EBUSY. Note: it * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine * if the return value was APR_EBUSY, for portability reasons. * @param mutex the mutex on which to attempt the lock acquiring. */ APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex); /** * Release the lock for the given mutex. * @param mutex the mutex from which to release the lock. */ APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex); /** * Destroy the mutex and free the memory associated with the lock. * @param mutex the mutex to destroy. */ APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex); #ifdef __cplusplus } #endif #endif /* ! APR_THREAD_MUTEX_H */ --------------------------------------------------------- Private Headers (only UNIX shown): thread_mutex.h /* ==================================================================== * 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 [EMAIL PROTECTED] * * 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/>. */ #ifndef THREAD_MUTEX_H #define THREAD_MUTEX_H #include "apr.h" #include "apr_private.h" #include "apr_general.h" #include "apr_lib.h" #include "apr_thread_mutex.h" #include "apr_sms.h" #include "apr_portable.h" #if APR_HAVE_PTHREAD_H #include <pthread.h> #endif /* End System Headers */ #if APR_HAS_THREADS struct apr_thread_mutex_t { apr_pool_t *pool; pthread_mutex_t mutex; apr_os_thread_t owner; int owner_ref; }; #endif #endif /* THREAD_MUTEX_H */ --------------------------------------------------------- Private Implementation (only UNIX shown): thread_mutex.c /* ==================================================================== * 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 [EMAIL PROTECTED] * * 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" #if APR_HAS_THREADS static apr_status_t thread_mutex_cleanup(void *data) { apr_thread_mutex_t *mutex = (apr_thread_mutex_t *)data; apr_status_t stat; pthread_mutex_unlock(&mutex->mutex); stat = pthread_mutex_destroy(&mutex->mutex); #ifdef PTHREAD_SETS_ERRNO if (stat) { stat = errno; } #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, apr_pool_t *pool) { apr_thread_mutex_t *new_mutex; pthread_mutexattr_t mattr; apr_status_t stat; new_mutex = (apr_thread_mutex_t *)apr_pcalloc(pool, sizeof(apr_thread_mutex_t)); if (new_mutex == NULL) { return APR_ENOMEM; } new_mutex->pool = pool; if ((stat = pthread_mutexattr_init(&mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } if ((stat = pthread_mutex_init(&new_mutex->mutex, &mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } if ((stat = pthread_mutexattr_destroy(&mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } apr_pool_cleanup_register(new_mutex->pool, (void *)new_mutex, thread_mutex_cleanup, apr_pool_cleanup_null); *mutex = new_mutex; return APR_SUCCESS; } APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) { apr_status_t stat; #if APR_HAS_THREADS apr_os_thread_t my_thrid; /* save one call to apr_os_thread_current() */ if (apr_os_thread_equal(mutex->owner, (my_thrid = apr_os_thread_current()))) { mutex->owner_ref++; return APR_SUCCESS; } #endif stat = pthread_mutex_lock(&mutex->mutex); if (stat) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif return stat; } #if APR_HAS_THREADS mutex->owner = my_thrid; mutex->owner_ref = 1; #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) { apr_status_t stat; #if APR_HAS_THREADS apr_os_thread_t my_thrid; /* save one call to apr_os_thread_current() */ if (apr_os_thread_equal(mutex->owner, (my_thrid = apr_os_thread_current()))) { mutex->owner_ref++; return APR_SUCCESS; } #endif stat = pthread_mutex_trylock(&mutex->mutex); if (stat) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif /* Normalize the return code. */ if (stat == EBUSY) stat = APR_EBUSY; return stat; } #if APR_HAS_THREADS mutex->owner = my_thrid; mutex->owner_ref = 1; #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) { apr_status_t status; #if APR_HAS_THREADS if (apr_os_thread_equal(mutex->owner, apr_os_thread_current())) { mutex->owner_ref--; if (mutex->owner_ref > 0) return APR_SUCCESS; } #endif status = pthread_mutex_unlock(&mutex->mutex); if (status) { #ifdef PTHREAD_SETS_ERRNO status = errno; #endif return status; } #if APR_HAS_THREADS memset(&mutex->owner, 0, sizeof mutex->owner); mutex->owner_ref = 0; #endif return status; } APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) { apr_status_t stat; if ((stat = thread_mutex_cleanup(mutex)) == APR_SUCCESS) { apr_pool_cleanup_kill(mutex->pool, mutex, thread_mutex_cleanup); return APR_SUCCESS; } return stat; } #endif /* APR_HAS_THREADS */
apr_thread_mutex.tar
Description: Unix tar archive
Index: locks/beos/Makefile.in
===================================================================
RCS file: /home/cvspublic/apr/locks/beos/Makefile.in,v
retrieving revision 1.12
diff -u -r1.12 Makefile.in
--- locks/beos/Makefile.in 2001/06/11 11:33:33 1.12
+++ locks/beos/Makefile.in 2001/09/04 20:08:40
@@ -1,5 +1,6 @@
-TARGETS = locks.lo
+TARGETS = locks.lo \
+ thread_mutex.lo
# bring in rules.mk for standard functionality
@INCLUDE_RULES@
Index: locks/os2/Makefile.in
===================================================================
RCS file: /home/cvspublic/apr/locks/os2/Makefile.in,v
retrieving revision 1.12
diff -u -r1.12 Makefile.in
--- locks/os2/Makefile.in 2001/01/09 11:05:57 1.12
+++ locks/os2/Makefile.in 2001/09/04 20:08:40
@@ -1,5 +1,6 @@
-TARGETS = locks.lo
+TARGETS = locks.lo \
+ thread_mutex.lo
# bring in rules.mk for standard functionality
@INCLUDE_RULES@
Index: locks/unix/Makefile.in
===================================================================
RCS file: /home/cvspublic/apr/locks/unix/Makefile.in,v
retrieving revision 1.18
diff -u -r1.18 Makefile.in
--- locks/unix/Makefile.in 2001/01/09 11:05:59 1.18
+++ locks/unix/Makefile.in 2001/09/04 20:08:40
@@ -2,7 +2,8 @@
TARGETS = \
locks.lo \
crossproc.lo \
- intraproc.lo
+ intraproc.lo \
+ thread_mutex.lo
# bring in rules.mk for standard functionality
@INCLUDE_RULES@
