Commit e1225003 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1673 from cremno/rework-objspace-gc

rework mruby-objectspace and gc.[ch]
parents 7c9a1acc a2cfc9a9
...@@ -7,11 +7,16 @@ ...@@ -7,11 +7,16 @@
#ifndef MRUBY_GC_H #ifndef MRUBY_GC_H
#define MRUBY_GC_H #define MRUBY_GC_H
#include "mruby.h" #if defined(__cplusplus)
#include "mruby/value.h" extern "C" {
#endif
typedef void (each_object_callback)(mrb_state *mrb, struct RBasic* obj, void *data); typedef void (mrb_each_object_callback)(mrb_state *mrb, struct RBasic *obj, void *data);
void mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data); void mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data);
void mrb_free_context(mrb_state *mrb, struct mrb_context *c); void mrb_free_context(mrb_state *mrb, struct mrb_context *c);
#if defined(__cplusplus)
} /* extern "C" { */
#endif
#endif /* MRUBY_GC_H */ #endif /* MRUBY_GC_H */
#include <mruby.h> #include <mruby.h>
#include <mruby/gc.h> #include <mruby/gc.h>
#include <mruby/hash.h> #include <mruby/hash.h>
#include <mruby/value.h>
struct os_count_struct { struct os_count_struct {
size_t total; mrb_int total;
size_t freed; mrb_int freed;
size_t counts[MRB_TT_MAXDEFINE+1]; mrb_int counts[MRB_TT_MAXDEFINE+1];
}; };
void static void
os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data) os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
{ {
struct os_count_struct* obj_count; struct os_count_struct *obj_count;
obj_count = (struct os_count_struct*)(data); obj_count = (struct os_count_struct*)data;
if (is_dead(mrb, obj)) { if (is_dead(mrb, obj)) {
obj_count->freed++; obj_count->freed++;
} else { }
else {
obj_count->counts[obj->tt]++; obj_count->counts[obj->tt]++;
obj_count->total++; obj_count->total++;
} }
...@@ -43,11 +43,11 @@ os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data) ...@@ -43,11 +43,11 @@ os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data)
* *
*/ */
mrb_value static mrb_value
os_count_objects(mrb_state *mrb, mrb_value self) os_count_objects(mrb_state *mrb, mrb_value self)
{ {
struct os_count_struct obj_count; struct os_count_struct obj_count = { 0 };
size_t i; enum mrb_vtype i;
mrb_value hash; mrb_value hash;
if (mrb_get_args(mrb, "|H", &hash) == 0) { if (mrb_get_args(mrb, "|H", &hash) == 0) {
...@@ -58,21 +58,15 @@ os_count_objects(mrb_state *mrb, mrb_value self) ...@@ -58,21 +58,15 @@ os_count_objects(mrb_state *mrb, mrb_value self)
mrb_hash_clear(mrb, hash); mrb_hash_clear(mrb, hash);
} }
for (i = 0; i <= MRB_TT_MAXDEFINE; i++) {
obj_count.counts[i] = 0;
}
obj_count.total = 0;
obj_count.freed = 0;
mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count); mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count);
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total)); mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "FREE")), mrb_fixnum_value(obj_count.freed)); mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
for (i = 0; i < MRB_TT_MAXDEFINE; i++) { for (i = MRB_TT_FALSE; i < MRB_TT_MAXDEFINE; i++) {
mrb_value type; mrb_value type;
switch (i) { switch (i) {
#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_cstr(mrb, #t)); break; #define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_lit(mrb, #t)); break;
COUNT_TYPE(MRB_TT_FALSE); COUNT_TYPE(MRB_TT_FALSE);
COUNT_TYPE(MRB_TT_FREE); COUNT_TYPE(MRB_TT_FREE);
COUNT_TYPE(MRB_TT_TRUE); COUNT_TYPE(MRB_TT_TRUE);
...@@ -107,11 +101,13 @@ os_count_objects(mrb_state *mrb, mrb_value self) ...@@ -107,11 +101,13 @@ os_count_objects(mrb_state *mrb, mrb_value self)
} }
void void
mrb_mruby_objectspace_gem_init(mrb_state* mrb) { mrb_mruby_objectspace_gem_init(mrb_state *mrb)
{
struct RClass *os = mrb_define_module(mrb, "ObjectSpace"); struct RClass *os = mrb_define_module(mrb, "ObjectSpace");
mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_ANY()); mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
} }
void void
mrb_mruby_objectspace_gem_final(mrb_state* mrb) { mrb_mruby_objectspace_gem_final(mrb_state *mrb)
{
} }
...@@ -1281,21 +1281,21 @@ gc_generational_mode_set(mrb_state *mrb, mrb_value self) ...@@ -1281,21 +1281,21 @@ gc_generational_mode_set(mrb_state *mrb, mrb_value self)
} }
void void
mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data) mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
{ {
struct heap_page* page = mrb->heaps; struct heap_page* page = mrb->heaps;
while (page != NULL) { while (page != NULL) {
RVALUE *p, *pend; RVALUE *p, *pend;
p = page->objects; p = page->objects;
pend = p + MRB_HEAP_PAGE_SIZE; pend = p + MRB_HEAP_PAGE_SIZE;
for (;p < pend; p++) { for (;p < pend; p++) {
(*callback)(mrb, &p->as.basic, data); (*callback)(mrb, &p->as.basic, data);
}
page = page->next;
} }
page = page->next;
}
} }
#ifdef GC_TEST #ifdef GC_TEST
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment