home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / Apache / apache_2.0.52-win32-x86-no_ssl.msi / Data.Cab / F277192_apr_anylock.h < prev    next >
C/C++ Source or Header  |  2004-02-13  |  5KB  |  128 lines

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