| #ifndef MODPERL_TYPES_H |
| #define MODPERL_TYPES_H |
| |
| #ifndef MP_IOBUFSIZE |
| # ifdef AP_IOBUFSIZE |
| # define MP_IOBUFSIZE AP_IOBUFSIZE |
| # else |
| # define MP_IOBUFSIZE 8192 |
| # endif |
| #endif |
| |
| /* aliases */ |
| |
| typedef request_rec subrequest_rec; |
| typedef apr_array_header_t MpAV; |
| typedef apr_table_t MpHV; |
| typedef char char_len; /* see xs/typemap */ |
| |
| /* mod_perl structures */ |
| |
| typedef struct { |
| request_rec *r; |
| conn_rec *c; |
| server_rec *s; |
| } modperl_rcs_t; |
| |
| #ifdef USE_ITHREADS |
| |
| typedef struct modperl_list_t modperl_list_t; |
| |
| struct modperl_list_t { |
| modperl_list_t *prev, *next; |
| void *data; |
| }; |
| |
| typedef struct modperl_interp_t modperl_interp_t; |
| typedef struct modperl_interp_pool_t modperl_interp_pool_t; |
| typedef struct modperl_tipool_t modperl_tipool_t; |
| |
| struct modperl_interp_t { |
| modperl_interp_pool_t *mip; |
| PerlInterpreter *perl; |
| int num_requests; |
| U8 flags; |
| request_rec *request; |
| int refcnt; |
| #ifdef MP_TRACE |
| unsigned long tid; |
| #endif |
| }; |
| |
| typedef struct { |
| /* s == startup grow |
| * r == runtime grow |
| */ |
| void * (*tipool_sgrow)(modperl_tipool_t *tipool, void *data); |
| void * (*tipool_rgrow)(modperl_tipool_t *tipool, void *data); |
| void (*tipool_shrink)(modperl_tipool_t *tipool, void *data, |
| void *item); |
| void (*tipool_destroy)(modperl_tipool_t *tipool, void *data, |
| void *item); |
| void (*tipool_dump)(modperl_tipool_t *tipool, void *data, |
| modperl_list_t *listp); |
| } modperl_tipool_vtbl_t; |
| |
| typedef struct { |
| int start; /* number of items to create at startup */ |
| int min_spare; /* minimum number of spare items */ |
| int max_spare; /* maximum number of spare items */ |
| int max; /* maximum number of items */ |
| int max_requests; /* maximum number of requests per item */ |
| } modperl_tipool_config_t; |
| |
| struct modperl_tipool_t { |
| perl_mutex tiplock; |
| perl_cond available; |
| modperl_list_t *idle, *busy; |
| int in_use; /* number of items currrently in use */ |
| int size; /* current number of items */ |
| void *data; /* user data */ |
| modperl_tipool_config_t *cfg; |
| modperl_tipool_vtbl_t *func; |
| }; |
| |
| struct modperl_interp_pool_t { |
| server_rec *server; |
| modperl_tipool_t *tipool; |
| modperl_tipool_config_t *tipool_cfg; |
| modperl_interp_t *parent; /* from which to perl_clone() */ |
| }; |
| |
| #endif /* USE_ITHREADS */ |
| |
| typedef U32 modperl_opts_t; |
| |
| typedef struct { |
| modperl_opts_t opts; |
| modperl_opts_t opts_add; |
| modperl_opts_t opts_remove; |
| modperl_opts_t opts_override; |
| modperl_opts_t opts_seen; |
| int unset; |
| } modperl_options_t; |
| |
| typedef enum { |
| MP_INTERP_SCOPE_UNDEF, |
| MP_INTERP_SCOPE_HANDLER, |
| MP_INTERP_SCOPE_SUBREQUEST, |
| MP_INTERP_SCOPE_REQUEST, |
| MP_INTERP_SCOPE_CONNECTION |
| } modperl_interp_scope_e; |
| |
| typedef struct { |
| MpHV *vars; |
| MpHV *SetEnv; |
| MpHV *PassEnv; |
| MpAV *PerlRequire, *PerlModule; |
| MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; |
| MpAV *handlers_files[MP_HANDLER_NUM_FILES]; |
| MpAV *handlers_process[MP_HANDLER_NUM_PROCESS]; |
| MpAV *handlers_pre_connection[MP_HANDLER_NUM_PRE_CONNECTION]; |
| MpAV *handlers_connection[MP_HANDLER_NUM_CONNECTION]; |
| int threaded_mpm; |
| #ifdef USE_ITHREADS |
| modperl_interp_pool_t *mip; |
| modperl_tipool_config_t *interp_pool_cfg; |
| modperl_interp_scope_e interp_scope; |
| #else |
| PerlInterpreter *perl; |
| #endif |
| #ifdef MP_USE_GTOP |
| modperl_gtop_t *gtop; |
| #endif |
| MpAV *argv; |
| modperl_options_t *flags; |
| apr_hash_t *modules; |
| server_rec *server; |
| } modperl_config_srv_t; |
| |
| typedef struct { |
| char *location; |
| char *PerlDispatchHandler; |
| MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; |
| MpHV *SetEnv; |
| MpHV *vars; |
| modperl_options_t *flags; |
| #ifdef USE_ITHREADS |
| modperl_interp_scope_e interp_scope; |
| #endif |
| } modperl_config_dir_t; |
| |
| typedef struct modperl_mgv_t modperl_mgv_t; |
| |
| struct modperl_mgv_t { |
| char *name; |
| int len; |
| UV hash; |
| modperl_mgv_t *next; |
| }; |
| |
| typedef struct modperl_handler_t modperl_handler_t; |
| |
| struct modperl_handler_t{ |
| modperl_mgv_t *mgv_obj; |
| modperl_mgv_t *mgv_cv; |
| const char *name; /* original name from .conf if any */ |
| U8 flags; |
| U32 attrs; |
| modperl_handler_t *next; |
| }; |
| |
| #define MP_HANDLER_TYPE_CHAR 1 |
| #define MP_HANDLER_TYPE_SV 2 |
| |
| typedef struct { |
| int outcnt; |
| char outbuf[MP_IOBUFSIZE]; |
| apr_pool_t *pool; |
| ap_filter_t **filters; |
| int header_parse; |
| request_rec *r; |
| } modperl_wbucket_t; |
| |
| typedef enum { |
| MP_INPUT_FILTER_MODE, |
| MP_OUTPUT_FILTER_MODE |
| } modperl_filter_mode_e; |
| |
| typedef struct { |
| int seen_eos; |
| int eos; |
| int flush; |
| ap_filter_t *f; |
| char *leftover; |
| apr_ssize_t remaining; |
| modperl_wbucket_t wbucket; |
| apr_bucket *bucket; |
| apr_bucket_brigade *bb_in; |
| apr_bucket_brigade *bb_out; |
| ap_input_mode_t input_mode; |
| apr_read_type_e block; |
| apr_off_t readbytes; |
| apr_status_t rc; |
| modperl_filter_mode_e mode; |
| apr_pool_t *pool; |
| } modperl_filter_t; |
| |
| typedef struct { |
| int sent_eos; |
| SV *data; |
| modperl_handler_t *handler; |
| PerlInterpreter *perl; |
| } modperl_filter_ctx_t; |
| |
| typedef struct { |
| HV *pnotes; |
| SV *global_request_obj; |
| U8 flags; |
| int status; |
| modperl_wbucket_t *wbucket; |
| MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; |
| MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; |
| modperl_perl_globals_t perl_globals; |
| #ifdef USE_ITHREADS |
| modperl_interp_t *interp; |
| #endif |
| } modperl_config_req_t; |
| |
| typedef struct { |
| MpAV *handlers_connection[MP_HANDLER_NUM_CONNECTION]; |
| } modperl_config_con_t; |
| |
| typedef struct { |
| apr_pool_t *pool; |
| void *data; |
| } modperl_cleanup_data_t; |
| |
| /* subclass apr_uri_t */ |
| typedef struct { |
| apr_uri_t uri; |
| apr_pool_t *pool; |
| char *path_info; |
| } modperl_uri_t; |
| |
| typedef struct { |
| module *modp; |
| const char *cmd_data; |
| const char *func_name; |
| } modperl_module_cmd_data_t; |
| |
| typedef enum { |
| MP_HOOK_RUN_ALL, |
| MP_HOOK_RUN_FIRST, |
| MP_HOOK_VOID |
| } modperl_hook_run_mode_e; |
| |
| #endif /* MODPERL_TYPES_H */ |