Kouhei Sutou
null+****@clear*****
Tue Aug 18 19:58:52 JST 2015
Kouhei Sutou 2015-08-18 19:58:52 +0900 (Tue, 18 Aug 2015) New Revision: a52335e6ea8daf05d25bc42f92f2484f0a5cae44 https://github.com/groonga/groonga/commit/a52335e6ea8daf05d25bc42f92f2484f0a5cae44 Message: mruby: implement mruby initialize error Modified files: lib/ctx.c lib/ctx_impl_mrb.c src/groonga.c Modified: lib/ctx.c (+10 -5) =================================================================== --- lib/ctx.c 2015-08-18 19:28:49 +0900 (4258426) +++ lib/ctx.c 2015-08-18 19:58:52 +0900 (c485004) @@ -513,13 +513,13 @@ grn_msgpack_buffer_write(void *data, const char *buf, msgpack_size_t len) } #endif -static void +static grn_rc grn_ctx_impl_init(grn_ctx *ctx) { grn_io_mapinfo mi; if (!(ctx->impl = grn_io_anon_map(ctx, &mi, IMPL_SIZE))) { ctx->impl = NULL; - return; + return ctx->rc; } #ifdef USE_DYNAMIC_MALLOC_CHANGE grn_ctx_impl_init_malloc(ctx); @@ -536,7 +536,7 @@ grn_ctx_impl_init(grn_ctx *ctx) CRITICAL_SECTION_FIN(ctx->impl->lock); grn_io_anon_unmap(ctx, &mi, IMPL_SIZE); ctx->impl = NULL; - return; + return ctx->rc; } if (!(ctx->impl->ios = grn_hash_create(ctx, NULL, GRN_TABLE_MAX_KEY_SIZE, sizeof(grn_io *), @@ -545,7 +545,7 @@ grn_ctx_impl_init(grn_ctx *ctx) CRITICAL_SECTION_FIN(ctx->impl->lock); grn_io_anon_unmap(ctx, &mi, IMPL_SIZE); ctx->impl = NULL; - return; + return ctx->rc; } ctx->impl->db = NULL; @@ -594,6 +594,8 @@ grn_ctx_impl_init(grn_ctx *ctx) #endif grn_ctx_impl_mrb_init(ctx); + + return ctx->rc; } void @@ -918,7 +920,10 @@ grn_init(void) GRN_LOG(ctx, GRN_LOG_ALERT, "grn_com_init failed (%d)", rc); return rc; } - grn_ctx_impl_init(ctx); + if ((rc = grn_ctx_impl_init(ctx))) { + GRN_LOG(ctx, GRN_LOG_ALERT, "grn_ctx_impl_init failed (%d)", rc); + return rc; + } if ((rc = grn_plugins_init())) { GRN_LOG(ctx, GRN_LOG_ALERT, "grn_plugins_init failed (%d)", rc); return rc; Modified: lib/ctx_impl_mrb.c (+34 -14) =================================================================== --- lib/ctx_impl_mrb.c 2015-08-18 19:28:49 +0900 (d26684d) +++ lib/ctx_impl_mrb.c 2015-08-18 19:58:52 +0900 (88adf39) @@ -65,6 +65,7 @@ # include "mrb/mrb_writer.h" # include <mruby/array.h> +# include <mruby/string.h> # include <mruby/variable.h> #endif /* GRN_WITH_MRUBY */ @@ -104,13 +105,12 @@ mrb_kernel_load(mrb_state *mrb, mrb_value self) return mrb_true_value(); } -static void -grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) +static mrb_value +mrb_groonga_init(mrb_state *mrb, mrb_value self) { - mrb_state *mrb = ctx->impl->mrb.state; + grn_ctx *ctx = mrb->ud; - mrb->ud = ctx; - ctx->impl->mrb.module = mrb_define_module(mrb, "Groonga"); + mrb_undef_class_method(mrb, ctx->impl->mrb.module, "init"); mrb_define_class(mrb, "LoadError", mrb_class_get(mrb, "ScriptError")); mrb_define_method(mrb, mrb->kernel_module, @@ -175,6 +175,20 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) grn_mrb_writer_init(ctx); grn_mrb_load(ctx, "initialize/post.rb"); + + return mrb_nil_value(); +} + +static void +grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) +{ + mrb_state *mrb = ctx->impl->mrb.state; + + mrb->ud = ctx; + ctx->impl->mrb.module = mrb_define_module(mrb, "Groonga"); + mrb_define_class_method(mrb, ctx->impl->mrb.module, + "init", mrb_groonga_init, MRB_ARGS_NONE()); + mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "init", 0); } void @@ -195,17 +209,23 @@ grn_ctx_impl_mrb_init(grn_ctx *ctx) ctx->impl->mrb.state = mrb; ctx->impl->mrb.base_directory[0] = '\0'; grn_ctx_impl_mrb_init_bindings(ctx); - /* TODO: Implement better error handling on init. */ if (ctx->impl->mrb.state->exc) { - mrb_print_error(mrb); + mrb_value reason; + reason = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0); + ERR(GRN_UNKNOWN_ERROR, + "failed to initialize mruby: %.*s", + RSTRING_LEN(reason), RSTRING_PTR(reason)); + mrb_close(ctx->impl->mrb.state); + ctx->impl->mrb.state = NULL; + } else { + ctx->impl->mrb.checked_procs = + grn_hash_create(ctx, NULL, sizeof(grn_id), 0, GRN_HASH_TINY); + ctx->impl->mrb.registered_plugins = + grn_hash_create(ctx, NULL, sizeof(grn_id), 0, GRN_HASH_TINY); + GRN_VOID_INIT(&(ctx->impl->mrb.buffer.from)); + GRN_VOID_INIT(&(ctx->impl->mrb.buffer.to)); + ctx->impl->mrb.builtin.time_class = mrb_class_get(mrb, "Time"); } - ctx->impl->mrb.checked_procs = - grn_hash_create(ctx, NULL, sizeof(grn_id), 0, GRN_HASH_TINY); - ctx->impl->mrb.registered_plugins = - grn_hash_create(ctx, NULL, sizeof(grn_id), 0, GRN_HASH_TINY); - GRN_VOID_INIT(&(ctx->impl->mrb.buffer.from)); - GRN_VOID_INIT(&(ctx->impl->mrb.buffer.to)); - ctx->impl->mrb.builtin.time_class = mrb_class_get(mrb, "Time"); } } Modified: src/groonga.c (+5 -1) =================================================================== --- src/groonga.c 2015-08-18 19:28:49 +0900 (6a1c2a5) +++ src/groonga.c 2015-08-18 19:58:52 +0900 (2b4ac32) @@ -3176,7 +3176,11 @@ main(int argc, char **argv) line_editor_init(argc, argv); } #endif - if (grn_init()) { return EXIT_FAILURE; } + grn_gctx.errbuf[0] = '\0'; + if (grn_init()) { + fprintf(stderr, "failed to initialize Groonga: %s\n", grn_gctx.errbuf); + return EXIT_FAILURE; + } grn_set_default_encoding(encoding); -------------- next part -------------- HTML����������������������������...Download