int ngx_http_clojure_init_shared_map_util() { JNIEnv *env; jclass nc_shm_class; JNINativeMethod nms[] = { {"ngetMap", "(Ljava/lang/Object;JJ)J", jni_ngx_http_clojure_shared_map_get_map}, {"nput", "(JILjava/lang/Object;JJILjava/lang/Object;JJ)Ljava/lang/Object;", jni_ngx_http_clojure_shared_map_put}, {"nputIfAbsent", "(JILjava/lang/Object;JJILjava/lang/Object;JJ)Ljava/lang/Object;", jni_ngx_http_clojure_shared_map_put_if_absent}, {"nget", "(JILjava/lang/Object;JJ)Ljava/lang/Object;", jni_ngx_http_clojure_shared_map_get}, {"ndelete", "(JILjava/lang/Object;JJ)J", jni_ngx_http_clojure_shared_map_delete}, {"nremove", "(JILjava/lang/Object;JJ)Ljava/lang/Object;", jni_ngx_http_clojure_shared_map_remove}, {"nsize", "(J)J", jni_ngx_http_clojure_shared_map_size}, {"ncontains", "(JILjava/lang/Object;JJ)J", jni_ngx_http_clojure_shared_map_contains}, {"ngetNumber", "(JILjava/lang/Object;JJI)J", jni_ngx_http_clojure_shared_map_get_number}, {"nputNumber", "(JILjava/lang/Object;JJIJJ)J", jni_ngx_http_clojure_shared_map_put_number}, {"nputNumberIfAbsent", "(JILjava/lang/Object;JJIJJ)J", jni_ngx_http_clojure_shared_map_put_number_if_absent}, {"nremoveNumber", "(JILjava/lang/Object;JJIJ)J", jni_ngx_http_clojure_shared_map_remove_number}, {"natomicAddNumber","(JILjava/lang/Object;JJIJ)J", jni_ngx_http_clojure_shared_map_atomic_add_number} }; if (ngx_http_clojure_init_shared_map_flag == NGX_HTTP_CLOJURE_JVM_OK) { return NGX_HTTP_CLOJURE_JVM_OK; } ngx_http_clojure_get_env(&env); nc_shm_class = (*env)->FindClass(env, "nginx/clojure/util/NginxSharedHashMap"); exception_handle(nc_shm_class == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); nc_shm_native_2_jobject_mid = (*env)->GetStaticMethodID(env, nc_shm_class,"native2JavaObject" ,"(IJJ)Ljava/lang/Object;"); exception_handle(nc_shm_native_2_jobject_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); (*env)->RegisterNatives(env, nc_shm_class, nms, sizeof(nms) / sizeof(JNINativeMethod)); exception_handle(0 == 0, env, return NGX_HTTP_CLOJURE_JVM_ERR); ngx_http_clojure_init_shared_map_flag = NGX_HTTP_CLOJURE_JVM_OK; return NGX_HTTP_CLOJURE_JVM_OK; }
int ngx_http_clojure_init_socket_util() { JNIEnv *env; JNINativeMethod nms[] = { {"create", "(Lnginx/clojure/net/NginxClojureSocketRawHandler;)J", jni_ngx_http_clojure_socket_create}, {"available","(J)J", jni_ngx_http_clojure_socket_available}, {"setTcpNoDelay", "(JJ)J", jni_ngx_http_clojure_socket_set_tcp_nodelay}, {"getTcpNoDelay", "(J)J", jni_ngx_http_clojure_socket_get_tcp_nodelay}, {"setSoKeepAlive", "(JJ)J", jni_ngx_http_clojure_socket_set_so_keepalive}, {"getSoKeepAlive", "(J)J", jni_ngx_http_clojure_socket_get_so_keepalive}, {"setTimeout", "(JJJJ)V", jni_ngx_http_clojure_socket_set_timeout}, {"getReadTimeout", "(J)J", jni_ngx_http_clojure_socket_get_read_timeout}, {"getWriteTimeout", "(J)J", jni_ngx_http_clojure_socket_get_write_timeout}, {"getConnectTimeout", "(J)J", jni_ngx_http_clojure_socket_get_connect_timeout}, {"getReceiveBufferSize", "(J)J", jni_ngx_http_clojure_socket_set_receive_buf}, {"setReceiveBufferSize", "(JJ)J", jni_ngx_http_clojure_socket_get_receive_buf}, {"connect", "(JLjava/lang/Object;JJ)J", jni_ngx_http_clojure_socket_connect_url}, {"bind", "(JLjava/lang/Object;JJ)J", jni_ngx_http_clojure_socket_bind_str}, {"read", "(JLjava/lang/Object;JJ)J", jni_ngx_http_clojure_socket_read}, {"write", "(JLjava/lang/Object;JJ)J", jni_ngx_http_clojure_socket_write}, {"close", "(J)V", jni_ngx_http_clojure_socket_close}, {"shutdown", "(JJ)J", jni_ngx_http_clojure_socket_shutdown}, {"cancelSoftShutdown", "(JJ)J", jni_ngx_http_clojure_socket_cancel_soft_shutdown} }; jclass nc_socket_handler_class; if (ngx_http_clojure_init_socket_flag != NGX_HTTP_CLOJURE_JVM_ERR) { return NGX_HTTP_CLOJURE_JVM_OK; } ngx_http_clojure_get_env(&jvm_env); if (jvm_env == NULL) { return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI; } env = jvm_env; nc_socket_class = (*jvm_env)->FindClass(env, "nginx/clojure/net/NginxClojureAsynSocket"); exception_handle(nc_socket_class == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); nc_socket_handler_class = (*jvm_env)->FindClass(env, "nginx/clojure/net/NginxClojureSocketRawHandler"); exception_handle(nc_socket_handler_class == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); nc_socket_handler_read_mid = (*env)->GetMethodID(env, nc_socket_handler_class,"onRead", "(JJ)V"); exception_handle(nc_socket_handler_read_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); nc_socket_handler_write_mid = (*env)->GetMethodID(env, nc_socket_handler_class,"onWrite", "(JJ)V"); exception_handle(nc_socket_handler_write_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); nc_socket_handler_connect_mid = (*env)->GetMethodID(env, nc_socket_handler_class,"onConnect", "(JJ)V"); exception_handle(nc_socket_handler_connect_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); nc_socket_handler_release_mid = (*env)->GetMethodID(env, nc_socket_handler_class,"onRelease", "(JJ)V"); exception_handle(nc_socket_handler_release_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); (*env)->RegisterNatives(env, nc_socket_class, nms, sizeof(nms) / sizeof(JNINativeMethod)); exception_handle(0 == 0, env, return NGX_HTTP_CLOJURE_JVM_ERR_INIT_SOCKETAPI); return NGX_HTTP_CLOJURE_JVM_OK; }
int ngx_http_clojure_init_memory_util(ngx_int_t workers, ngx_log_t *log) { jlong MEM_INDEX[NGX_HTTP_CLOJURE_MEM_IDX_END]; JNIEnv *env; JNINativeMethod nms[] = { {"ngx_palloc", "(JJ)J", jni_ngx_palloc}, {"ngx_pcalloc", "(JJ)J", jni_ngx_pcalloc}, {"ngx_array_create", "(JJJ)J",jni_ngx_array_create}, {"ngx_array_init", "(JJJJ)J", jni_ngx_array_init}, {"ngx_array_push_n", "(JJ)J", jni_ngx_array_push_n}, {"ngx_list_create", "(JJJ)J", jni_ngx_list_create}, {"ngx_list_init", "(JJJJ)J", jni_ngx_list_init}, {"ngx_list_push", "(J)J", jni_ngx_list_push}, {"ngx_create_temp_buf", "(JJ)J", jni_ngx_create_temp_buf}, {"ngx_create_file_buf", "(JJJI)J", jni_ngx_create_file_buf}, {"ngx_http_set_content_type", "(J)J", jni_ngx_http_set_content_type}, {"ngx_http_send_header", "(J)J", jni_ngx_http_send_header}, {"ngx_http_output_filter", "(JJ)J", jni_ngx_http_output_filter}, {"ngx_http_finalize_request", "(JJ)V", jni_ngx_http_finalize_request}, {"ngx_http_clojure_mem_init_ngx_buf", "(JLjava/lang/Object;JJI)J", jni_ngx_http_clojure_mem_init_ngx_buf}, //jlong buf, jlong obj, jlong offset, jlong len, jint last_buf {"ngx_http_clojure_mem_get_obj_addr", "(Ljava/lang/Object;)J", jni_ngx_http_clojure_mem_get_obj_addr}, {"ngx_http_clojure_mem_get_list_size", "(J)J", jni_ngx_http_clojure_mem_get_list_size}, {"ngx_http_clojure_mem_get_list_item", "(JJ)J", jni_ngx_http_clojure_mem_get_list_item}, {"ngx_http_clojure_mem_copy_to_obj", "(JLjava/lang/Object;JJ)V", jni_ngx_http_clojure_mem_copy_to_obj}, {"ngx_http_clojure_mem_copy_to_addr", "(Ljava/lang/Object;JJJ)V", jni_ngx_http_clojure_mem_copy_to_addr}, {"ngx_http_clojure_mem_get_header", "(JJJ)J", jni_ngx_http_clojure_mem_get_header}, {"ngx_http_clojure_mem_get_variable", "(JJJ)J", jni_ngx_http_clojure_mem_get_variable}, {"ngx_http_clojure_mem_inc_req_count", "(J)V", jni_ngx_http_clojure_mem_inc_req_count}, {"ngx_http_clojure_mem_post_write_event", "(J)V", jni_ngx_http_clojure_mem_post_write_event} // {"ngx_http_clojure_mem_get_body_tmp_file", "(J)J", jni_ngx_http_clojure_mem_get_body_tmp_file} }; jmethodID nc_rt_init_mid; ngx_http_clojure_get_jvm(&jvm); if (ngx_http_clojure_init_memory_util_flag == NGX_HTTP_CLOJURE_JVM_OK) { return NGX_HTTP_CLOJURE_JVM_OK; } if (ngx_http_clojure_jvm_worker_pipe_init(log) != NGX_OK) { return NGX_HTTP_CLOJURE_JVM_ERR_INIT_PIPE; } memset(MEM_INDEX, -1, NGX_HTTP_CLOJURE_MEM_IDX_END * sizeof(jlong)); MEM_INDEX[NGX_HTTP_CLOJURE_UINT_SIZE_IDX] = NGX_HTTP_CLOJURE_UINT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_PTR_SIZE_IDX] = NGX_HTTP_CLOJURE_PTR_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_STRT_SIZE_IDX] = NGX_HTTP_CLOJURE_STRT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_STR_LEN_IDX] = NGX_HTTP_CLOJURE_STR_LEN_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_STR_DATA_IDX] = NGX_HTTP_CLOJURE_STR_DATA_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_SIZET_SIZE_IDX] = NGX_HTTP_CLOJURE_SIZET_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_OFFT_SIZE_IDX] = NGX_HTTP_CLOJURE_OFFT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_TELT_SIZE_IDX] = NGX_HTTP_CLOJURE_TELT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_TEL_HASH_IDX] = NGX_HTTP_CLOJURE_TEL_HASH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_TEL_KEY_IDX] = NGX_HTTP_CLOJURE_TEL_KEY_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_TEL_VALUE_IDX] = NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_TEL_LOWCASE_KEY_IDX] = NGX_HTTP_CLOJURE_TEL_LOWCASE_KEY_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_CHAINT_SIZE_IDX] = NGX_HTTP_CLOJURE_CHAINT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_CHAIN_BUF_IDX] = NGX_HTTP_CLOJURE_CHAIN_BUF_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_CHAIN_NEXT_IDX] = NGX_HTTP_CLOJURE_CHAIN_NEXT_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_VARIABLET_SIZE_IDX] = NGX_HTTP_CLOJURE_VARIABLET_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_CORE_VARIABLES_ADDR_IDX] = NGX_HTTP_CLOJURE_CORE_VARIABLES_ADDR; MEM_INDEX[NGX_HTTP_CLOJURE_CORE_VARIABLES_LEN_IDX] = NGX_HTTP_CLOJURE_CORE_VARIABLES_LEN; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAYT_SIZE_IDX] = NGX_HTTP_CLOJURE_ARRAYT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAY_ELTS_IDX] = NGX_HTTP_CLOJURE_ARRAY_ELTS_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAY_NELTS_IDX] = NGX_HTTP_CLOJURE_ARRAY_NELTS_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAY_SIZE_IDX] = NGX_HTTP_CLOJURE_ARRAY_SIZE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAY_NALLOC_IDX] = NGX_HTTP_CLOJURE_ARRAY_NALLOC_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_ARRAY_POOL_IDX] = NGX_HTTP_CLOJURE_ARRAY_POOL_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQT_SIZE_IDX] = NGX_HTTP_CLOJURE_REQT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_METHOD_IDX] = NGX_HTTP_CLOJURE_REQ_METHOD_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_URI_IDX] = NGX_HTTP_CLOJURE_REQ_URI_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_ARGS_IDX] = NGX_HTTP_CLOJURE_REQ_ARGS_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_HEADERS_IN_IDX] = NGX_HTTP_CLOJURE_REQ_HEADERS_IN_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_POOL_IDX] = NGX_HTTP_CLOJURE_REQ_POOL_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_REQ_HEADERS_OUT_IDX] = NGX_HTTP_CLOJURE_REQ_HEADERS_OUT_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSIT_SIZE_IDX] = NGX_HTTP_CLOJURE_HEADERSIT_SIZE; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_HOST_IDX] = NGX_HTTP_CLOJURE_HEADERSI_HOST_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_CONNECTION_IDX] = NGX_HTTP_CLOJURE_HEADERSI_CONNECTION_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_IF_MODIFIED_SINCE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_IF_MODIFIED_SINCE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_IF_UNMODIFIED_SINCE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_IF_UNMODIFIED_SINCE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_USER_AGENT_IDX] = NGX_HTTP_CLOJURE_HEADERSI_USER_AGENT_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_REFERER_IDX] = NGX_HTTP_CLOJURE_HEADERSI_REFERER_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_CONTENT_LENGTH_IDX] = NGX_HTTP_CLOJURE_HEADERSI_CONTENT_LENGTH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_CONTENT_TYPE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_CONTENT_TYPE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_RANGE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_RANGE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_IF_RANGE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_IF_RANGE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_TRANSFER_ENCODING_IDX] = NGX_HTTP_CLOJURE_HEADERSI_TRANSFER_ENCODING_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_EXPECT_IDX] = NGX_HTTP_CLOJURE_HEADERSI_EXPECT_OFFSET; #if (NGX_HTTP_GZIP) MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_ENCODING_IDX] = NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_ENCODING_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_VIA_IDX] = NGX_HTTP_CLOJURE_HEADERSI_VIA_OFFSET; #endif MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_AUTHORIZATION_IDX] = NGX_HTTP_CLOJURE_HEADERSI_AUTHORIZATION_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_KEEP_ALIVE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_KEEP_ALIVE_OFFSET; #if (NGX_HTTP_PROXY || NGX_HTTP_REALIP || NGX_HTTP_GEO) MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_X_FORWARDED_FOR_IDX] = NGX_HTTP_CLOJURE_HEADERSI_X_FORWARDED_FOR_OFFSET; #endif #if (NGX_HTTP_REALIP) MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_X_REAL_IP_IDX] = NGX_HTTP_CLOJURE_HEADERSI_X_REAL_IP_OFFSET; #endif #if (NGX_HTTP_HEADERS) MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_IDX] = NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_LANGUAGE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_ACCEPT_LANGUAGE_OFFSET; #endif #if (NGX_HTTP_DAV) MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_DEPTH_IDX] = NGX_HTTP_CLOJURE_HEADERSI_DEPTH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_DESTINATION_IDX] = NGX_HTTP_CLOJURE_HEADERSI_DESTINATION_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_OVERWRITE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_OVERWRITE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_DATE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_DATE_OFFSET; #endif MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_USER_IDX] = NGX_HTTP_CLOJURE_HEADERSI_USER_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_PASSWD_IDX] = NGX_HTTP_CLOJURE_HEADERSI_PASSWD_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_COOKIE_IDX] = NGX_HTTP_CLOJURE_HEADERSI_COOKIE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_SERVER_IDX] = NGX_HTTP_CLOJURE_HEADERSI_SERVER_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_CONTENT_LENGTH_N_IDX] = NGX_HTTP_CLOJURE_HEADERSI_CONTENT_LENGTH_N_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_KEEP_ALIVE_N_IDX] = NGX_HTTP_CLOJURE_HEADERSI_KEEP_ALIVE_N_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSI_HEADERS_IDX] = NGX_HTTP_CLOJURE_HEADERSI_HEADERS_OFFSET; /*index for size of ngx_http_headers_out_t */ MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSOT_SIZE_IDX] = NGX_HTTP_CLOJURE_HEADERSOT_SIZE; /*field offset index for ngx_http_headers_out_t*/ MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_STATUS_IDX] = NGX_HTTP_CLOJURE_HEADERSO_STATUS_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_STATUS_LINE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_STATUS_LINE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_SERVER_IDX] = NGX_HTTP_CLOJURE_HEADERSO_SERVER_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_DATE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_DATE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_LENGTH_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_LENGTH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_ENCODING_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_ENCODING_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_LOCATION_IDX] = NGX_HTTP_CLOJURE_HEADERSO_LOCATION_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_REFRESH_IDX] = NGX_HTTP_CLOJURE_HEADERSO_REFRESH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_LAST_MODIFIED_IDX] = NGX_HTTP_CLOJURE_HEADERSO_LAST_MODIFIED_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_RANGE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_RANGE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_ACCEPT_RANGES_IDX] = NGX_HTTP_CLOJURE_HEADERSO_ACCEPT_RANGES_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_WWW_AUTHENTICATE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_WWW_AUTHENTICATE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_EXPIRES_IDX] = NGX_HTTP_CLOJURE_HEADERSO_EXPIRES_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_ETAG_IDX] = NGX_HTTP_CLOJURE_HEADERSO_ETAG_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_OVERRIDE_CHARSET_IDX] = NGX_HTTP_CLOJURE_HEADERSO_OVERRIDE_CHARSET_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_LEN_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_LEN_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CHARSET_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CHARSET_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_LOWCASE_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_LOWCASE_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_HASH_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_TYPE_HASH_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CACHE_CONTROL_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CACHE_CONTROL_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_CONTENT_LENGTH_N_IDX] = NGX_HTTP_CLOJURE_HEADERSO_CONTENT_LENGTH_N_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_DATE_TIME_IDX] = NGX_HTTP_CLOJURE_HEADERSO_DATE_TIME_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_LAST_MODIFIED_TIME_IDX] = NGX_HTTP_CLOJURE_HEADERSO_LAST_MODIFIED_TIME_OFFSET; MEM_INDEX[NGX_HTTP_CLOJURE_HEADERSO_HEADERS_IDX] = NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET; MEM_INDEX[NGINX_CLOJURE_RT_WORKERS_ID] = workers; MEM_INDEX[NGINX_VER_ID] = nginx_version; MEM_INDEX[NGINX_CLOJURE_VER_ID] = nginx_clojure_ver; // (*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL); ngx_http_clojure_get_env(&jvm_env); env = jvm_env; nc_rt_class = (*jvm_env)->FindClass(env, "nginx/clojure/NginxClojureRT"); exception_handle(nc_rt_class == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); (*env)->RegisterNatives(env, nc_rt_class, nms, sizeof(nms) / sizeof(JNINativeMethod)); exception_handle(0 == 0, env, return NGX_HTTP_CLOJURE_JVM_ERR); nc_rt_register_code_mid = (*env)->GetStaticMethodID(env, nc_rt_class, "registerCode", "(JJ)I"); exception_handle(nc_rt_register_code_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); nc_rt_eval_mid = (*env)->GetStaticMethodID(env, nc_rt_class, "eval", "(IJ)I"); exception_handle(nc_rt_eval_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); nc_rt_init_mid = (*env)->GetStaticMethodID(env, nc_rt_class,"initMemIndex", "(J)V"); exception_handle(nc_rt_init_mid == NULL, env, return NGX_HTTP_CLOJURE_JVM_ERR); nc_rt_handle_response_mid = (*env)->GetStaticMethodID(env, nc_rt_class,"handleResponse", "(J)I"); (*env)->CallStaticVoidMethod(env, nc_rt_class, nc_rt_init_mid, MEM_INDEX); exception_handle(1, env, return NGX_HTTP_CLOJURE_JVM_ERR); return ngx_http_clojure_init_memory_util_flag = NGX_HTTP_CLOJURE_JVM_OK; }