costin 01/12/06 14:50:25
Modified: jk/native2/server/apache2 jk_logger_apache2.c jk_pool_apr.c
mod_jk.c
Log:
Update for the interface changes.
Various fixes
Update the code the initialize jk.
Revision Changes Path
1.4 +3 -1
jakarta-tomcat-connectors/jk/native2/server/apache2/jk_logger_apache2.c
Index: jk_logger_apache2.c
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_logger_apache2.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- jk_logger_apache2.c 2001/12/05 20:49:48 1.3
+++ jk_logger_apache2.c 2001/12/06 22:50:25 1.4
@@ -85,7 +85,8 @@
#define HUGE_BUFFER_SIZE (8*1024)
-int JK_METHOD jk_logger_apache2_factory(jk_env_t *env, void **result,
+int JK_METHOD jk_logger_apache2_factory(jk_env_t *env, jk_pool_t *pool,
+ void **result,
char *type, char *name);
@@ -162,6 +163,7 @@
int jk_logger_apache2_factory(jk_env_t *env,
+ jk_pool_t *pool,
void **result,
char *type,
char *name)
1.3 +37 -28
jakarta-tomcat-connectors/jk/native2/server/apache2/jk_pool_apr.c
Index: jk_pool_apr.c
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_pool_apr.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- jk_pool_apr.c 2001/12/05 20:49:48 1.2
+++ jk_pool_apr.c 2001/12/06 22:50:25 1.3
@@ -66,26 +66,27 @@
#include "apr_pools.h"
#include "apr_strings.h"
-int jk_pool_apr_create( jk_pool_t **newPool, jk_pool_t *parent );
+int jk_pool_apr_create( jk_pool_t **newPool, jk_pool_t *parent, apr_pool_t *aprPool
);
-int JK_METHOD jk_pool_apr_factory(jk_env_t *env, void **result,
+int JK_METHOD jk_pool_apr_factory(jk_env_t *env,
+ jk_pool_t *pool,
+ void **result,
char *type, char *name);
-void jk_pool_apr_open(jk_pool_t *_this, apr_pool_t *realPool );
-
-
-/** Nothing - apache will take care
+/** Nothing - apache will take care ??
*/
-static void jk_close_pool(jk_pool_t *p)
+static void jk_pool_apr_close(jk_pool_t *p)
{
+
}
/** Nothing - apache will take care.
XXX with jk pools we can implement 'recycling',
not sure what's the equivalent for apache
*/
-static void jk_reset_pool(jk_pool_t *p)
+static void jk_pool_apr_reset(jk_pool_t *p)
{
+ apr_pool_clear(p->_private);
}
static void *jk_pool_apr_calloc(jk_pool_t *p,
@@ -96,7 +97,7 @@
}
static void *jk_pool_apr_alloc(jk_pool_t *p,
- size_t size)
+ size_t size)
{
return apr_palloc( (apr_pool_t *)p->_private, (apr_size_t)size);
}
@@ -128,41 +129,49 @@
-/* Not implemented yet */
-int jk_pool_apr_create( jk_pool_t **newPool, jk_pool_t *parent ) {
+static jk_pool_t *jk_pool_apr_createChild( jk_pool_t *_this, int sizeHint ) {
+ apr_pool_t *parentAprPool=_this->_private;
+ apr_pool_t *childAprPool;
+ jk_pool_t *newPool;
- return JK_TRUE;
+ apr_pool_create( &childAprPool, parentAprPool );
+
+ jk_pool_apr_create( &newPool, _this, childAprPool );
+
+ return newPool;
}
+
+
+int jk_pool_apr_create( jk_pool_t **newPool, jk_pool_t *parent, apr_pool_t *aprPool)
+{
+ jk_pool_t *_this=(jk_pool_t *)apr_palloc(aprPool, sizeof( jk_pool_t ));
+
+ _this->_private=aprPool;
+
+ *newPool = _this;
-static void init_methods(jk_pool_t *_this ) {
- _this->open=jk_open_pool;
- _this->close=jk_close_pool;
- _this->reset=jk_reset_pool;
+ /* methods */
+ _this->create=jk_pool_apr_createChild;
+ _this->close=jk_pool_apr_close;
+ _this->reset=jk_pool_apr_reset;
_this->alloc=jk_pool_apr_alloc;
_this->calloc=jk_pool_apr_calloc;
_this->pstrdup=jk_pool_apr_strdup;
_this->realloc=jk_pool_apr_realloc;
+
+ return JK_TRUE;
}
/* Not used yet */
-int JK_METHOD jk_pool_apr_factory(jk_env_t *env, void **result,
- char *type, char *name)
+int JK_METHOD jk_pool_apr_factory(jk_env_t *env, jk_pool_t *pool,
+ void **result,
+ char *type, char *name)
{
jk_pool_t *_this=(jk_pool_t *)calloc( 1, sizeof(jk_pool_t));
- init_methods(_this );
-
*result=_this;
return JK_TRUE;
-}
-
-/* that's what jk use to create pools. Deprecated! */
-void jk_pool_apr_open(jk_pool_t *_this,
- apr_pool_t *realPool )
-{
- _this->_private=realPool;
- init_methods( _this );
}
1.7 +201 -188 jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c
Index: mod_jk.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- mod_jk.c 2001/12/05 20:49:48 1.6
+++ mod_jk.c 2001/12/06 22:50:25 1.7
@@ -1,4 +1,3 @@
-/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil-*- */
/* ========================================================================= *
* *
* The Apache Software License, Version 1.1 *
@@ -60,7 +59,7 @@
* Description: Apache 2 plugin for Jakarta/Tomcat *
* Author: Gal Shachor <[EMAIL PROTECTED]> *
* Henri Gomez <[EMAIL PROTECTED]> *
- * Version: $Revision: 1.6 $ *
+ * Version: $Revision: 1.7 $ *
***************************************************************************/
/*
@@ -96,13 +95,14 @@
#include "jk_worker.h"
#include "jk_workerEnv.h"
#include "jk_uriMap.h"
+#include "jk_requtil.h"
#define JK_WORKER_ID ("jakarta.worker")
#define JK_HANDLER ("jakarta-servlet")
#define JK_MAGIC_TYPE ("application/x-jakarta-servlet")
#define NULL_FOR_EMPTY(x) ((x && !strlen(x)) ? NULL : x)
-AP_MODULE_DECLARE_DATA module jk_module;
+module AP_MODULE_DECLARE_DATA jk_module;
static int JK_METHOD ws_start_response(jk_ws_service_t *s,
@@ -465,7 +465,7 @@
}
if(workerEnv->envvars_in_use) {
- apr_array_header_t *t = apr_table_elts(workerEnv->envvars);
+ const apr_array_header_t *t = apr_table_elts(workerEnv->envvars);
if(t && t->nelts) {
int i;
apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;
@@ -493,7 +493,7 @@
s->num_headers = 0;
if(r->headers_in && apr_table_elts(r->headers_in)) {
int need_content_length_header = (!s->is_chunked && s->content_length == 0)
? JK_TRUE : JK_FALSE;
- apr_array_header_t *t = apr_table_elts(r->headers_in);
+ const apr_array_header_t *t = apr_table_elts(r->headers_in);
if(t && t->nelts) {
int i;
apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;
@@ -895,9 +895,9 @@
* ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will
do the decoding part
*/
-const char *jk_set_options(cmd_parms *cmd,
- void *dummy,
- const char *line)
+static const char *jk_set_options(cmd_parms *cmd,
+ void *dummy,
+ const char *line)
{
int opt = 0;
int mask = 0;
@@ -1058,7 +1058,7 @@
"JkCERTSIndicator", jk_set_certs_indicator, NULL, RSRC_CONF,
"Name of the Apache environment that contains SSL client certificates"),
AP_INIT_TAKE1(
- "JkCIPHERIndicator", jk_set_cipher_indicator, NULL, RSRC_CONF,
+ "JkCIPHERIndicator", jk_set_cipher_indicator, NULL, RSRC_CONF,
"Name of the Apache environment that contains SSL client cipher"),
AP_INIT_TAKE1(
"JkSESSIONIndicator", jk_set_session_indicator, NULL, RSRC_CONF,
@@ -1095,146 +1095,6 @@
{NULL}
};
-
-
-/* ========================================================================= */
-/* The JK module handlers */
-/* ========================================================================= */
-
-/** Util - cleanup endpoint.
- */
-apr_status_t jk_cleanup_endpoint( void *data ) {
- jk_endpoint_t *end = (jk_endpoint_t *)data;
- /* printf("XXX jk_cleanup1 %ld\n", data); */
- end->done(&end, NULL);
- return 0;
-}
-
-/** Main service method, called to forward a request to tomcat
- */
-static int jk_handler(request_rec *r)
-{
- const char *worker_name;
- jk_logger_t *l;
- jk_workerEnv_t *workerEnv;
- int rc;
- jk_worker_t *worker;
-
- if(strcmp(r->handler,JK_HANDLER)) /* not for me, try next handler */
- return DECLINED;
-
- workerEnv = (jk_workerEnv_t *)ap_get_module_config(r->server->module_config,
- &jk_module);
- l = workerEnv->l;
-
- worker_name = apr_table_get(r->notes, JK_WORKER_ID);
-
- /* Set up r->read_chunked flags for chunked encoding, if present */
- if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) {
- return rc;
- }
-
- if( worker_name == NULL ) {
- /* SetHandler case - per_dir config should have the worker*/
- worker = workerEnv->defaultWorker;
- worker_name=worker->name;
- l->jkLog(l, JK_LOG_DEBUG,
- "Default worker for %s %s\n", r->uri, worker->name);
- }
-
- if (1) {
- l->jkLog(l, JK_LOG_DEBUG, "Into handler r->proxyreq=%d "
- "r->handler=%s r->notes=%d worker=%s\n",
- r->proxyreq, r->handler, r->notes, worker_name);
- }
-
- /* If this is a proxy request, we'll notify an error */
- if(r->proxyreq) {
- return HTTP_INTERNAL_SERVER_ERROR;
- }
-
- if(worker_name!=NULL || worker!=NULL ) {
- if( worker==NULL ) {
- worker = workerEnv->getWorkerForName(workerEnv,
- worker_name );
- }
-
- if(worker) {
- int rc = JK_FALSE;
- jk_pool_t p;
- jk_ws_service_t s;
- jk_pool_atom_t buf[SMALL_POOL_SIZE];
- jk_open_pool(&p, buf, sizeof(buf));
-
- s.workerEnv=workerEnv;
- s.response_started = JK_FALSE;
- s.read_body_started = JK_FALSE;
-
- jk_requtil_initRequest(&s);
-
- s.ws_private = r;
- s.pool = &p;
-
- if(init_ws_service(&s, workerEnv)) {
- jk_endpoint_t *end = NULL;
-
- /* Use per/thread pool ( or "context" ) to reuse the
- endpoint. It's a bit faster, but I don't know
- how to deal with load balancing - but it's usefull for JNI
- */
-
- if( workerEnv->perThreadWorker ) {
- apr_pool_t *rpool=r->pool;
- apr_pool_t *parent_pool= apr_pool_get_parent( rpool );
- apr_pool_t *tpool= apr_pool_get_parent( parent_pool );
-
- apr_pool_userdata_get( (void *)&end, "jk_thread_endpoint",
tpool );
- l->jkLog(l, JK_LOG_DEBUG, "Using per-thread worker %lx\n ", end
);
- if(end==NULL ) {
- worker->get_endpoint(worker, &end, l);
- apr_pool_userdata_set( end , "jk_thread_endpoint",
- &jk_cleanup_endpoint, tpool );
- }
- } else {
- worker->get_endpoint(worker, &end, l);
- }
- {
- int is_recoverable_error = JK_FALSE;
- rc = end->service(end, &s, l, &is_recoverable_error);
-
- if (s.content_read < s.content_length ||
- (s.is_chunked && ! s.no_more_chunks)) {
-
- /*
- * If the servlet engine didn't consume all of the
- * request data, consume and discard all further
- * characters left to read from client
- */
- char *buff = apr_palloc(r->pool, 2048);
- if (buff != NULL) {
- int rd;
- while ((rd = ap_get_client_block(r, buff, 2048)) > 0) {
- s.content_read += rd;
- }
- }
- }
- }
- if( ! workerEnv->perThreadWorker ) {
- end->done(&end, l);
- }
- }
-
- p.close(&p);
-
- if(rc) {
- return OK; /* NOT r->status, even if it has changed. */
- }
- }
- }
-
- return DECLINED;
-}
-
static void *create_jk_dir_config(apr_pool_t *p, char *dummy)
{
jk_uriEnv_t *new =
@@ -1245,7 +1105,7 @@
}
-static void *merge_jk_dir_configs(apr_pool_t *p, void *basev, void *addv)
+static void *merge_jk_dir_config(apr_pool_t *p, void *basev, void *addv)
{
jk_uriEnv_t *base =(jk_uriEnv_t *)basev;
jk_uriEnv_t *add = (jk_uriEnv_t *)addv;
@@ -1256,6 +1116,12 @@
return add;
}
+int jk_logger_apache2_factory(jk_env_t *env,
+ jk_pool_t *pool,
+ void **result,
+ char *type,
+ char *name);
+
/** Create default jk_config. XXX This is mostly server-independent,
all servers are using something similar - should go to common.
@@ -1265,56 +1131,61 @@
{
/* XXX Do we need both env and workerEnv ? */
jk_env_t *env;
- jk_env_objectFactory_t fac;
jk_workerEnv_t *workerEnv;
jk_logger_t *l;
-
- env=jk_env_getEnv( NULL );
+ jk_pool_t *globalPool;
+ jk_pool_t *workerEnvPool;
- /* l = env->getInstance( env, "logger", "file"); */
- jk_logger_apache2_factory( env, &l, "logger", "file");
+ /** First create a pool
+ */
+#ifdef NO_APACHE_POOL
+ jk_pool_create( &globalPool, NULL, 2048 );
+#else
+ jk_pool_apr_create( &globalPool, NULL, p );
+#endif
+
+ /** Create the global environment. This will register the default
+ factories
+ */
+ env=jk_env_getEnv( NULL, globalPool );
+
+ /* Optional. Register more factories ( or replace existing ones ) */
+
+
+ /* Init the environment. */
+
+ /* Create the logger */
+#ifdef NO_APACHE_LOGGER
+ l = env->getInstance( env, env->globalPool, "logger", "file");
+#else
+ jk_logger_apache2_factory( env, env->globalPool, &l, "logger", "file");
l->logger_private=s;
+#endif
env->logger=l;
l->jkLog(l, JK_LOG_DEBUG, "Created env and logger\n" );
- workerEnv= env->getInstance( env, "workerEnv", "default");
+ /* Create the workerEnv */
+ workerEnvPool=
+ env->globalPool->create( env->globalPool, HUGE_POOL_SIZE );
+
+ workerEnv= env->getInstance( env,
+ workerEnvPool,
+ "workerEnv", "default");
if( workerEnv==NULL ) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0,
- NULL, "Error creating workerEnv\n" );
+ l->jkLog(l, JK_LOG_ERROR, "Error creating workerEnv\n");
return NULL;
}
/* Local initialization */
workerEnv->_private = s;
+ printf("XXX Create jk config\n");
return workerEnv;
}
-
-/** Utility - copy a map . XXX Should move to jk_map, it's generic code.
- */
-static void copy_jk_map(apr_pool_t *p, server_rec * s, jk_map_t * src,
- jk_map_t * dst)
-{
- int sz = map_size(src);
- int i;
- for(i = 0 ; i < sz ; i++) {
- void *old;
- char *name = map_name_at(src, i);
- if(map_get(src, name, NULL) == NULL) {
- if(!map_put(dst, name,
- apr_pstrdup(p, map_get_string(src, name, NULL)),
- &old)) {
- jk_error_exit(APLOG_MARK, APLOG_EMERG, s, p,
- "Memory error");
- }
- }
- }
-}
-
/** Standard apache callback, merge jk options specified in
<Host> context. Used to set per virtual host configs
*/
@@ -1324,7 +1195,7 @@
{
jk_workerEnv_t *base = (jk_workerEnv_t *) basev;
jk_workerEnv_t *overrides = (jk_workerEnv_t *)overridesv;
-
+
/* XXX Commented out for now. It'll be reimplemented after we
add per/dir config and merge.
@@ -1373,11 +1244,12 @@
/** Standard apache callback, initialize jk.
*/
static void jk_child_init(apr_pool_t *pconf,
- server_rec *s)
+ server_rec *s)
{
jk_workerEnv_t *workerEnv =
(jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
+ printf("XXX Child init ");
/* init_jk( pconf, conf, s ); do we need jk_child_init? For ajp14? */
}
@@ -1416,6 +1288,7 @@
apr_pool_t *ptemp,
server_rec *s)
{
+ printf("XXX postConfig");
if(!s->is_virtual) {
jk_workerEnv_t *workerEnv =
(jk_workerEnv_t *)ap_get_module_config(s->module_config,
@@ -1428,6 +1301,146 @@
return OK;
}
+/* ========================================================================= */
+/* The JK module handlers */
+/* ========================================================================= */
+
+/** Util - cleanup endpoint. Used with per/thread endpoints.
+ */
+static apr_status_t jk_cleanup_endpoint( void *data ) {
+ jk_endpoint_t *end = (jk_endpoint_t *)data;
+ printf("XXX jk_cleanup1 %p\n", data);
+ end->done(&end, NULL);
+ return 0;
+}
+
+/** Main service method, called to forward a request to tomcat
+ */
+static int jk_handler(request_rec *r)
+{
+ const char *worker_name;
+ jk_logger_t *l;
+ jk_workerEnv_t *workerEnv;
+ int rc;
+ jk_worker_t *worker=NULL;
+ jk_endpoint_t *end = NULL;
+
+ if(strcmp(r->handler,JK_HANDLER)) /* not for me, try next handler */
+ return DECLINED;
+
+ workerEnv = (jk_workerEnv_t *)ap_get_module_config(r->server->module_config,
+ &jk_module);
+ l = workerEnv->l;
+
+ worker_name = apr_table_get(r->notes, JK_WORKER_ID);
+
+ /* Set up r->read_chunked flags for chunked encoding, if present */
+ if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) {
+ return rc;
+ }
+
+ if( worker_name == NULL ) {
+ /* SetHandler case - per_dir config should have the worker*/
+ worker = workerEnv->defaultWorker;
+ worker_name=worker->name;
+ l->jkLog(l, JK_LOG_DEBUG,
+ "Default worker for %s %s\n", r->uri, worker->name);
+ }
+
+ if (1) {
+ l->jkLog(l, JK_LOG_DEBUG, "Into handler r->proxyreq=%d "
+ "r->handler=%s r->notes=%d worker=%s\n",
+ r->proxyreq, r->handler, r->notes, worker_name);
+ }
+
+ /* If this is a proxy request, we'll notify an error */
+ if(r->proxyreq) {
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ if(worker_name==NULL && worker==NULL )
+ return DECLINED;
+
+ if( worker==NULL ) {
+ worker = workerEnv->getWorkerForName(workerEnv,
+ worker_name );
+ }
+
+ if(worker==NULL)
+ return DECLINED;
+
+ /* Find the endpoint */
+
+ /* Use per/thread pool ( or "context" ) to reuse the
+ endpoint. It's a bit faster, but I don't know
+ how to deal with load balancing - but it's usefull for JNI
+ */
+
+ if( workerEnv->perThreadWorker ) {
+ apr_pool_t *rpool=r->pool;
+ apr_pool_t *parent_pool= apr_pool_get_parent( rpool );
+ apr_pool_t *tpool= apr_pool_get_parent( parent_pool );
+
+ apr_pool_userdata_get( (void *)&end, "jk_thread_endpoint", tpool );
+ l->jkLog(l, JK_LOG_DEBUG, "Using per-thread worker %lx\n ", end );
+ if(end==NULL ) {
+ worker->get_endpoint(worker, &end, l);
+ apr_pool_userdata_set( end , "jk_thread_endpoint",
+ &jk_cleanup_endpoint, tpool );
+ }
+ } else {
+ worker->get_endpoint(worker, &end, l);
+ }
+
+ {
+ int rc = JK_FALSE;
+ jk_ws_service_t sOnStack;
+ jk_ws_service_t *s=&sOnStack;
+ int is_recoverable_error = JK_FALSE;
+
+ jk_requtil_initRequest(s);
+
+ s->workerEnv=workerEnv;
+ s->response_started = JK_FALSE;
+ s->read_body_started = JK_FALSE;
+ s->ws_private = r;
+ s->pool=end->pool;
+
+ rc=init_ws_service(s, workerEnv);
+
+ rc = end->service(end, s, l, &is_recoverable_error);
+
+ if (s->content_read < s->content_length ||
+ (s->is_chunked && ! s->no_more_chunks)) {
+
+ /*
+ * If the servlet engine didn't consume all of the
+ * request data, consume and discard all further
+ * characters left to read from client
+ */
+ char *buff = apr_palloc(r->pool, 2048);
+ if (buff != NULL) {
+ int rd;
+ while ((rd = ap_get_client_block(r, buff, 2048)) > 0) {
+ s->content_read += rd;
+ }
+ }
+ }
+ }
+
+ end->pool->reset(end->pool);
+
+ if( ! workerEnv->perThreadWorker ) {
+ end->done(&end, l);
+ }
+
+ if(rc) {
+ return OK; /* NOT r->status, even if it has changed. */
+ }
+
+ return DECLINED;
+}
+
/** Use the internal mod_jk mappings to find if this is a request for
* tomcat and what worker to use.
*/
@@ -1478,9 +1491,9 @@
/* Why do we need to duplicate a constant ??? */
r->handler=apr_pstrdup(r->pool,JK_HANDLER);
- apr_table_setn(r->notes, JK_WORKER_ID, uriEnv->worker->name);
+ apr_table_setn(r->notes, JK_WORKER_ID, uriEnv->webapp->worker->name);
l->jkLog(l, JK_LOG_DEBUG,
- "mod_jk: map %s %s\n", r->uri, uriEnv->worker->name);
+ "mod_jk: map %s %s\n", r->uri, uriEnv->webapp->worker->name);
/* XXXX XXXX
Use request_config -> it's much cheaper then notes !!!
@@ -1533,11 +1546,11 @@
module AP_MODULE_DECLARE_DATA jk_module =
{
STANDARD20_MODULE_STUFF,
- NULL, /* dir config creater */
- NULL, /* dir merger --- default is to override */
+ NULL ,/* create_jk_dir_config dir config creater */
+ NULL, /* merge_jk_dir_config dir merger --- default is to override */
create_jk_config, /* server config */
- merge_jk_config, /* merge server config */
- jk_cmds, /* command ap_table_t */
+ merge_jk_config, /* merge server config */
+ jk_cmds, /* command ap_table_t */
jk_register_hooks /* register hooks */
};
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>