mturk 2002/07/08 00:45:32 Modified: jk/native2/server/isapi jk_isapi_plugin.c Log: Move the init to the GetFilterVersion, allowing p file authComplete config value. Needed changes for the ThreadPool. Revision Changes Path 1.37 +160 -145 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c Index: jk_isapi_plugin.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- jk_isapi_plugin.c 8 Jul 2002 00:26:07 -0000 1.36 +++ jk_isapi_plugin.c 8 Jul 2002 07:45:32 -0000 1.37 @@ -86,6 +86,7 @@ #define EXTENSION_URI_TAG ("extensionUri") #define WORKERS_FILE_TAG ("workersFile") #define USE_AUTH_COMP_TAG ("authComplete") +#define THREAD_POOL_TAG ("threadPool") static char file_name[_MAX_PATH]; @@ -95,9 +96,10 @@ static int is_mapread = JK_FALSE; static int was_inited = JK_FALSE; static int auth_notification_flags = 0; +static int use_auth_notification_flags = 0; static jk_workerEnv_t *workerEnv; -static apr_pool_t *jk_globalPool; +apr_pool_t *jk_globalPool; static char extension_uri[INTERNET_MAX_URL_LENGTH] = "/jakarta/isapi_redirector2.dll"; static char worker_file[MAX_PATH * 2] = ""; @@ -120,6 +122,10 @@ static jk_env_t* jk2_create_config(); static int get_auth_flags(); +/* ThreadPool support + * + */ +int use_thread_pool = 0; static void write_error_response(PHTTP_FILTER_CONTEXT pfc,char *status,char * msg) { @@ -141,14 +147,58 @@ pfc->WriteClient(pfc, msg, &len, 0); } +HANDLE jk2_starter_event; +HANDLE jk2_inited_event; +HANDLE jk2_starter_thread = NULL; + +DWORD WINAPI jk2_isapi_starter( LPVOID lpParam ) +{ + Sleep(1000); + + apr_initialize(); + apr_pool_create( &jk_globalPool, NULL ); + initialize_extension(); + if (is_inited) { + if (init_jk(NULL)) + is_mapread = JK_TRUE; + } + SetEvent(jk2_inited_event); + WaitForSingleObject(jk2_starter_event, INFINITE); + + if (is_inited) { + was_inited = JK_TRUE; + is_inited = JK_FALSE; + if (workerEnv) { + jk_env_t *env = workerEnv->globalEnv; + jk2_iis_close_pool(env); + workerEnv->close(env, workerEnv); + } + is_mapread = JK_FALSE; + } + apr_pool_destroy(jk_globalPool); + apr_terminate(); + return 0; +} BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer) { ULONG http_filter_revision = HTTP_FILTER_REVISION; + DWORD dwThreadId; + jk2_inited_event = CreateEvent(NULL, FALSE, FALSE, NULL); + jk2_starter_event = CreateEvent(NULL, FALSE, FALSE, NULL); - pVer->dwFilterVersion = pVer->dwServerFilterVersion; + jk2_starter_thread = CreateThread(NULL, 0, + jk2_isapi_starter, + NULL, + 0, + &dwThreadId); + WaitForSingleObject(jk2_inited_event, INFINITE); + if (!is_inited || !is_mapread) { + return FALSE; + } + pVer->dwFilterVersion = pVer->dwServerFilterVersion; if (pVer->dwFilterVersion > http_filter_revision) { pVer->dwFilterVersion = http_filter_revision; } @@ -403,108 +453,109 @@ return TRUE; } -DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpEcb) +DWORD WINAPI HttpExtensionProcWorker(LPEXTENSION_CONTROL_BLOCK lpEcb, + jk_ws_service_t *service) { DWORD rc = HSE_STATUS_ERROR; jk_env_t *env; - lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR; + jk_ws_service_t sOnStack; + jk_ws_service_t *s; + char *worker_name; + char huge_buf[16 * 1024]; /* should be enough for all */ + DWORD huge_buf_sz; + jk_worker_t *worker; + jk_pool_t *rPool=NULL; + int rc1; - if (!is_inited) { - initialize_extension(); - } + if (service) + s = service; + else + s = &sOnStack; - /* Initialise jk */ - if (is_inited && !is_mapread) { - char serverName[MAX_SERVERNAME]; - DWORD dwLen = sizeof(serverName); - if (lpEcb->GetServerVariable(lpEcb->ConnID, SERVER_NAME, serverName, &dwLen)){ - if (dwLen > 0) serverName[dwLen-1] = '\0'; - if (init_jk(serverName)) - is_mapread = JK_TRUE; - } - if (!is_mapread) - is_inited = JK_FALSE; + lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR; + env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv ); + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "HttpExtensionProc started\n"); + + GET_SERVER_VARIABLE_VALUE(workerEnv->pool,HTTP_WORKER_HEADER_NAME, ( worker_name )); + worker=env->getByName( env, worker_name); + + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "HttpExtensionProc %s a worker for name %s\n", + worker ? "got" : "could not get", + worker_name); + + if( worker==NULL ){ + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "HttpExtensionProc worker is NULL\n"); + return rc; + } + /* Get a pool for the request XXX move it in workerEnv to + be shared with other server adapters */ + rPool= worker->rPoolCache->get( env, worker->rPoolCache ); + if( rPool == NULL ) { + rPool=worker->mbean->pool->create( env, worker->mbean->pool, HUGE_POOL_SIZE ); + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "HttpExtensionProc: new rpool\n"); + } + + jk2_service_iis_init( env, s ); + s->pool = rPool; + s->is_recoverable_error = JK_FALSE; + s->response_started = JK_FALSE; + s->content_read = 0; + s->ws_private = lpEcb; + s->workerEnv = workerEnv; + + /* Initialize the ws_service structure */ + s->init( env, s, worker, lpEcb ); + + if (JK_OK == worker->service(env, worker, s)){ + rc=HSE_STATUS_SUCCESS; + lpEcb->dwHttpStatusCode = HTTP_STATUS_OK; + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "HttpExtensionProc service() returned OK\n"); + } else { + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "HttpExtensionProc service() Failed\n"); } + s->afterRequest(env, s); - if (is_inited) { - jk_ws_service_t sOnStack; - jk_ws_service_t *s=&sOnStack; - char *worker_name; - char huge_buf[16 * 1024]; /* should be enough for all */ - DWORD huge_buf_sz; - - - jk_worker_t *worker; - jk_pool_t *rPool=NULL; - int rc1; + rPool->reset(env, rPool); - env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv ); - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "HttpExtensionProc started\n"); + rc1=worker->rPoolCache->put( env, worker->rPoolCache, rPool ); - GET_SERVER_VARIABLE_VALUE(workerEnv->pool,HTTP_WORKER_HEADER_NAME, ( worker_name )); - worker=env->getByName( env, worker_name); + if (service != NULL) { + lpEcb->ServerSupportFunction(lpEcb->ConnID, + HSE_REQ_DONE_WITH_SESSION, + NULL, + NULL, + NULL); + } + return rc; +} - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "HttpExtensionProc %s a worker for name %s\n", - worker ? "got" : "could not get", - worker_name); - - if( worker==NULL ){ - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "HttpExtensionProc worker is NULL\n"); - return rc; - } - /* Get a pool for the request XXX move it in workerEnv to - be shared with other server adapters */ - rPool= worker->rPoolCache->get( env, worker->rPoolCache ); - if( rPool == NULL ) { - rPool=worker->mbean->pool->create( env, worker->mbean->pool, HUGE_POOL_SIZE ); - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "HttpExtensionProc: new rpool\n"); +DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpEcb) +{ + if (is_inited) { + if (!use_thread_pool) { + return HttpExtensionProcWorker(lpEcb, NULL); } - - jk2_service_iis_init( env, s ); - s->pool = rPool; - s->is_recoverable_error = JK_FALSE; - s->response_started = JK_FALSE; - s->content_read = 0; - s->ws_private = lpEcb; - s->workerEnv = workerEnv; - - /* Initialize the ws_service structure */ - s->init( env, s, worker, lpEcb ); - - if (JK_OK == worker->service(env, worker, s)){ - rc=HSE_STATUS_SUCCESS; - lpEcb->dwHttpStatusCode = HTTP_STATUS_OK; - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "HttpExtensionProc service() returned OK\n"); - } else { - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "HttpExtensionProc service() Failed\n"); + else { + /* Pass the request to the thread pool */ + jk2_iis_thread_pool(lpEcb); + return HSE_STATUS_PENDING; } - - s->afterRequest(env, s); - - rPool->reset(env, rPool); - - rc1=worker->rPoolCache->put( env, worker->rPoolCache, rPool ); } - return rc; + return HSE_STATUS_ERROR; } - - BOOL WINAPI TerminateExtension(DWORD dwFlags) { return TerminateFilter(dwFlags); } -HANDLE jk2_starter_event; -HANDLE jk2_starter_thread = NULL; - BOOL WINAPI TerminateFilter(DWORD dwFlags) { /* detatch the starter thread */ @@ -514,35 +565,6 @@ } -DWORD WINAPI jk2_isapi_starter( LPVOID lpParam ) -{ - Sleep(1000); - - apr_initialize(); - apr_pool_create( &jk_globalPool, NULL ); - initialize_extension(); - if (is_inited) { - if (init_jk(NULL)) - is_mapread = JK_TRUE; - } - - WaitForSingleObject(jk2_starter_event, INFINITE); - - if (is_inited) { - was_inited = JK_TRUE; - is_inited = JK_FALSE; - if (workerEnv) { - jk_env_t *env = workerEnv->globalEnv; - workerEnv->close(env, workerEnv); - } - is_mapread = JK_FALSE; - } - apr_pool_destroy(jk_globalPool); - apr_terminate(); - ExitThread(0); - return 0; -} - BOOL WINAPI DllMain(HINSTANCE hInst, // Instance Handle of the DLL ULONG ulReason, // Reason why NT called this DLL @@ -552,11 +574,10 @@ char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; - DWORD dwThreadId; switch (ulReason) { case DLL_PROCESS_DETACH: - WaitForSingleObject(jk2_starter_thread, INFINITE); + WaitForSingleObject(jk2_starter_thread, 1200000); CloseHandle(jk2_starter_thread); /* Dirty hack to unload the jvm */ if (was_inited && jk_jni_status_code) @@ -568,18 +589,6 @@ _splitpath( file_name, drive, dir, fname, NULL ); _makepath( ini_file_name, drive, dir, fname, ".properties" ); - jk2_starter_event = CreateEvent(NULL, - FALSE, - FALSE, - NULL); - - jk2_starter_thread = CreateThread( NULL, - 0, - jk2_isapi_starter, - NULL, - 0, - &dwThreadId); - } else { fReturn = JK_FALSE; } @@ -622,6 +631,7 @@ { jk_env_t *env=jk2_create_config(); if (read_registry_init_data(env)) { + jk2_iis_init_pool(env); is_inited = JK_TRUE; } return is_inited; @@ -654,6 +664,14 @@ if (tmp) { strcpy(worker_file, tmp); } + tmp = map->get(env,map,THREAD_POOL_TAG); + if (tmp) { + use_thread_pool = atoi(tmp); + } + tmp = map->get(env,map,USE_AUTH_COMP_TAG); + if (tmp) { + use_auth_notification_flags = atoi(tmp); + } using_ini_file=JK_TRUE; return ok; } @@ -697,6 +715,19 @@ } else { ok = JK_FALSE; } + if(get_registry_config_parameter(hkey, + THREAD_POOL_TAG, + tmpbuf, + 8)) { + use_thread_pool = atoi(tmpbuf); + } + if(get_registry_config_parameter(hkey, + USE_AUTH_COMP_TAG, + tmpbuf, + 8)) { + use_auth_notification_flags = atoi(tmpbuf); + } + RegCloseKey(hkey); return ok; } @@ -803,7 +834,7 @@ int maj, sz; int rv = SF_NOTIFY_PREPROC_HEADERS; int use_auth = JK_FALSE; - /* Retrieve the IIS version Major*/ + /* Retreive the IIS version Major*/ rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, W3SVC_REGISTRY_KEY, (DWORD)0, @@ -824,23 +855,7 @@ return rv; } CloseHandle(hkey); - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - REGISTRY_LOCATION, - (DWORD)0, - KEY_READ, - &hkey); - if(ERROR_SUCCESS != rc) { - return rv; - } - - rc = RegQueryValueEx(hkey, - USE_AUTH_COMP_TAG, - NULL, - NULL, - (LPBYTE)&use_auth, - &sz); - CloseHandle(hkey); - if (use_auth && maj > 4) + if (use_auth_notification_flags && maj > 4) rv = SF_NOTIFY_AUTH_COMPLETE; return rv;
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>