19#include "apr_arch_proc_mutex.h"
20#include "apr_arch_file_io.h"
29#if APR_HAS_POSIXSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || \
30 APR_HAS_SYSVSEM_SERIALIZE
39#if APR_HAS_POSIXSEM_SERIALIZE || APR_HAS_PROC_PTHREAD_SERIALIZE
49#if APR_HAS_FCNTL_SERIALIZE \
50 || APR_HAS_FLOCK_SERIALIZE \
51 || (APR_HAS_SYSVSEM_SERIALIZE \
52 && !defined(HAVE_SEMTIMEDOP)) \
53 || (APR_HAS_POSIXSEM_SERIALIZE \
54 && !defined(HAVE_SEM_TIMEDWAIT)) \
55 || (APR_HAS_PROC_PTHREAD_SERIALIZE \
56 && !defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK) \
57 && !defined(HAVE_PTHREAD_CONDATTR_SETPSHARED))
61#define SLEEP_TIME apr_time_from_msec(10)
88#if APR_HAS_POSIXSEM_SERIALIZE
91#define SEM_FAILED (-1)
105static unsigned int rshash (
char *
p) {
107 unsigned int b = 378551;
108 unsigned int a = 63689;
123 #define APR_POSIXSEM_NAME_MIN 13
224#if defined(HAVE_SEM_TIMEDWAIT)
268#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(POSIXSEM_IS_GLOBAL)
276#if defined(HAVE_SEM_TIMEDWAIT)
291#if APR_HAS_SYSVSEM_SERIALIZE
315 if (mutex->
os.crossproc != -1) {
379#if defined(HAVE_SEMTIMEDOP)
444#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(SYSVSEM_IS_GLOBAL)
452#if defined(HAVE_SEMTIMEDOP)
467#if APR_HAS_PROC_PTHREAD_SERIALIZE
469#ifndef APR_USE_PROC_PTHREAD_MUTEX_COND
470#if defined(HAVE_PTHREAD_CONDATTR_SETPSHARED) \
471 && !defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK)
472#define APR_USE_PROC_PTHREAD_MUTEX_COND 1
474#define APR_USE_PROC_PTHREAD_MUTEX_COND 0
488#define proc_pthread_cast(m) \
489 ((proc_pthread_mutex_t *)(m)->os.pthread_interproc)
491#define proc_pthread_mutex(m) \
492 (proc_pthread_cast(m)->mutex)
493#if APR_USE_PROC_PTHREAD_MUTEX_COND
495#define proc_pthread_mutex_cond(m) \
496 (proc_pthread_cast(m)->cond)
498#define proc_pthread_mutex_cond_locked(m) \
499 (proc_pthread_cast(m)->cond_locked)
501#define proc_pthread_mutex_cond_num_waiters(m) \
502 (proc_pthread_cast(m)->cond_num_waiters)
503#define proc_pthread_mutex_is_cond(m) \
504 ((m)->pthread_refcounting && proc_pthread_mutex_cond_locked(m) != -1)
507#define proc_pthread_mutex_refcount(m) \
508 (proc_pthread_cast(m)->refcount)
514 if (mutex->pthread_refcounting) {
523 if (mutex->pthread_refcounting) {
534#if APR_USE_PROC_PTHREAD_MUTEX_COND
542#ifdef HAVE_ZOS_PTHREADS
549#if APR_USE_PROC_PTHREAD_MUTEX_COND
552#ifdef HAVE_ZOS_PTHREADS
560#ifdef HAVE_ZOS_PTHREADS
611#if APR_USE_PROC_PTHREAD_MUTEX_COND
616#ifdef HAVE_ZOS_PTHREADS
623#ifdef HAVE_ZOS_PTHREADS
631#if defined(HAVE_PTHREAD_MUTEX_ROBUST) || defined(HAVE_PTHREAD_MUTEX_ROBUST_NP)
632#ifdef HAVE_PTHREAD_MUTEX_ROBUST
638#ifdef HAVE_ZOS_PTHREADS
646#ifdef HAVE_ZOS_PTHREADS
656#ifdef HAVE_ZOS_PTHREADS
668#ifdef HAVE_ZOS_PTHREADS
686 (*mutex)->curr_locked = 0;
699#if APR_USE_PROC_PTHREAD_MUTEX_COND
702#ifdef HAVE_ZOS_PTHREADS
705#if defined(HAVE_PTHREAD_MUTEX_ROBUST) || defined(HAVE_PTHREAD_MUTEX_ROBUST_NP)
709#ifdef HAVE_PTHREAD_MUTEX_ROBUST
741#ifdef HAVE_ZOS_PTHREADS
752#ifdef HAVE_ZOS_PTHREADS
773#ifdef HAVE_ZOS_PTHREADS
785#ifdef HAVE_ZOS_PTHREADS
793#ifdef HAVE_ZOS_PTHREADS
802#if defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK)
812#ifdef HAVE_ZOS_PTHREADS
821#if defined(HAVE_PTHREAD_MUTEX_ROBUST) || defined(HAVE_PTHREAD_MUTEX_ROBUST_NP)
825#ifdef HAVE_PTHREAD_MUTEX_ROBUST
865#if APR_USE_PROC_PTHREAD_MUTEX_COND
868#ifdef HAVE_ZOS_PTHREADS
871#if defined(HAVE_PTHREAD_MUTEX_ROBUST) || defined(HAVE_PTHREAD_MUTEX_ROBUST_NP)
875#ifdef HAVE_PTHREAD_MUTEX_ROBUST
894#ifdef HAVE_ZOS_PTHREADS
911#ifdef HAVE_ZOS_PTHREADS
935#if APR_USE_PROC_PTHREAD_MUTEX_COND
948#ifdef HAVE_ZOS_PTHREADS
956#ifdef HAVE_ZOS_PTHREADS
966#ifdef HAVE_ZOS_PTHREADS
1000#if APR_HAS_FCNTL_SERIALIZE
1032 if (mutex->interproc) {
1035 if (!mutex->interproc_closing
1036 && mutex->
os.crossproc != -1
1037 && close(mutex->
os.crossproc) == -1
1100#if FCNTL_TRYACQUIRE_EACCES
1145#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FCNTL_IS_GLOBAL)
1164#if APR_HAS_FLOCK_SERIALIZE
1178 if (mutex->interproc) {
1181 if (!mutex->interproc_closing
1182 && mutex->
os.crossproc != -1
1183 && close(mutex->
os.crossproc) == -1
1319#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FLOCK_IS_GLOBAL)
1341#if APR_HAS_SYSVSEM_SERIALIZE
1344#if APR_HAS_FCNTL_SERIALIZE
1353#if APR_HAS_PROC_PTHREAD_SERIALIZE
1356#if APR_HAS_POSIXSEM_SERIALIZE
1359#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE
1362#if APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE
1370#if APR_HAS_FCNTL_SERIALIZE
1383#if APR_HAS_FLOCK_SERIALIZE
1396#if APR_HAS_SYSVSEM_SERIALIZE
1409#if APR_HAS_POSIXSEM_SERIALIZE
1422#if APR_HAS_PROC_PTHREAD_SERIALIZE
1435#if APR_HAS_PROC_PTHREAD_SERIALIZE \
1436 && (APR_USE_PROC_PTHREAD_MUTEX_COND \
1437 || defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK)) \
1438 && defined(HAVE_PTHREAD_MUTEX_ROBUST)
1439#if APR_USE_PROC_PTHREAD_MUTEX_COND
1451#elif APR_HAS_SYSVSEM_SERIALIZE && defined(HAVE_SEMTIMEDOP)
1460#elif APR_HAS_POSIXSEM_SERIALIZE && defined(HAVE_SEM_TIMEDWAIT)
1472#if APR_USE_FLOCK_SERIALIZE
1480#elif APR_USE_SYSVSEM_SERIALIZE
1488#elif APR_USE_FCNTL_SERIALIZE
1496#elif APR_USE_PROC_PTHREAD_SERIALIZE
1504#elif APR_USE_POSIXSEM_SERIALIZE
1588#if APR_HAS_TIMEDLOCKS
1619#if APR_HAS_FLOCK_SERIALIZE
1621 return mutex->
fname;
1624#if APR_HAS_FCNTL_SERIALIZE
1626 return mutex->
fname;
1673 (*pmutex)->pool =
pool;
1676#if APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE
apr_uint32_t apr_atomic_inc32(volatile apr_uint32_t *mem)
int apr_atomic_dec32(volatile apr_uint32_t *mem)
const unsigned char * buf
apr_fileperms_t apr_uid_t uid
const char apr_lockmech_e mech
apr_fileperms_t apr_uid_t apr_gid_t gid
#define APR_STATUS_IS_EBUSY(s)
apr_bucket apr_bucket_brigade * a
const void apr_status_t(*) apr_status_t(* APR_DECLARE)(void) apr_pool_pre_cleanup_register(apr_pool_t *p
const char int apr_pool_t * pool
apr_int32_t apr_fileperms_t
const char apr_fileperms_t perms
const apr_hash_t const apr_hash_t * h2
#define APR_PERMS_SET_IMPLEMENT(type)
#define APR_POOL_IMPLEMENT_ACCESSOR(type)
#define apr_pcalloc(p, size)
apr_os_proc_mutex_t * ospmutex
apr_os_file_t int register_cleanup
apr_global_mutex_t * pmutex
apr_int64_t apr_interval_time_t
#define apr_time_sec(time)
#define apr_time_usec(time)
const apr_proc_mutex_unix_lock_methods_t * meth
apr_status_t(* perms_set)(apr_proc_mutex_t *, apr_fileperms_t, apr_uid_t, apr_gid_t)
apr_status_t(* release)(apr_proc_mutex_t *)
apr_status_t(* timedacquire)(apr_proc_mutex_t *, apr_interval_time_t)
apr_status_t(* child_init)(apr_proc_mutex_t **, apr_pool_t *, const char *)
apr_status_t(* tryacquire)(apr_proc_mutex_t *)
apr_status_t(* acquire)(apr_proc_mutex_t *)
static void proc_mutex(abts_case *tc, void *data)
#define APR_PROCESS_LOCK_MECH_IS_GLOBAL
mode_t apr_unix_perms2mode(apr_fileperms_t perms)
static apr_status_t proc_mutex_choose_method(apr_proc_mutex_t *new_mutex, apr_lockmech_e mech, apr_os_proc_mutex_t *ospmutex)
void apr_proc_mutex_unix_setup_lock(void)
static apr_status_t proc_mutex_create(apr_proc_mutex_t *new_mutex, apr_lockmech_e mech, const char *fname)