From: Stefan Fritsch Date: Wed, 30 Jun 2010 22:34:05 +0000 (+0000) Subject: re-order many struct members for better alignment on 64bit X-Git-Tag: 2.3.7~109 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed451e94d1edccf3ddb4d19c4c29fd7423eb03be;p=apache re-order many struct members for better alignment on 64bit git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@959464 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/ap_mmn.h b/include/ap_mmn.h index eb897b5544..e17c016867 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -232,6 +232,7 @@ * 20100609.2 (2.3.7-dev) Add deferred write pool to core_output_filter_ctx * 20100625.0 (2.3.7-dev) Add 'userctx' to socache iterator callback prototype * 20100630.0 (2.3.7-dev) make module_levels vector of char instead of int + * 20100701.0 (2.3.7-dev) re-order struct members to improve alignment */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ diff --git a/include/http_config.h b/include/http_config.h index 636f728080..63dd52441b 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -276,6 +276,8 @@ struct cmd_parms_struct { void *info; /** Which allow-override bits are set */ int override; + /** Which allow-override-opts bits are set */ + int override_opts; /** Which methods are <Limit>ed */ apr_int64_t limited; /** methods which are limited */ @@ -310,8 +312,6 @@ struct cmd_parms_struct { /** directive with syntax error */ const ap_directive_t *err_directive; - /** Which allow-override-opts bits are set */ - int override_opts; }; /** diff --git a/include/http_core.h b/include/http_core.h index 0127fe6d11..ed334ba503 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -333,6 +333,13 @@ typedef struct { */ void **notes; + /** Custom response strings registered via ap_custom_response(), + * or NULL; check per-dir config if nothing found here + */ + char **response_code_strings; /* from ap_custom_response(), not from + * ErrorDocument + */ + /** There is a script processor installed on the output filter chain, * so it needs the default_handler to deliver a (script) file into * the chain so it can process it. Normally, default_handler only @@ -343,12 +350,6 @@ typedef struct { */ int deliver_script; - /** Custom response strings registered via ap_custom_response(), - * or NULL; check per-dir config if nothing found here - */ - char **response_code_strings; /* from ap_custom_response(), not from - * ErrorDocument - */ /** Should addition of charset= be suppressed for this request? */ int suppress_charset; diff --git a/include/httpd.h b/include/httpd.h index 8dc7af8ef4..492755c28f 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -743,12 +743,12 @@ struct process_rec { apr_pool_t *pool; /** Configuration pool. Cleared upon restart */ apr_pool_t *pconf; - /** Number of command line arguments passed to the program */ - int argc; - /** The command line arguments */ - const char * const *argv; /** The program name used to execute the program */ const char *short_name; + /** The command line arguments */ + const char * const *argv; + /** Number of command line arguments passed to the program */ + int argc; }; /** @@ -785,10 +785,10 @@ struct request_rec { int proxyreq; /** HEAD request, as opposed to GET */ int header_only; - /** Protocol string, as given to us, or HTTP/0.9 */ - char *protocol; /** Protocol version number of protocol; 1.1 = 1001 */ int proto_num; + /** Protocol string, as given to us, or HTTP/0.9 */ + char *protocol; /** Host, as set by full URI or Host: */ const char *hostname; @@ -804,10 +804,10 @@ struct request_rec { * look, but don't touch. */ - /** Request method (eg. GET, HEAD, POST, etc.) */ - const char *method; /** M_GET, M_POST, etc. */ int method_number; + /** Request method (eg. GET, HEAD, POST, etc.) */ + const char *method; /** * 'allowed' is a bitvector of the allowed methods. @@ -844,17 +844,13 @@ struct request_rec { /* HTTP/1.1 connection-level features */ - /** sending chunked transfer-coding */ - int chunked; /** The Range: header */ const char *range; /** The "real" content length */ apr_off_t clength; + /** sending chunked transfer-coding */ + int chunked; - /** Remaining bytes left to read from the request body */ - apr_off_t remaining; - /** Number of bytes that have been read from the request body */ - apr_off_t read_length; /** Method for reading the request body * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY, * REQUEST_CHUNKED_DECHUNK, etc...) */ @@ -863,6 +859,16 @@ struct request_rec { int read_chunked; /** is client waiting for a 100 response? */ unsigned expecting_100; + /** The optional kept body of the request. */ + apr_bucket_brigade *kept_body; + /** For ap_body_to_table(): parsed body */ + /* XXX: ap_body_to_table has been removed. Remove body_table too or + * XXX: keep it to reintroduce ap_body_to_table without major bump? */ + apr_table_t *body_table; + /** Remaining bytes left to read from the request body */ + apr_off_t remaining; + /** Number of bytes that have been read from the request body */ + apr_off_t read_length; /* MIME header environments, in and out. Also, an array containing * environment variables to be passed to subprocesses, so people can @@ -910,11 +916,6 @@ struct request_rec { /** If an authentication check was made, this gets set to the auth type. */ char *ap_auth_type; - /** This response can not be cached */ - int no_cache; - /** There is no local copy of this response */ - int no_local_copy; - /* What object is being requested (either directly, or via include * or content-negotiation mapping). */ @@ -932,10 +933,6 @@ struct request_rec { char *path_info; /** The QUERY_ARGS extracted from this request */ char *args; - /** finfo.protection (st_mode) set to zero if no such file */ - apr_finfo_t finfo; - /** A struct containing the components of URI */ - apr_uri_t parsed_uri; /** * Flag for the handler to accept or reject path_info on @@ -947,6 +944,9 @@ struct request_rec { */ int used_path_info; + /** A flag to determine if the eos bucket has been sent yet */ + int eos_sent; + /* Various other config info which may change with .htaccess files * These are config vectors, with one void* pointer for each module * (the thing pointed to being the module's business). @@ -957,6 +957,11 @@ struct request_rec { /** Notes on *this* request */ struct ap_conf_vector_t *request_config; + /** Optional request log level configuration. Will usually point + * to a server or per_dir config, i.e. must be copied before + * modifying */ + const struct ap_logconf *log; + /** * A linked list of the .htaccess configuration directives * accessed by this request. @@ -977,26 +982,20 @@ struct request_rec { * request */ struct ap_filter_t *proto_input_filters; - /** Optional request log level configuration. Will usually point - * to a server or per_dir config, i.e. must be copied before - * modifying */ - const struct ap_logconf *log; - - /** A flag to determine if the eos bucket has been sent yet */ - int eos_sent; - - /** The optional kept body of the request. */ - apr_bucket_brigade *kept_body; + /** This response can not be cached */ + int no_cache; + /** There is no local copy of this response */ + int no_local_copy; + /** Mutex protect callbacks registered with ap_mpm_register_timed_callback + * from being run before the original handler finishes running + */ apr_thread_mutex_t *invoke_mtx; - apr_table_t *body_table; - -/* Things placed at the end of the record to avoid breaking binary - * compatibility. It would be nice to remember to reorder the entire - * record to improve 64bit alignment the next time we need to break - * binary compatibility for some other reason. - */ + /** A struct containing the components of URI */ + apr_uri_t parsed_uri; + /** finfo.protection (st_mode) set to zero if no such file */ + apr_finfo_t finfo; }; /** @@ -1052,19 +1051,6 @@ struct conn_rec { * get_remote_logname() */ char *remote_logname; - /** Are we still talking? */ - unsigned aborted:1; - - /** Are we going to keep the connection alive for another request? - * @see ap_conn_keepalive_e */ - ap_conn_keepalive_e keepalive; - - /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, - * 1 yes/success */ - signed int double_reverse:2; - - /** How many times have we used it? */ - int keepalives; /** server IP address */ char *local_ip; /** used for ap_get_server_name when UseCanonicalName is set to DNS @@ -1097,8 +1083,22 @@ struct conn_rec { /** Are there any filters that clogg/buffer the input stream, breaking * the event mpm. */ - int clogging_input_filters; + unsigned int clogging_input_filters:1; + /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, + * 1 yes/success */ + signed int double_reverse:2; + + /** Are we still talking? */ + unsigned aborted; + + /** Are we going to keep the connection alive for another request? + * @see ap_conn_keepalive_e */ + ap_conn_keepalive_e keepalive; + + /** How many times have we used it? */ + int keepalives; + /** Optional connection log level configuration. May point to a server or * per_dir config, i.e. must be copied before modifying */ const struct ap_logconf *log; @@ -1133,8 +1133,6 @@ struct conn_state_t { APR_RING_ENTRY(conn_state_t) timeout_list; /** the expiration time of the next keepalive timeout */ apr_time_t expiration_time; - /** Current state of the connection */ - conn_state_e state; /** connection record this struct refers to */ conn_rec *c; /** memory pool to allocate from */ @@ -1143,6 +1141,8 @@ struct conn_state_t { apr_bucket_alloc_t *bucket_alloc; /** poll file decriptor information */ apr_pollfd_t pfd; + /** Current state of the connection */ + conn_state_e state; }; /* Per-vhost config... */ @@ -1162,12 +1162,12 @@ typedef struct server_addr_rec server_addr_rec; struct server_addr_rec { /** The next server in the list */ server_addr_rec *next; + /** The name given in "" */ + char *virthost; /** The bound address, for this server */ apr_sockaddr_t *host_addr; /** The bound port, for this server */ apr_port_t host_port; - /** The name given in "" */ - char *virthost; }; struct ap_logconf { @@ -1186,20 +1186,6 @@ struct server_rec { /** The next server in the list */ server_rec *next; - /** The name of the server */ - const char *defn_name; - /** The line of the config file that the server was defined on */ - unsigned defn_line_number; - - /* Contact information */ - - /** The admin's contact information */ - char *server_admin; - /** The server hostname */ - char *server_hostname; - /** for redirects, etc. */ - apr_port_t port; - /* Log files --- note that transfer log is now in the modules... */ /** The name of the error log */ @@ -1211,14 +1197,34 @@ struct server_rec { /* Module-specific configuration for server, and defaults... */ - /** true if this is the virtual server */ - int is_virtual; /** Config vector containing pointers to modules' per-server config * structures. */ struct ap_conf_vector_t *module_config; /** MIME type info, etc., before we start checking per-directory info */ struct ap_conf_vector_t *lookup_defaults; + /** The name of the server */ + const char *defn_name; + /** The line of the config file that the server was defined on */ + unsigned defn_line_number; + /** true if this is the virtual server */ + char is_virtual; + + + /* Information for redirects */ + + /** for redirects, etc. */ + apr_port_t port; + /** The server request scheme for redirect responses */ + const char *server_scheme; + + /* Contact information */ + + /** The admin's contact information */ + char *server_admin; + /** The server hostname */ + char *server_hostname; + /* Transaction handling */ /** I haven't got a clue */ @@ -1232,16 +1238,16 @@ struct server_rec { /** Use persistent connections? */ int keep_alive; - /** Pathname for ServerPath */ - const char *path; - /** Length of path */ - int pathlen; - /** Normal names for ServerAlias servers */ apr_array_header_t *names; /** Wildcarded names for ServerAlias servers */ apr_array_header_t *wild_names; + /** Pathname for ServerPath */ + const char *path; + /** Length of path */ + int pathlen; + /** limit on size of the HTTP request line */ int limit_req_line; /** limit on size of any request header field */ @@ -1249,8 +1255,6 @@ struct server_rec { /** limit on number of request header fields */ int limit_req_fields; - /** The server request scheme for redirect responses */ - const char *server_scheme; /** Opaque storage location */ void *context; @@ -1258,10 +1262,10 @@ struct server_rec { typedef struct core_output_filter_ctx { apr_bucket_brigade *buffered_bb; - apr_size_t bytes_in; - apr_size_t bytes_written; apr_bucket_brigade *tmp_flush_bb; apr_pool_t *deferred_write_pool; + apr_size_t bytes_in; + apr_size_t bytes_written; } core_output_filter_ctx_t; typedef struct core_filter_ctx { diff --git a/include/scoreboard.h b/include/scoreboard.h index 989027e37d..62108a683f 100644 --- a/include/scoreboard.h +++ b/include/scoreboard.h @@ -89,10 +89,10 @@ typedef enum { /* stuff which is worker specific */ typedef struct worker_score worker_score; struct worker_score { - int thread_num; #if APR_HAS_THREADS apr_os_thread_t tid; #endif + int thread_num; /* With some MPMs (e.g., worker), a worker_score can represent * a thread in a terminating process which is no longer * represented by the corresponding process_score. These MPMs @@ -101,18 +101,18 @@ struct worker_score { pid_t pid; ap_generation_t generation; unsigned char status; + unsigned short conn_count; + apr_off_t conn_bytes; unsigned long access_count; apr_off_t bytes_served; unsigned long my_access_count; apr_off_t my_bytes_served; - apr_off_t conn_bytes; - unsigned short conn_count; apr_time_t start_time; apr_time_t stop_time; + apr_time_t last_used; #ifdef HAVE_TIMES struct tms times; #endif - apr_time_t last_used; char client[32]; /* Keep 'em small... */ char request[64]; /* We just want an idea... */ char vhost[32]; /* What virtual host is being accessed? */ diff --git a/include/util_filter.h b/include/util_filter.h index 4467436a15..89bbcd25e8 100644 --- a/include/util_filter.h +++ b/include/util_filter.h @@ -227,6 +227,12 @@ struct ap_filter_rec_t { */ ap_init_filter_func filter_init_func; + /** The next filter_rec in the list */ + struct ap_filter_rec_t *next; + + /** Providers for this filter */ + ap_filter_provider_t *providers; + /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION. * An AP_FTYPE_CONTENT filter modifies the data based on information * found in the content. An AP_FTYPE_CONNECTION filter modifies the @@ -234,12 +240,6 @@ struct ap_filter_rec_t { */ ap_filter_type ftype; - /** The next filter_rec in the list */ - struct ap_filter_rec_t *next; - - /** Providers for this filter */ - ap_filter_provider_t *providers; - /** Trace level for this filter */ int debug; diff --git a/include/util_ldap.h b/include/util_ldap.h index 0a90ff650d..e6ff6a911c 100644 --- a/include/util_ldap.h +++ b/include/util_ldap.h @@ -100,7 +100,6 @@ typedef struct util_ldap_connection_t { #if APR_HAS_THREADS apr_thread_mutex_t *lock; /* Lock to indicate this connection is in use */ #endif - int bound; /* Flag to indicate whether this connection is bound yet */ const char *host; /* Name of the LDAP server (or space separated list) */ int port; /* Port of the LDAP server */ @@ -109,6 +108,8 @@ typedef struct util_ldap_connection_t { const char *binddn; /* DN to bind to server (can be NULL) */ const char *bindpw; /* Password to bind to server (can be NULL) */ + int bound; /* Flag to indicate whether this connection is bound yet */ + int secure; /* SSL/TLS mode of the connection */ apr_array_header_t *client_certs; /* Client certificates on this connection */ @@ -144,10 +145,11 @@ typedef struct util_ldap_state_t { long compare_cache_size; /* Size (in entries) of compare cache */ struct util_ldap_connection_t *connections; - int ssl_supported; apr_array_header_t *global_certs; /* Global CA certificates */ + int ssl_supported; int secure; int secure_set; + int verify_svr_cert; #if APR_HAS_SHARED_MEMORY apr_shm_t *cache_shm; @@ -156,11 +158,12 @@ typedef struct util_ldap_state_t { /* cache ald */ void *util_ldap_cache; + long connectionTimeout; - int verify_svr_cert; - int debug_level; /* SDK debug level */ struct timeval *opTimeout; + int debug_level; /* SDK debug level */ + } util_ldap_state_t; /* Used to store arrays of attribute labels/values. */ diff --git a/modules/aaa/mod_auth_digest.c b/modules/aaa/mod_auth_digest.c index 73aeb39f19..e69f0795a5 100644 --- a/modules/aaa/mod_auth_digest.c +++ b/modules/aaa/mod_auth_digest.c @@ -154,10 +154,10 @@ typedef struct digest_header_struct { const char *message_qop; const char *nonce_count; /* the following fields are not (directly) from the header */ - apr_time_t nonce_time; - enum hdr_sts auth_hdr_sts; const char *raw_request_uri; apr_uri_t *psd_request_uri; + apr_time_t nonce_time; + enum hdr_sts auth_hdr_sts; int needed_auth; client_entry *client; } digest_header_rec; diff --git a/modules/cache/mod_cache.h b/modules/cache/mod_cache.h index c1d402cf5d..0dedfc48a4 100644 --- a/modules/cache/mod_cache.h +++ b/modules/cache/mod_cache.h @@ -130,8 +130,8 @@ typedef struct { apr_time_t maxex; int maxex_set; /* default time to keep cached file in msecs */ - apr_time_t defex; int defex_set; + apr_time_t defex; /* factor for estimating expires date */ double factor; int factor_set; @@ -147,31 +147,31 @@ typedef struct { /** ignore Cache-Control: no-store header from client or server */ int store_nostore; int store_nostore_set; - /** store the headers that should not be stored in the cache */ - apr_array_header_t *ignore_headers; /* flag if CacheIgnoreHeader has been set */ #define CACHE_IGNORE_HEADERS_SET 1 #define CACHE_IGNORE_HEADERS_UNSET 0 int ignore_headers_set; + /** store the headers that should not be stored in the cache */ + apr_array_header_t *ignore_headers; /* Minimum time to keep cached files in msecs */ apr_time_t minex; int minex_set; /** ignore query-string when caching */ int ignorequerystring; int ignorequerystring_set; - /** store the identifiers that should not be used for key calculation */ - apr_array_header_t *ignore_session_id; /* flag if CacheIgnoreURLSessionIdentifiers has been set */ #define CACHE_IGNORE_SESSION_ID_SET 1 #define CACHE_IGNORE_SESSION_ID_UNSET 0 int ignore_session_id_set; + /** store the identifiers that should not be used for key calculation */ + apr_array_header_t *ignore_session_id; /* thundering herd lock */ int lock; int lock_set; const char *lockpath; int lockpath_set; - apr_time_t lockmaxage; int lockmaxage_set; + apr_time_t lockmaxage; /** run within the quick handler */ int quick; int quick_set; @@ -180,11 +180,6 @@ typedef struct { /* cache info information */ typedef struct cache_info cache_info; struct cache_info { - /** - * HTTP status code of the cached entity. Though not necessarily the - * status code finally issued to the request. - */ - int status; /** * the original time corresponding to the 'Date:' header of the request * served @@ -196,6 +191,11 @@ struct cache_info { apr_time_t request_time; /** apr_time_now() at the time the entity was acutally cached */ apr_time_t response_time; + /** + * HTTP status code of the cached entity. Though not necessarily the + * status code finally issued to the request. + */ + int status; }; /* cache handle information */ diff --git a/modules/dav/main/mod_dav.h b/modules/dav/main/mod_dav.h index 82c3539ce3..f16e65e72c 100644 --- a/modules/dav/main/mod_dav.h +++ b/modules/dav/main/mod_dav.h @@ -1570,20 +1570,20 @@ typedef struct dav_prop_ctx { dav_propdb *propdb; + apr_xml_elem *prop; /* property to affect */ + int operation; #define DAV_PROP_OP_SET 1 /* set a property value */ #define DAV_PROP_OP_DELETE 2 /* delete a prop value */ /* ### add a GET? */ - apr_xml_elem *prop; /* property to affect */ - - dav_error *err; /* error (if any) */ - /* private items to the propdb */ int is_liveprop; void *liveprop_ctx; struct dav_rollback_item *rollback; /* optional rollback info */ + dav_error *err; /* error (if any) */ + /* private to mod_dav.c */ request_rec *r; diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index f8fc416430..22fd7402f4 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -92,9 +92,9 @@ struct proxy_remote { const char *scheme; /* the schemes handled by this proxy, or '*' */ const char *protocol; /* the scheme used to talk to this proxy */ const char *hostname; /* the hostname of this proxy */ - apr_port_t port; /* the port for this proxy */ - ap_regex_t *regexp; /* compiled regex (if any) for the remote */ + ap_regex_t *regexp; /* compiled regex (if any) for the remote */ int use_regex; /* simple boolean. True if we have a regex pattern */ + apr_port_t port; /* the port for this proxy */ }; #define PROXYPASS_NOCANON 0x01 @@ -134,21 +134,18 @@ typedef struct { proxy_worker *forward; /* forward proxy worker */ proxy_worker *reverse; /* reverse "module-driven" proxy worker */ const char *domain; /* domain name to use in absence of a domain name in the request */ + apr_pool_t *pool; /* Pool used for allocating this struct */ int req; /* true if proxy requests are enabled */ - char req_set; enum { via_off, via_on, via_block, via_full } viaopt; /* how to deal with proxy Via: headers */ - char viaopt_set; apr_size_t recv_buffer_size; - char recv_buffer_size_set; apr_size_t io_buffer_size; - char io_buffer_size_set; long maxfwd; - char maxfwd_set; + apr_interval_time_t timeout; /** * the following setting masks the error page * returned from the 'proxied server' and just @@ -158,32 +155,31 @@ typedef struct { * returned from the rest of the system */ int error_override; - int error_override_set; - apr_interval_time_t timeout; - char timeout_set; enum { bad_error, bad_ignore, bad_body } badopt; /* how to deal with bad headers */ - char badopt_set; -/* putting new stuff on the end maximises binary back-compatibility. - * the strmatch_patterns are really a const just to have a - * case-independent strstr. - */ enum { status_off, status_on, status_full } proxy_status; /* Status display options */ + + char req_set; + char viaopt_set; + char recv_buffer_size_set; + char io_buffer_size_set; + char maxfwd_set; + char timeout_set; + char error_override_set; + char badopt_set; char proxy_status_set; - apr_pool_t *pool; /* Pool used for allocating this struct */ } proxy_server_conf; typedef struct { const char *p; /* The path */ - int p_is_fnmatch; /* Is this path an fnmatch candidate? */ ap_regex_t *r; /* Is this a regex? */ /* ProxyPassReverse and friends are documented as working inside @@ -198,9 +194,11 @@ typedef struct { apr_array_header_t* cookie_domains; const apr_strmatch_pattern* cookie_path_str; const apr_strmatch_pattern* cookie_domain_str; - int interpolate_env; - int preserve_host; - int preserve_host_set; + + signed char p_is_fnmatch; /* Is the path an fnmatch candidate? */ + signed char interpolate_env; + signed char preserve_host; + signed char preserve_host_set; } proxy_dir_conf; /* if we interpolate env vars per-request, we'll need a per-request @@ -214,25 +212,25 @@ typedef struct { typedef struct { conn_rec *connection; - const char *hostname; - apr_port_t port; - int is_ssl; + request_rec *r; /* Request record of the frontend request + * which the backend currently answers. */ + proxy_worker *worker; /* Connection pool this connection belongs to */ apr_pool_t *pool; /* Subpool for hostname and addr data */ - apr_socket_t *sock; /* Connection socket */ + const char *hostname; apr_sockaddr_t *addr; /* Preparsed remote address info */ - apr_uint32_t flags; /* Connection flags */ - int close; /* Close 'this' connection */ - proxy_worker *worker; /* Connection pool this connection belongs to */ + apr_pool_t *scpool; /* Subpool used for socket and connection data */ + apr_socket_t *sock; /* Connection socket */ void *data; /* per scheme connection data */ + void *forward; /* opaque forward proxy data */ + apr_uint32_t flags; /* Connection flags */ + apr_port_t port; + char is_ssl; + char close; /* Close 'this' connection */ + char need_flush;/* Flag to decide whether we need to flush the + * filter chain or not */ #if APR_HAS_THREADS - int inreslist; /* connection in apr_reslist? */ + char inreslist; /* connection in apr_reslist? */ #endif - apr_pool_t *scpool; /* Subpool used for socket and connection data */ - request_rec *r; /* Request record of the frontend request - * which the backend currently answers. */ - int need_flush;/* Flag to decide whether we need to flush the - * filter chain or not */ - void *forward; /* opaque forward proxy data */ } proxy_conn_rec; typedef struct { @@ -279,8 +277,8 @@ PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR ) /* Runtime worker status informations. Shared in scoreboard */ typedef struct { - int status; apr_time_t error_time; /* time of the last error */ + int status; int retries; /* number of retries on this worker */ int lbstatus; /* Current lbstatus */ int lbfactor; /* dynamic lbfactor */ @@ -296,38 +294,34 @@ typedef struct { /* Worker configuration */ struct proxy_worker { - int id; /* scoreboard id */ - apr_interval_time_t retry; /* retry interval */ - int lbfactor; /* initial load balancing factor */ const char *name; const char *scheme; /* scheme to use ajp|http|https */ const char *hostname; /* remote backend address */ const char *route; /* balancing route */ const char *redirect; /* temporary balancing redirection route */ + int id; /* scoreboard id */ int status; /* temporary worker status */ - apr_port_t port; + int lbfactor; /* initial load balancing factor */ + int lbset; /* load balancer cluster set */ int min; /* Desired minimum number of available connections */ int smax; /* Soft maximum on the total number of connections */ int hmax; /* Hard maximum on the total number of connections */ apr_interval_time_t ttl; /* maximum amount of time in seconds a connection * may be available while exceeding the soft limit */ + apr_interval_time_t retry; /* retry interval */ apr_interval_time_t timeout; /* connection timeout */ - char timeout_set; apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */ - char acquire_set; + apr_interval_time_t ping_timeout; + apr_interval_time_t conn_timeout; apr_size_t recv_buffer_size; - char recv_buffer_size_set; apr_size_t io_buffer_size; - char io_buffer_size_set; + apr_port_t port; char keepalive; - char keepalive_set; + char disablereuse; + int is_address_reusable; proxy_conn_pool *cp; /* Connection pool to use */ proxy_worker_stat *s; /* Shared data */ void *opaque; /* per scheme worker data */ - int is_address_reusable; -#if APR_HAS_THREADS - apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */ -#endif void *context; /* general purpose storage */ enum { flush_off, @@ -335,15 +329,20 @@ struct proxy_worker { flush_auto } flush_packets; /* control AJP flushing */ int flush_wait; /* poll wait time in microseconds if flush_auto */ - apr_interval_time_t ping_timeout; - char ping_timeout_set; - int lbset; /* load balancer cluster set */ + const char *flusher; /* flush provider used by mod_proxy_fdpass */ +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */ +#endif + char retry_set; - char disablereuse; - char disablereuse_set; - apr_interval_time_t conn_timeout; + char timeout_set; + char acquire_set; + char ping_timeout_set; char conn_timeout_set; - const char *flusher; /* flush provider used by mod_proxy_fdpass */ + char recv_buffer_size_set; + char io_buffer_size_set; + char keepalive_set; + char disablereuse_set; }; /* @@ -355,13 +354,18 @@ struct proxy_worker { struct proxy_balancer { apr_array_header_t *workers; /* array of proxy_workers */ const char *name; /* name of the load balancer */ - const char *sticky; /* sticky session identifier */ - int sticky_force; /* Disable failover for sticky sessions */ apr_interval_time_t timeout; /* Timeout for waiting on free connection */ - int max_attempts; /* Number of attempts before failing */ - char max_attempts_set; proxy_balancer_method *lbmethod; + const char *sticky_path; /* URL sticky session identifier */ + apr_array_header_t *errstatuses; /* statuses to force members into error */ + const char *sticky; /* sticky session identifier */ + int sticky_force; /* Disable failover for sticky sessions */ + int scolonsep; /* true if ';' seps sticky session paths */ + + int max_attempts; /* Number of attempts before failing */ + char max_attempts_set; + /* XXX: Perhaps we will need the proc mutex too. * Altrough we are only using arithmetic operations * it may lead to a incorrect calculations. @@ -370,10 +374,7 @@ struct proxy_balancer { #if APR_HAS_THREADS apr_thread_mutex_t *mutex; /* Thread lock for updating lb params */ #endif - void *context; /* general purpose storage */ - const char *sticky_path; /* URL sticky session identifier */ - int scolonsep; /* true if ';' seps sticky session paths */ - apr_array_header_t *errstatuses; /* statuses to force members into error */ + void *context; /* general purpose storage */ }; struct proxy_balancer_method { diff --git a/server/config.c b/server/config.c index 9e609a57a5..07f8f256c8 100644 --- a/server/config.c +++ b/server/config.c @@ -1400,7 +1400,7 @@ AP_DECLARE(void) ap_set_module_loglevel(apr_pool_t *pool, struct ap_logconf *l, */ static cmd_parms default_parms = -{NULL, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +{NULL, 0, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file) {