e$B$J$+$@$G$9!#e(B
At Wed, 6 Aug 2008 17:17:30 +0900,
Nobuyoshi N. wrote in [ruby-dev:35780]:
e$BK\Ev$Ke(BRailse$B$K$=$&$$$C$?%3!<%I$,$"$k$H$9$k$H!"$$$C$?$$2?$r$7$?$$e(B
e$B$s$G$7$g$&$+!#$3$l$i$N%U%!%$%J%i%$%6$O!“BP>]%*%V%8%’%/%H<+?H$r;2e(B
e$B>H$7$F$$$k$N$G!”$I$l$b8F$P$l$J$$$H$$$&$N$,@5$7$$F0:n$@$H;W$$$^$9!#e(B
1.8e$BMQ$N%Q%C%A$G$9!#e(B
Index: common.mk
— common.mk (revision 18383)
+++ common.mk (working copy)
@@ -391,5 +391,5 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_
{$(VPATH)}rubyio.h {$(VPATH)}rubysig.h {$(VPATH)}util.h
{$(VPATH)}dln.h
-gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES)
+gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}rubyio.h
{$(VPATH)}rubysig.h {$(VPATH)}st.h {$(VPATH)}node.h
{$(VPATH)}env.h {$(VPATH)}re.h {$(VPATH)}regex.h
Index: gc.c
— gc.c (revision 18383)
+++ gc.c (working copy)
@@ -14,4 +14,5 @@
#include “ruby.h”
+#include “rubyio.h”
#include “rubysig.h”
#include “st.h”
@@ -1063,5 +1064,14 @@ gc_mark_children(ptr, lev)
}
-static void obj_free _((VALUE));
+static int obj_free _((VALUE));
+
+static inline void
+add_freelist§
- RVALUE *p;
+{
- p->as.free.flags = 0;
- p->as.free.next = freelist;
- freelist = p;
+}
static void
@@ -1073,7 +1083,5 @@ finalize_list§
run_final((VALUE)p);
if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-
add_freelist(p);
}
p = tmp;
@@ -1100,4 +1108,6 @@ free_unused_heaps()
}
+#define T_DEFERRED 0x3a
+
void rb_gc_abort_threads(void);
@@ -1143,24 +1153,26 @@ gc_sweep()
RVALUE *free = freelist;
RVALUE *final = final_list;
- if (p->as.basic.flags &&
-
((deferred = obj_free((VALUE)p)) ||
-
((FL_TEST(p, FL_FINALIZE)) && need_call_final))) {
-
if (!deferred) {
-
p->as.free.flags = T_DEFERRED;
-
RDATA(p)->dfree = 0;
-
}
-
p->as.free.flags |= FL_MARK;
p->as.free.next = final_list;
final_list = p;
}
else {
-
add_freelist(p);
}
n++;
}
- RANY§->as.free.flags = 0;
- RANY§->as.free.next = freelist;
- freelist = RANY§;
-static void
+static inline void
+make_deferred§
- RVALUE *p;
+{
- p->as.basic.flags = (p->as.basic.flags & ~T_MASK) | T_DEFERRED;
+}
-
+static int
obj_free(obj)
VALUE obj;
{
- switch (RANY(obj)->as.basic.flags & T_MASK) {
- switch (BUILTIN_TYPE(obj)) {
case T_NIL:
case T_FIXNUM:
@@ -1230,5 +1247,5 @@ obj_free(obj)
}
- switch (RANY(obj)->as.basic.flags & T_MASK) {
- switch (BUILTIN_TYPE(obj)) {
case T_OBJECT:
if (RANY(obj)->as.object.iv_tbl) {
@@ -1273,5 +1290,6 @@ obj_free(obj)
}
else if (RANY(obj)->as.data.dfree) {
- (*RANY(obj)->as.data.dfree)(DATA_PTR(obj));
- make_deferred(RANY(obj));
- return 1;
}
}
@@ -1285,6 +1303,9 @@ obj_free(obj)
case T_FILE:
if (RANY(obj)->as.file.fptr) {
-
rb_io_t *fptr = RANY(obj)->as.file.fptr;
-
make_deferred(RANY(obj));
-
RDATA(obj)->dfree = (void (*)(void*))rb_io_fptr_finalize;
-
RDATA(obj)->data = fptr;
-
return 1;
}
break;
@@ -1314,5 +1335,5 @@ obj_free(obj)
break;
}
- return; /* no need to free iv_tbl */
@@ -1337,4 +1358,6 @@ obj_free(obj)
RANY(obj)->as.basic.flags & T_MASK, obj);
}
+
@@ -1682,4 +1705,5 @@ os_obj_of(of)
case T_SCOPE:
case T_NODE:
@@ -1929,4 +1953,19 @@ rb_gc_finalize_deferred()
}
+static int
+chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
+{
void
rb_gc_call_finalizer_at_exit()
@@ -1937,18 +1976,12 @@ rb_gc_call_finalizer_at_exit()
/* run finalizers */
if (need_call_final) {
- do {
-
p = deferred_final_list;
-
deferred_final_list = 0;
-
finalize_list(p);
-
mark_tbl(finalizer_table, 0);
-
st_foreach(finalizer_table, chain_finalized_object,
-
(st_data_t)&deferred_final_list);
- } while (deferred_final_list);
}
/* run data object’s finalizers */