summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-08-09 03:58:52 +0900
committerYukihiro Matsumoto <[email protected]>2012-08-09 03:58:52 +0900
commit8d017ebdb79b8299a1cfb273868b12ba3cfbed16 (patch)
tree3df391050dee201fecb110086dc0be919a7a3713 /src
parent6b2e0b210b752669a545120942c7e3b136d395c4 (diff)
downloadmruby-8d017ebdb79b8299a1cfb273868b12ba3cfbed16.tar.gz
mruby-8d017ebdb79b8299a1cfb273868b12ba3cfbed16.zip
add GC.disable and GC.enable
Diffstat (limited to 'src')
-rw-r--r--src/gc.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/gc.c b/src/gc.c
index 9a630f626..0b01164d5 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -796,6 +796,7 @@ mrb_incremental_gc(mrb_state *mrb)
{
size_t limit = 0, result = 0;
+ if (mrb->gc_disabled) return;
GC_INVOKE_TIME_REPORT;
GC_TIME_START;
@@ -826,6 +827,7 @@ mrb_garbage_collect(mrb_state *mrb)
{
size_t max_limit = ~0;
+ if (mrb->gc_disabled) return;
GC_INVOKE_TIME_REPORT;
GC_TIME_START;
@@ -918,6 +920,51 @@ gc_start(mrb_state *mrb, mrb_value obj)
/*
* call-seq:
+ * GC.enable -> true or false
+ *
+ * Enables garbage collection, returning <code>true</code> if garbage
+ * collection was previously disabled.
+ *
+ * GC.disable #=> false
+ * GC.enable #=> true
+ * GC.enable #=> false
+ *
+ */
+
+static mrb_value
+gc_enable(mrb_state *mrb, mrb_value obj)
+{
+ int old = mrb->gc_disabled;
+
+ mrb->gc_disabled = FALSE;
+ if (old) return mrb_true_value();
+ return mrb_false_value();
+}
+
+/*
+ * call-seq:
+ * GC.disable -> true or false
+ *
+ * Disables garbage collection, returning <code>true</code> if garbage
+ * collection was already disabled.
+ *
+ * GC.disable #=> false
+ * GC.disable #=> true
+ *
+ */
+
+static mrb_value
+gc_disable(mrb_state *mrb, mrb_value obj)
+{
+ int old = mrb->gc_disabled;
+
+ mrb->gc_disabled = TRUE;
+ if (old) return mrb_true_value();
+ return mrb_false_value();
+}
+
+/*
+ * call-seq:
* GC.interval_ratio -> fixnum
*
* Returns ratio of GC interval. Default value is 200(%).
@@ -989,6 +1036,8 @@ mrb_init_gc(mrb_state *mrb)
gc = mrb_define_module(mrb, "GC");
mrb_define_class_method(mrb, gc, "start", gc_start, ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "enable", gc_enable, ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "disable", gc_disable, ARGS_NONE());
mrb_define_class_method(mrb, gc, "interval_ratio", gc_interval_ratio_get, ARGS_NONE());
mrb_define_class_method(mrb, gc, "interval_ratio=", gc_interval_ratio_set, ARGS_REQ(1));
mrb_define_class_method(mrb, gc, "step_ratio", gc_step_ratio_get, ARGS_NONE());