|
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 "fcgid_proctbl.h"
|
|
Packit Service |
f9aed3 |
#include "apr_shm.h"
|
|
Packit Service |
f9aed3 |
#include "fcgid_global.h"
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
static apr_thread_mutex_t *g_sharelock = NULL;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
static fcgid_procnode *g_proc_array = NULL; /* Contain all process slot */
|
|
Packit Service |
f9aed3 |
static fcgid_procnode *g_free_list_header = NULL; /* Attach to no process list */
|
|
Packit Service |
f9aed3 |
static fcgid_procnode *g_busy_list_header = NULL; /* Attach to a working process list */
|
|
Packit Service |
f9aed3 |
static fcgid_procnode *g_idle_list_header = NULL; /* Attach to an idle process list */
|
|
Packit Service |
f9aed3 |
static fcgid_procnode *g_error_list_header = NULL; /* Attach to an error process list */
|
|
Packit Service |
f9aed3 |
static fcgid_share *_global_memory = NULL;
|
|
Packit Service |
f9aed3 |
static fcgid_global_share *g_global_share = NULL; /* global information */
|
|
Packit Service |
f9aed3 |
static size_t g_table_size = FCGID_PROC_TABLE_SIZE;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t proctable_pre_config(apr_pool_t *p, apr_pool_t *plog,
|
|
Packit Service |
f9aed3 |
apr_pool_t *ptemp)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t
|
|
Packit Service |
f9aed3 |
proctable_post_config(server_rec * main_server, apr_pool_t * pconf)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
long shmem_size = sizeof(fcgid_share);
|
|
Packit Service |
f9aed3 |
fcgid_procnode *ptmpnode = NULL;
|
|
Packit Service |
f9aed3 |
int i;
|
|
Packit Service |
f9aed3 |
apr_status_t rv = APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
if ((rv = apr_thread_mutex_create(&g_sharelock,
|
|
Packit Service |
f9aed3 |
APR_THREAD_MUTEX_DEFAULT,
|
|
Packit Service |
f9aed3 |
pconf)) != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
/* Fatal error */
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, main_server,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: Can't create global mutex");
|
|
Packit Service |
f9aed3 |
exit(1);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
/* There is only one process in WinNT mpm, share memory is not necessary */
|
|
Packit Service |
f9aed3 |
_global_memory = (fcgid_share *) apr_pcalloc(pconf, shmem_size);
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
g_proc_array = _global_memory->procnode_array;
|
|
Packit Service |
f9aed3 |
g_global_share = &_global_memory->global;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
g_global_share->must_exit = 0;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
/* Init the array */
|
|
Packit Service |
f9aed3 |
g_idle_list_header = g_proc_array;
|
|
Packit Service |
f9aed3 |
g_busy_list_header = g_idle_list_header + 1;
|
|
Packit Service |
f9aed3 |
g_error_list_header = g_busy_list_header + 1;
|
|
Packit Service |
f9aed3 |
g_free_list_header = g_error_list_header + 1;
|
|
Packit Service |
f9aed3 |
ptmpnode = g_free_list_header;
|
|
Packit Service |
f9aed3 |
for (i = 0; i < FCGID_MAX_APPLICATION; i++) {
|
|
Packit Service |
f9aed3 |
ptmpnode->next_index = ptmpnode - g_proc_array + 1;
|
|
Packit Service |
f9aed3 |
ptmpnode++;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
apr_status_t
|
|
Packit Service |
f9aed3 |
proctable_child_init(server_rec * main_server, apr_pool_t * pchild)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return APR_SUCCESS;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
static apr_status_t proctable_lock_internal(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return apr_thread_mutex_lock(g_sharelock);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
static apr_status_t proctable_unlock_internal(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return apr_thread_mutex_unlock(g_sharelock);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_procnode *proctable_get_free_list(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_free_list_header;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_procnode *proctable_get_busy_list(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_busy_list_header;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_procnode *proctable_get_idle_list(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_idle_list_header;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_procnode *proctable_get_table_array(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_proc_array;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_procnode *proctable_get_error_list(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_error_list_header;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
fcgid_global_share *proctable_get_globalshare(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_global_share;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
size_t proctable_get_table_size(void)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
return g_table_size;
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
void proctable_lock(request_rec *r)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
/* Lock error is a fatal error */
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: can't lock process table");
|
|
Packit Service |
f9aed3 |
exit(1);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
void proctable_unlock(request_rec *r)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
/* Lock error is a fatal error */
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_rerror(APLOG_MARK, APLOG_EMERG, rv, r,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: can't unlock process table");
|
|
Packit Service |
f9aed3 |
exit(1);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
void proctable_pm_lock(server_rec * s)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
/* Lock error is a fatal error */
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
if ((rv = proctable_lock_internal()) != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: can't lock process table in PM");
|
|
Packit Service |
f9aed3 |
exit(1);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
void proctable_pm_unlock(server_rec * s)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
/* Lock error is a fatal error */
|
|
Packit Service |
f9aed3 |
apr_status_t rv;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
if ((rv = proctable_unlock_internal()) != APR_SUCCESS) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: can't unlock process table in PM");
|
|
Packit Service |
f9aed3 |
exit(1);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
void proctable_print_debug_info(server_rec * main_server)
|
|
Packit Service |
f9aed3 |
{
|
|
Packit Service |
f9aed3 |
int freecount = 0;
|
|
Packit Service |
f9aed3 |
fcgid_procnode *current_node;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
for (current_node = &g_proc_array[g_free_list_header->next_index];
|
|
Packit Service |
f9aed3 |
current_node != g_proc_array;
|
|
Packit Service |
f9aed3 |
current_node = &g_proc_array[current_node->next_index])
|
|
Packit Service |
f9aed3 |
freecount++;
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_server,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: total node count: %d, free node count: %d",
|
|
Packit Service |
f9aed3 |
FCGID_MAX_APPLICATION, freecount);
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
for (current_node = &g_proc_array[g_idle_list_header->next_index];
|
|
Packit Service |
f9aed3 |
current_node != g_proc_array;
|
|
Packit Service |
f9aed3 |
current_node = &g_proc_array[current_node->next_index]) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_server,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: idle node index: %d",
|
|
Packit Service |
f9aed3 |
current_node - g_proc_array);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
for (current_node = &g_proc_array[g_busy_list_header->next_index];
|
|
Packit Service |
f9aed3 |
current_node != g_proc_array;
|
|
Packit Service |
f9aed3 |
current_node = &g_proc_array[current_node->next_index]) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_server,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: busy node index: %d",
|
|
Packit Service |
f9aed3 |
current_node - g_proc_array);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
|
|
Packit Service |
f9aed3 |
for (current_node = &g_proc_array[g_error_list_header->next_index];
|
|
Packit Service |
f9aed3 |
current_node != g_proc_array;
|
|
Packit Service |
f9aed3 |
current_node = &g_proc_array[current_node->next_index]) {
|
|
Packit Service |
f9aed3 |
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_server,
|
|
Packit Service |
f9aed3 |
"mod_fcgid: error node index: %d",
|
|
Packit Service |
f9aed3 |
current_node - g_proc_array);
|
|
Packit Service |
f9aed3 |
}
|
|
Packit Service |
f9aed3 |
}
|