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;
}
Ejemplo n.º 2
0
mrb_value ap_mrb_init_env(mrb_state *mrb, mrb_value self)
{
    request_rec *r = ap_mrb_get_request();
    ap_add_common_vars(r);
    ap_add_cgi_vars(r);
    ap_mrb_push_request(r);

    return self;
}
Ejemplo n.º 3
0
static int ap_mruby_run_inline(mrb_state *mrb, request_rec *r, mod_mruby_code_t *c)
{
    int ai;
    mrb_value ret;

    // mutex lock
    if (apr_thread_mutex_lock(mod_mruby_mutex) != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex lock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }
    ap_mrb_push_request(r);
    ai = mrb_gc_arena_save(mrb);
    ap_log_rerror(APLOG_MARK
        , APLOG_DEBUG
        , 0
        , r
        , "%s DEBUG %s: irep[%d] inline core run: inline code = %s"
        , MODULE_NAME
        , __func__
        , c->irep_idx_start
        , c->code
    );
    ret = mrb_run(mrb
        , mrb_proc_new(mrb, mrb->irep[c->irep_idx_start])
        , mrb_top_self(mrb)
    );
    mrb_gc_arena_restore(mrb, ai);
    ap_mruby_state_clean(mrb);
    // mutex unlock
    if (apr_thread_mutex_unlock(mod_mruby_mutex) != APR_SUCCESS){
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex unlock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }

    return OK;
}
Ejemplo n.º 4
0
static int ap_mruby_run(mrb_state *mrb, request_rec *r, mod_mruby_code_t *code, int module_status)
{

    int ai, i, last_idx;
    jmp_buf mod_mruby_jmp;
    TRACER;

    // mutex lock
    if (apr_thread_mutex_lock(mod_mruby_mutex) != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex lock failed"
            , MODULE_NAME
            , __func__
        );
        return DECLINED;
    }

    ap_mrb_push_request(r);
    if (code->cache == CACHE_DISABLE) {
        mod_mruby_compile_code(mrb, code, r->server);
    }
    ai = mrb_gc_arena_save(mrb);
    ap_log_rerror(APLOG_MARK
        , APLOG_DEBUG
        , 0
        , r
        , "%s DEBUG %s: run mruby code: path=[%s] irep_idx=[%d]~[%d] cache=[%d]"
        , MODULE_NAME
        , __func__
        , code->path
        , code->irep_idx_start
        , code->irep_idx_end
        , code->cache
    );

    ap_mrb_set_status_code(OK);
    if (!setjmp(mod_mruby_jmp)) {
        mrb->jmp = &mod_mruby_jmp;
        mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[code->irep_idx_start]), mrb_top_self(mrb));
    }

    mrb->jmp = 0;
    mrb_gc_arena_restore(mrb, ai);

    if (mrb->exc)
        ap_mrb_raise_file_error(mrb, mrb_obj_value(mrb->exc), r, code->path);

    ap_log_rerror(APLOG_MARK
        , APLOG_DEBUG
        , 0
        , r
        , "%s DEBUG %s: irep_idx=%d return mruby code(%d): %s"
        , MODULE_NAME
        , __func__
        , code->irep_idx_start
        , ap_mrb_get_status_code()
        , code->path
    );
    if (code->cache == CACHE_DISABLE) {
        last_idx = mrb->irep_len;
        mrb->irep_len = code->irep_idx_start;
        for (i = code->irep_idx_start; i < last_idx; i++) {
            ap_log_rerror(APLOG_MARK
                , APLOG_DEBUG
                , 0
                , r
                , "%s DEBUG %s: irep[%d] cleaning"
                , MODULE_NAME
                , __func__
                , i
            );
            ap_mruby_irep_clean(mrb, mrb->irep[i], r);
        }
    }
    ap_mruby_state_clean(mrb);

    // mutex unlock
    if (apr_thread_mutex_unlock(mod_mruby_mutex) != APR_SUCCESS){
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex unlock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }

    return ap_mrb_get_status_code();
}