Esempio n. 1
0
//
// 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;
}
Esempio n. 2
0
// 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;
}
Esempio n. 4
0
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;
}