blob: 62bd11ba51d6da1f631e2602b843ee6e2a12cc04 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed 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.
*/
/***************************************************************************
* Description: Workers controller header file *
* Author: Gal Shachor <shachor@il.ibm.com> *
* Version: $Revision$ *
***************************************************************************/
#ifndef JK_WORKERENV_H
#define JK_WORKERENV_H
#include "jk_logger.h"
#include "jk_endpoint.h"
#include "jk_config.h"
#include "jk_worker.h"
#include "jk_map.h"
#include "jk_uriMap.h"
#include "jk_uriEnv.h"
#include "jk_handler.h"
#include "jk_service.h"
#include "jk_shm.h"
#include "jk_vm.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
struct jk_worker;
struct jk_channel;
struct jk_endpoint;
struct jk_env;
struct jk_config;
struct jk_uriMap;
struct jk_uriEnv;
struct jk_map;
struct jk_logger;
struct jk_handler;
struct jk_ws_service;
/* Temporary hardcoded handler IDs. Will be replaced with a name based dynamic mechanism */
/* Write a body chunk from the servlet container to the web server */
#define JK_HANDLE_AJP13_SEND_BODY_CHUNK 3
/* Send response headers from the servlet container to the web server. */
#define JK_HANDLE_AJP13_SEND_HEADERS 4
/* Marks the end of response. */
#define JK_HANDLE_AJP13_GET_BODY_CHUNK 6
/* Marks the end of response. */
#define JK_HANDLE_AJP13_END_RESPONSE 5
/* Get a PONG reply from the servlet container. */
#define JK_HANDLE_AJP13_PONG_REPLY 9
/* Second Login Phase (servlet engine -> web server), md5 seed is received */
#define JK_HANDLE_LOGON_SEED 0x11
/* Login Accepted (servlet engine -> web server) */
#define JK_HANDLE_LOGON_OK 0x13
/* Login Rejected (servlet engine -> web server) */
#define JK_HANDLE_LOGON_ERR 0x14
/* Dispatcher for jni channel ( java->C ) */
#define JK_HANDLE_JNI_DISPATCH 0x15
/* Dispatcher for shm object ( java->C) */
#define JK_HANDLE_SHM_DISPATCH 0x16
/* Dispatcher for channel components ( java->C )*/
#define JK_HANDLE_CH_DISPATCH 0x17
/* Dispatcher for mutex object ( java->C ) */
#define JK_HANDLE_MUTEX_DISPATCH 0x18
/*
* Jk configuration and global methods.
*
* Env Information to be provided to worker at init time
* With AJP14 support we need to have access to many informations
* about web-server, uri to worker map....
*/
struct jk_workerEnv
{
struct jk_bean *mbean;
/* Use this pool for all global settings
*/
struct jk_pool *pool;
/* Active workers hashtable.
*/
struct jk_map *worker_map;
/* Channels
*/
struct jk_map *channel_map;
struct jk_map *endpointMap;
/* In a multi-process server, like Apache, stores the child
id in the scoreboard ( if the scoreboard is used ).
This in turn is used in the jk scoreboard to store informations
about each instance.
If -1 - shm is disabled.
*/
int childId;
int childProcessId;
/* maximum configured number of child processes */
int maxDaemons;
struct jk_env *globalEnv;
/** Worker that will be used by default, if no other
worker is specified. Usefull for SetHandler or
to avoid the lookup
XXX no need - lb is the default, easy to get it.
*/
struct jk_worker *defaultWorker;
/* Web-Server we're running on (Apache/IIS/NES).
*/
char *server_name;
/* XXX Virtual server handled - "*" is all virtual
*/
char *virtual;
/** Initialization properties, set via native options or workers.properties.
*/
/* XXX renamed from init_data to force all code to use setProperty
This is private property !
*/
struct jk_map *initData;
/*
* Log options. XXX move it to uriEnv, make it configurable per webapp.
* XXX What about apache native logger ?
*/
char *logger_name;
struct jk_uriMap *uriMap;
int was_initialized;
/*
* SSL Support
*/
int ssl_enable;
char *https_indicator;
char *certs_indicator;
char *cipher_indicator;
char *session_indicator; /* Servlet API 2.3 requirement */
char *key_size_indicator; /* Servlet API 2.3 requirement */
/*
* Jk Options
*/
int options;
/** Old REUSE_WORKER define. Instead of using an object pool, use
thread data to recycle the connection. */
int perThreadWorker;
/*
* Environment variables support
*/
int envvars_in_use;
struct jk_map *envvars;
struct jk_config *config;
struct jk_shm *shm;
/* Slot for endpoint stats
*/
struct jk_shm_slot *epStat;
/* Handlers. This is a dispatch table for messages, for
* each message id we have an entry containing the jk_handler_t.
* lastMessageId is the size of the table.
*/
struct jk_handler **handlerTable;
int lastMessageId;
/* The vm - we support a single instance per process
* ( i.e can't have both jdk1.1 and jdk1.2 at the same time,
* or 2 instances of the same vm. )
*/
struct jk_vm *vm;
/** Private data, associated with the 'real' server
* server_rec * in apache
*/
void *_private;
struct jk_mutex *cs;
/* Global setting to enable counters on all requests.
* That adds about 2-3 ms per request ( at least on linux ),
* and will store average and max processing time per endpoint
* ( that can be agregated per worker or per server ).
* Note that we can't collect per request times - it's not
* thread safe and sync is expensive. As workaround you
* can enable timers only on a specific request and/or
* use a dedicated worker/channel for that request.
*/
int timing;
/* -------------------- Methods -------------------- */
/* Register a callback handler, for methods from java to C
*/
int (*registerHandler) (struct jk_env * env,
struct jk_workerEnv * _this,
const char *type, const char *name, int id,
jk_handler_callback callback,
char *signature);
int (*addWorker) (struct jk_env * env,
struct jk_workerEnv * _this, struct jk_worker * w);
int (*addChannel) (struct jk_env * env,
struct jk_workerEnv * _this,
struct jk_channel * w);
/** Add an endpoint. Endpoints are long lived and used to store
statistics. The endpoint can be in used in only one thread
at a time, it's a good way to avoid synchronization.
*/
int (*addEndpoint) (struct jk_env * env, struct jk_workerEnv * wEnv,
struct jk_endpoint * ep);
int (*initChannel) (struct jk_env * env,
struct jk_workerEnv * wEnv,
struct jk_channel * ch);
/** Call the handler associated with the message type.
*/
int (*dispatch) (struct jk_env * env, struct jk_workerEnv * _this,
void *target, struct jk_endpoint * ep, int code,
struct jk_msg * msg);
/** Utility method for stream-based workers. It'll read
* messages, dispatch, send the response if any until
* done. This assumes one native server thread talking
* with a different client thread ( on the java side ).
* It does not work for jni or doors or other transports
* where a single thread is used for the whole processing.
*/
int (*processCallbacks) (struct jk_env * env,
struct jk_workerEnv * _this,
struct jk_endpoint * e,
struct jk_ws_service * r);
/**
* Special init function to be called from the parent process
* ( with root privs ? ).
* Used to create the scoreboard ( workaround required at least for HPUX )
*
* init() will be called for each child, parentInit() only once.
*/
int (*parentInit) (struct jk_env * env, struct jk_workerEnv * _this);
/**
* Init the workers, prepare the worker environment. Will read
* all properties and set the jk acordignly.
*
* Replaces wc_open
*/
int (*init) (struct jk_env * env, struct jk_workerEnv * _this);
/** Close all workers, clean up
*
*/
void (*close) (struct jk_env * env, struct jk_workerEnv * _this);
};
typedef struct jk_workerEnv jk_workerEnv_t;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* JK_WORKERENV_H */