|
Packit Service |
f9aed3 |
/*
|
|
Packit Service |
f9aed3 |
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
Packit Service |
f9aed3 |
* contributor license agreements. See the NOTICE file distributed with
|
|
Packit Service |
f9aed3 |
* this work for additional information regarding copyright ownership.
|
|
Packit Service |
f9aed3 |
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
Packit Service |
f9aed3 |
* (the "License"); you may not use this file except in compliance with
|
|
Packit Service |
f9aed3 |
* the License. You may obtain a copy of the License at
|
|
Packit Service |
f9aed3 |
*
|
|
Packit Service |
f9aed3 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit Service |
f9aed3 |
*
|
|
Packit Service |
f9aed3 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit Service |
f9aed3 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit Service |
f9aed3 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit Service |
f9aed3 |
* See the License for the specific language governing permissions and
|
|
Packit Service |
f9aed3 |
* limitations under the License.
|
|
Packit Service |
f9aed3 |
*/
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#include <stdio.h>
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#include "apr_global_mutex.h"
|
|
Packit Service |
f9aed3 |
#include "httpd.h"
|
|
Packit Service |
f9aed3 |
#include "ap_mmn.h"
|
|
Packit Service |
f9aed3 |
#include "http_log.h"
|
|
Packit Service |
f9aed3 |
#include "fcgid_mutex.h"
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#if AP_MODULE_MAGIC_AT_LEAST(20100504,0)
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#include "util_mutex.h"
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t fcgid_mutex_register(const char *mutex_type,
|
|
Packit Service |
f9aed3 |
apr_pool_t *pconf)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return ap_mutex_register(pconf, mutex_type, NULL, APR_LOCK_DEFAULT, 0);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t fcgid_mutex_create(apr_global_mutex_t **mutex,
|
|
Packit Service |
f9aed3 |
const char **lockfile,
|
|
Packit Service |
f9aed3 |
const char *mutex_type,
|
|
Packit Service |
f9aed3 |
apr_pool_t *pconf,
|
|
Packit Service |
f9aed3 |
server_rec *main_server)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
rv = ap_global_mutex_create(mutex, lockfile, mutex_type, NULL, main_server,
|
|
Packit Service |
f9aed3 |
pconf, 0);
|
|
Packit Service |
f9aed3 |
if (rv != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
return rv;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#else
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
/* no support for Mutex directive and related APIs */
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#include "ap_mpm.h"
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#if MODULE_MAGIC_NUMBER_MAJOR < 20051115
|
|
Packit Service |
f9aed3 |
#ifndef AP_NEED_SET_MUTEX_PERMS
|
|
Packit Service |
f9aed3 |
#define AP_NEED_SET_MUTEX_PERMS 1
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#if AP_NEED_SET_MUTEX_PERMS
|
|
Packit Service |
f9aed3 |
#include "unixd.h"
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#if MODULE_MAGIC_NUMBER_MAJOR < 20081201
|
|
Packit Service |
f9aed3 |
#define ap_unixd_set_global_mutex_perms unixd_set_global_mutex_perms
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t fcgid_mutex_register(const char *mutex_type,
|
|
Packit Service |
f9aed3 |
apr_pool_t *pconf)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
static apr_lockmech_e pick_mutex_mechanism(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
apr_lockmech_e mechanism = APR_LOCK_DEFAULT;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#if defined(SOLARIS2) && APR_USE_FCNTL_SERIALIZE
|
|
Packit Service |
f9aed3 |
/* default is fcntl(), which isn't thread-aware on Solaris; fcgid will
|
|
Packit Service |
f9aed3 |
* exit with EDEADLK errors if it is used with a threaded MPM
|
|
Packit Service |
f9aed3 |
*/
|
|
Packit Service |
f9aed3 |
int threaded;
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
rv = ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded);
|
|
Packit Service |
f9aed3 |
if (rv == APR_SUCCESS && threaded) {
|
|
Packit Service |
f9aed3 |
#if APR_HAS_PROC_PTHREAD_SERIALIZE
|
|
Packit Service |
f9aed3 |
mechanism = APR_LOCK_PROC_PTHREAD;
|
|
Packit Service |
f9aed3 |
#elif APR_HAS_SYSVSEM_SERIALIZE
|
|
Packit Service |
f9aed3 |
mechanism = APR_LOCK_SYSVSEM;
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
return mechanism;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t fcgid_mutex_create(apr_global_mutex_t **mutex,
|
|
Packit Service |
f9aed3 |
const char **lockfilep,
|
|
Packit Service |
f9aed3 |
const char *mutex_type,
|
|
Packit Service |
f9aed3 |
apr_pool_t *pconf,
|
|
Packit Service |
f9aed3 |
server_rec *s)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
apr_lockmech_e mechanism = pick_mutex_mechanism();
|
|
Packit Service |
f9aed3 |
char *lockfile;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
/* XXX This lock file name generation is unfortunate, but defaulting
|
|
Packit Service |
f9aed3 |
* to a better place would require a directive to override it. This
|
|
Packit Service |
f9aed3 |
* is resolved for httpd 2.3+ by hooking into the Mutex support.
|
|
Packit Service |
f9aed3 |
*/
|
|
Packit Service |
f9aed3 |
lockfile = apr_palloc(pconf, L_tmpnam);
|
|
Packit Service |
f9aed3 |
tmpnam(lockfile);
|
|
Packit Service |
f9aed3 |
rv = apr_global_mutex_create(mutex, lockfile, mechanism, pconf);
|
|
Packit Service |
f9aed3 |
if (rv != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: Can't create global %s mutex", mutex_type);
|
|
Packit Service |
f9aed3 |
return rv;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#ifdef AP_NEED_SET_MUTEX_PERMS
|
|
Packit Service |
f9aed3 |
rv = ap_unixd_set_global_mutex_perms(*mutex);
|
|
Packit Service |
f9aed3 |
if (rv != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: Can't set global %s mutex perms", mutex_type);
|
|
Packit Service |
f9aed3 |
return rv;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
#endif
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
*lockfilep = lockfile;
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
#endif
|