[Groonga-commit] groonga/groonga at a52335e [master] mruby: implement mruby initialize error

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index