1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251875Speter * contributor license agreements. See the NOTICE file distributed with 3251875Speter * this work for additional information regarding copyright ownership. 4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251875Speter * (the "License"); you may not use this file except in compliance with 6251875Speter * the License. You may obtain a copy of the License at 7251875Speter * 8251875Speter * http://www.apache.org/licenses/LICENSE-2.0 9251875Speter * 10251875Speter * Unless required by applicable law or agreed to in writing, software 11251875Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251875Speter * See the License for the specific language governing permissions and 14251875Speter * limitations under the License. 15251875Speter */ 16251875Speter 17251875Speter#include "apr.h" 18251875Speter#include "apr_strings.h" 19251875Speter#include "apr_arch_global_mutex.h" 20251875Speter#include "apr_proc_mutex.h" 21251875Speter#include "apr_thread_mutex.h" 22251875Speter#include "apr_portable.h" 23251875Speter 24251875Speterstatic apr_status_t global_mutex_cleanup(void *data) 25251875Speter{ 26251875Speter apr_global_mutex_t *m = (apr_global_mutex_t *)data; 27251875Speter apr_status_t rv; 28251875Speter 29251875Speter rv = apr_proc_mutex_destroy(m->proc_mutex); 30251875Speter 31251875Speter#if APR_HAS_THREADS 32251875Speter if (m->thread_mutex) { 33251875Speter if (rv != APR_SUCCESS) { 34251875Speter (void)apr_thread_mutex_destroy(m->thread_mutex); 35251875Speter } 36251875Speter else { 37251875Speter rv = apr_thread_mutex_destroy(m->thread_mutex); 38251875Speter } 39251875Speter } 40251875Speter#endif /* APR_HAS_THREADS */ 41251875Speter 42251875Speter return rv; 43251875Speter} 44251875Speter 45251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_create(apr_global_mutex_t **mutex, 46251875Speter const char *fname, 47251875Speter apr_lockmech_e mech, 48251875Speter apr_pool_t *pool) 49251875Speter{ 50251875Speter apr_status_t rv; 51251875Speter apr_global_mutex_t *m; 52251875Speter 53251875Speter m = (apr_global_mutex_t *)apr_palloc(pool, sizeof(*m)); 54251875Speter m->pool = pool; 55251875Speter 56251875Speter rv = apr_proc_mutex_create(&m->proc_mutex, fname, mech, m->pool); 57251875Speter if (rv != APR_SUCCESS) { 58251875Speter return rv; 59251875Speter } 60251875Speter 61251875Speter#if APR_HAS_THREADS 62251875Speter if (m->proc_mutex->inter_meth->flags & APR_PROCESS_LOCK_MECH_IS_GLOBAL) { 63251875Speter m->thread_mutex = NULL; /* We don't need a thread lock. */ 64251875Speter } 65251875Speter else { 66251875Speter rv = apr_thread_mutex_create(&m->thread_mutex, 67251875Speter APR_THREAD_MUTEX_DEFAULT, m->pool); 68251875Speter if (rv != APR_SUCCESS) { 69251875Speter rv = apr_proc_mutex_destroy(m->proc_mutex); 70251875Speter return rv; 71251875Speter } 72251875Speter } 73251875Speter#endif /* APR_HAS_THREADS */ 74251875Speter 75251875Speter apr_pool_cleanup_register(m->pool, (void *)m, 76251875Speter global_mutex_cleanup, apr_pool_cleanup_null); 77251875Speter *mutex = m; 78251875Speter return APR_SUCCESS; 79251875Speter} 80251875Speter 81251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_child_init( 82251875Speter apr_global_mutex_t **mutex, 83251875Speter const char *fname, 84251875Speter apr_pool_t *pool) 85251875Speter{ 86251875Speter apr_status_t rv; 87251875Speter 88251875Speter rv = apr_proc_mutex_child_init(&((*mutex)->proc_mutex), fname, pool); 89251875Speter return rv; 90251875Speter} 91251875Speter 92251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_lock(apr_global_mutex_t *mutex) 93251875Speter{ 94251875Speter apr_status_t rv; 95251875Speter 96251875Speter#if APR_HAS_THREADS 97251875Speter if (mutex->thread_mutex) { 98251875Speter rv = apr_thread_mutex_lock(mutex->thread_mutex); 99251875Speter if (rv != APR_SUCCESS) { 100251875Speter return rv; 101251875Speter } 102251875Speter } 103251875Speter#endif /* APR_HAS_THREADS */ 104251875Speter 105251875Speter rv = apr_proc_mutex_lock(mutex->proc_mutex); 106251875Speter 107251875Speter#if APR_HAS_THREADS 108251875Speter if (rv != APR_SUCCESS) { 109251875Speter if (mutex->thread_mutex) { 110251875Speter (void)apr_thread_mutex_unlock(mutex->thread_mutex); 111251875Speter } 112251875Speter } 113251875Speter#endif /* APR_HAS_THREADS */ 114251875Speter 115251875Speter return rv; 116251875Speter} 117251875Speter 118251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_trylock(apr_global_mutex_t *mutex) 119251875Speter{ 120251875Speter apr_status_t rv; 121251875Speter 122251875Speter#if APR_HAS_THREADS 123251875Speter if (mutex->thread_mutex) { 124251875Speter rv = apr_thread_mutex_trylock(mutex->thread_mutex); 125251875Speter if (rv != APR_SUCCESS) { 126251875Speter return rv; 127251875Speter } 128251875Speter } 129251875Speter#endif /* APR_HAS_THREADS */ 130251875Speter 131251875Speter rv = apr_proc_mutex_trylock(mutex->proc_mutex); 132251875Speter 133251875Speter#if APR_HAS_THREADS 134251875Speter if (rv != APR_SUCCESS) { 135251875Speter if (mutex->thread_mutex) { 136251875Speter (void)apr_thread_mutex_unlock(mutex->thread_mutex); 137251875Speter } 138251875Speter } 139251875Speter#endif /* APR_HAS_THREADS */ 140251875Speter 141251875Speter return rv; 142251875Speter} 143251875Speter 144251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_unlock(apr_global_mutex_t *mutex) 145251875Speter{ 146251875Speter apr_status_t rv; 147251875Speter 148251875Speter rv = apr_proc_mutex_unlock(mutex->proc_mutex); 149251875Speter#if APR_HAS_THREADS 150251875Speter if (mutex->thread_mutex) { 151251875Speter if (rv != APR_SUCCESS) { 152251875Speter (void)apr_thread_mutex_unlock(mutex->thread_mutex); 153251875Speter } 154251875Speter else { 155251875Speter rv = apr_thread_mutex_unlock(mutex->thread_mutex); 156251875Speter } 157251875Speter } 158251875Speter#endif /* APR_HAS_THREADS */ 159251875Speter return rv; 160251875Speter} 161251875Speter 162251875SpeterAPR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, 163251875Speter apr_global_mutex_t *pmutex) 164251875Speter{ 165251875Speter ospmutex->pool = pmutex->pool; 166251875Speter ospmutex->proc_mutex = pmutex->proc_mutex; 167251875Speter#if APR_HAS_THREADS 168251875Speter ospmutex->thread_mutex = pmutex->thread_mutex; 169251875Speter#endif 170251875Speter return APR_SUCCESS; 171251875Speter} 172251875Speter 173251875SpeterAPR_DECLARE(apr_status_t) apr_global_mutex_destroy(apr_global_mutex_t *mutex) 174251875Speter{ 175251875Speter return apr_pool_cleanup_run(mutex->pool, mutex, global_mutex_cleanup); 176251875Speter} 177251875Speter 178251875SpeterAPR_DECLARE(const char *) apr_global_mutex_lockfile(apr_global_mutex_t *mutex) 179251875Speter{ 180251875Speter return apr_proc_mutex_lockfile(mutex->proc_mutex); 181251875Speter} 182251875Speter 183251875SpeterAPR_DECLARE(const char *) apr_global_mutex_name(apr_global_mutex_t *mutex) 184251875Speter{ 185251875Speter return apr_proc_mutex_name(mutex->proc_mutex); 186251875Speter} 187251875Speter 188251875SpeterAPR_POOL_IMPLEMENT_ACCESSOR(global_mutex) 189