/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FCGID_TABLE_H #define FCGID_TABLE_H #include #include "httpd.h" #include "apr_thread_proc.h" #include "fcgid_global.h" #include "fcgid_conf.h" /* Increase it if necessary */ #define FCGID_MAX_APPLICATION (1024) /* FCGID_MAX_APPLICATION + 4 list headers */ #define FCGID_PROC_TABLE_SIZE (FCGID_MAX_APPLICATION+4) /* nNextIndex is for making a node list, there are four kind of list: 1) free list: no process associate to this node 2) busy list: a process is associated, and it's handling request 3) idle list: a process is associated, and it's waiting request 4) error list: a process is associated, and killing the process now */ typedef struct { /* only one of next_index or node_type is used, depending on context */ int next_index; /* the next array index in the list */ int node_type; /* the type of this node, used in fcgid_status_hook() only */ apr_pool_t *proc_pool; /* pool for process */ apr_proc_t proc_id; /* the process id */ char executable_path[FCGID_PATH_MAX]; /* executable file path */ char socket_path[FCGID_PATH_MAX]; /* cgi application socket path */ apr_ino_t inode; /* cgi file inode */ apr_dev_t deviceid; /* cgi file device id */ char cmdline[FCGID_CMDLINE_MAX]; /* entire command line */ gid_t gid; /* for suEXEC */ uid_t uid; /* for suEXEC */ int vhost_id; /* the vhost to which this process belongs (the server_rec * addr fails with some mass-vhost mods which allocate * them per-request) */ apr_time_t start_time; /* the time of this process create */ apr_time_t last_active_time; /* the time this process last active */ int requests_handled; /* number of requests process has handled */ char diewhy; /* why it die */ fcgid_cmd_options cmdopts; /* context-specific configuration */ } fcgid_procnode; /* Macros for diewhy */ #define FCGID_DIE_KILLSELF 0 #define FCGID_DIE_IDLE_TIMEOUT 1 #define FCGID_DIE_LIFETIME_EXPIRED 2 #define FCGID_DIE_BUSY_TIMEOUT 3 #define FCGID_DIE_CONNECT_ERROR 4 #define FCGID_DIE_COMM_ERROR 5 #define FCGID_DIE_SHUTDOWN 6 typedef struct { int must_exit; /* All processes using this share memory must exit */ } fcgid_global_share; typedef struct { fcgid_global_share global; fcgid_procnode procnode_array[FCGID_PROC_TABLE_SIZE]; } fcgid_share; apr_status_t proctable_child_init(server_rec * main_server, apr_pool_t * pchild); apr_status_t proctable_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp); apr_status_t proctable_post_config(server_rec * main_server, apr_pool_t * pconf); fcgid_procnode *proctable_get_free_list(void); fcgid_procnode *proctable_get_busy_list(void); fcgid_procnode *proctable_get_idle_list(void); fcgid_procnode *proctable_get_error_list(void); fcgid_procnode *proctable_get_table_array(void); size_t proctable_get_table_size(void); fcgid_global_share *proctable_get_globalshare(void); void proctable_pm_lock(server_rec *s); void proctable_pm_unlock(server_rec *s); void proctable_lock(request_rec *r); void proctable_unlock(request_rec *r); /* Just for debug */ void proctable_print_debug_info(server_rec * main_server); #endif