// // Set/Get/Cleanup functions for mrb_state // static mrb_state *ap_mrb_create_mrb_state() { TRACER; mrb_state *mrb = mrb_open(); ap_mruby_class_init(mrb); return mrb; }
// mruby_run for not request phase. static int ap_mruby_run_nr(const char *mruby_code_file) { int n; struct mrb_parser_state* p; FILE *mrb_file; mrb_state *mrb = mrb_open(); ap_mruby_class_init(mrb); if ((mrb_file = fopen(mruby_code_file, "r")) == NULL) { ap_log_error(APLOG_MARK , APLOG_ERR , 0 , ap_server_conf , "%s ERROR %s: mrb file oepn failed: %s" , MODULE_NAME , __func__ , mruby_code_file ); mrb_close(mrb); return -1; } ap_log_error(APLOG_MARK , APLOG_DEBUG , 0 , ap_server_conf , "%s DEBUG %s: cache nothing on pid %d, compile code: %s" , MODULE_NAME , __func__ , getpid() , mruby_code_file ); p = mrb_parse_file(mrb, mrb_file, NULL); fclose(mrb_file); n = mrb_generate_code(mrb, p); mrb_pool_close(p->pool); ap_log_error(APLOG_MARK , APLOG_DEBUG , 0 , ap_server_conf , "%s DEBUG %s: run mruby code: %s" , MODULE_NAME , __func__ , mruby_code_file ); ap_mrb_set_status_code(OK); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) ap_mrb_raise_file_error_nr(mrb, mrb_obj_value(mrb->exc), mruby_code_file); mrb_close(mrb); return APR_SUCCESS; }
static int cpurate_from_mruby(request_rec *r) { FILE *mrb_file; mrm_config_t *conf = ap_get_module_config(r->server->module_config, &resource_manager_module); mrb_state *mrb = mrb_open(); ap_mruby_class_init(mrb); if ((mrb_file = fopen(conf->mruby_code, "r")) == NULL) { ap_log_error(APLOG_MARK , APLOG_ERR , 0 , NULL , "%s ERROR %s: mrb file oepn failed: %s" , MODULE_NAME , __func__ , conf->mruby_code ); } struct mrb_parser_state* p = mrb_parse_file(mrb, mrb_file, NULL); int n = mrb_generate_code(mrb, p->tree); mrb_pool_close(p->pool); ap_mrb_push_request(r); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value()); return OK; }
static mrb_state *ap_mrb_get_mrb_state(apr_pool_t *pool) { mrb_state *mrb = NULL; TRACER; if (apr_pool_userdata_get((void **)&mrb, "mod_mruby_state", pool) == APR_SUCCESS) { if (mrb == NULL) { ap_log_error(APLOG_MARK , APLOG_DEBUG , 0 , ap_server_conf , "%s DEBUG %s: get mrb_state is NULL, reopen mrb_state" , MODULE_NAME , __func__ ); mrb = mrb_open(); ap_mruby_class_init(mrb); ap_mrb_set_mrb_state(pool, mrb); return mrb; } else { ap_log_error(APLOG_MARK , APLOG_DEBUG , 0 , ap_server_conf , "%s DEBUG %s: mrb_state found from mod_mruby_state key: %x" , MODULE_NAME , __func__ , mrb ); return mrb; } } ap_log_error(APLOG_MARK , APLOG_ERR , 0 , ap_server_conf , "%s ERROR %s: apr_pool_userdata_get mod_mruby_state faled" , MODULE_NAME , __func__ ); return NULL; }