Annotation of win32/apache22/srclib/apr-util/include/apr_anylock.h, revision 1.1

1.1     ! moko        1: /* Licensed to the Apache Software Foundation (ASF) under one or more
        !             2:  * contributor license agreements.  See the NOTICE file distributed with
        !             3:  * this work for additional information regarding copyright ownership.
        !             4:  * The ASF licenses this file to You under the Apache License, Version 2.0
        !             5:  * (the "License"); you may not use this file except in compliance with
        !             6:  * the License.  You may obtain a copy of the License at
        !             7:  *
        !             8:  *     http://www.apache.org/licenses/LICENSE-2.0
        !             9:  *
        !            10:  * Unless required by applicable law or agreed to in writing, software
        !            11:  * distributed under the License is distributed on an "AS IS" BASIS,
        !            12:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        !            13:  * See the License for the specific language governing permissions and
        !            14:  * limitations under the License.
        !            15:  */
        !            16: 
        !            17: /**
        !            18:  * @file apr_anylock.h
        !            19:  * @brief APR-Util transparent any lock flavor wrapper
        !            20:  */
        !            21: #ifndef APR_ANYLOCK_H
        !            22: #define APR_ANYLOCK_H
        !            23: 
        !            24: #include "apr_proc_mutex.h"
        !            25: #include "apr_thread_mutex.h"
        !            26: #include "apr_thread_rwlock.h"
        !            27: 
        !            28: /** Structure that may contain any APR lock type */
        !            29: typedef struct apr_anylock_t {
        !            30:     /** Indicates what type of lock is in lock */
        !            31:     enum tm_lock {
        !            32:         apr_anylock_none,           /**< None */
        !            33:         apr_anylock_procmutex,      /**< Process-based */
        !            34:         apr_anylock_threadmutex,    /**< Thread-based */
        !            35:         apr_anylock_readlock,       /**< Read lock */
        !            36:         apr_anylock_writelock       /**< Write lock */
        !            37:     } type;
        !            38:     /** Union of all possible APR locks */
        !            39:     union apr_anylock_u_t {
        !            40:         apr_proc_mutex_t *pm;       /**< Process mutex */
        !            41: #if APR_HAS_THREADS
        !            42:         apr_thread_mutex_t *tm;     /**< Thread mutex */
        !            43:         apr_thread_rwlock_t *rw;    /**< Read-write lock */
        !            44: #endif
        !            45:     } lock;
        !            46: } apr_anylock_t;
        !            47: 
        !            48: #if APR_HAS_THREADS
        !            49: 
        !            50: /** Lock an apr_anylock_t structure */
        !            51: #define APR_ANYLOCK_LOCK(lck)                \
        !            52:     (((lck)->type == apr_anylock_none)         \
        !            53:       ? APR_SUCCESS                              \
        !            54:       : (((lck)->type == apr_anylock_threadmutex)  \
        !            55:           ? apr_thread_mutex_lock((lck)->lock.tm)    \
        !            56:           : (((lck)->type == apr_anylock_procmutex)    \
        !            57:               ? apr_proc_mutex_lock((lck)->lock.pm)      \
        !            58:               : (((lck)->type == apr_anylock_readlock)     \
        !            59:                   ? apr_thread_rwlock_rdlock((lck)->lock.rw) \
        !            60:                   : (((lck)->type == apr_anylock_writelock)    \
        !            61:                       ? apr_thread_rwlock_wrlock((lck)->lock.rw) \
        !            62:                       : APR_EINVAL)))))
        !            63: 
        !            64: #else /* APR_HAS_THREADS */
        !            65: 
        !            66: #define APR_ANYLOCK_LOCK(lck)                \
        !            67:     (((lck)->type == apr_anylock_none)         \
        !            68:       ? APR_SUCCESS                              \
        !            69:           : (((lck)->type == apr_anylock_procmutex)    \
        !            70:               ? apr_proc_mutex_lock((lck)->lock.pm)      \
        !            71:                       : APR_EINVAL))
        !            72: 
        !            73: #endif /* APR_HAS_THREADS */
        !            74: 
        !            75: #if APR_HAS_THREADS
        !            76: 
        !            77: /** Try to lock an apr_anylock_t structure */
        !            78: #define APR_ANYLOCK_TRYLOCK(lck)                \
        !            79:     (((lck)->type == apr_anylock_none)            \
        !            80:       ? APR_SUCCESS                                 \
        !            81:       : (((lck)->type == apr_anylock_threadmutex)     \
        !            82:           ? apr_thread_mutex_trylock((lck)->lock.tm)    \
        !            83:           : (((lck)->type == apr_anylock_procmutex)       \
        !            84:               ? apr_proc_mutex_trylock((lck)->lock.pm)      \
        !            85:               : (((lck)->type == apr_anylock_readlock)        \
        !            86:                   ? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
        !            87:                   : (((lck)->type == apr_anylock_writelock)       \
        !            88:                       ? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
        !            89:                           : APR_EINVAL)))))
        !            90: 
        !            91: #else /* APR_HAS_THREADS */
        !            92: 
        !            93: #define APR_ANYLOCK_TRYLOCK(lck)                \
        !            94:     (((lck)->type == apr_anylock_none)            \
        !            95:       ? APR_SUCCESS                                 \
        !            96:           : (((lck)->type == apr_anylock_procmutex)       \
        !            97:               ? apr_proc_mutex_trylock((lck)->lock.pm)      \
        !            98:                           : APR_EINVAL))
        !            99: 
        !           100: #endif /* APR_HAS_THREADS */
        !           101: 
        !           102: #if APR_HAS_THREADS
        !           103: 
        !           104: /** Unlock an apr_anylock_t structure */
        !           105: #define APR_ANYLOCK_UNLOCK(lck)              \
        !           106:     (((lck)->type == apr_anylock_none)         \
        !           107:       ? APR_SUCCESS                              \
        !           108:       : (((lck)->type == apr_anylock_threadmutex)  \
        !           109:           ? apr_thread_mutex_unlock((lck)->lock.tm)  \
        !           110:           : (((lck)->type == apr_anylock_procmutex)    \
        !           111:               ? apr_proc_mutex_unlock((lck)->lock.pm)    \
        !           112:               : ((((lck)->type == apr_anylock_readlock) || \
        !           113:                   ((lck)->type == apr_anylock_writelock))    \
        !           114:                   ? apr_thread_rwlock_unlock((lck)->lock.rw)   \
        !           115:                       : APR_EINVAL))))
        !           116: 
        !           117: #else /* APR_HAS_THREADS */
        !           118: 
        !           119: #define APR_ANYLOCK_UNLOCK(lck)              \
        !           120:     (((lck)->type == apr_anylock_none)         \
        !           121:       ? APR_SUCCESS                              \
        !           122:           : (((lck)->type == apr_anylock_procmutex)    \
        !           123:               ? apr_proc_mutex_unlock((lck)->lock.pm)    \
        !           124:                       : APR_EINVAL))
        !           125: 
        !           126: #endif /* APR_HAS_THREADS */
        !           127: 
        !           128: #endif /* !APR_ANYLOCK_H */

E-mail: