marshal.c: use hidden objects to allow recycling
Hidden objects (klass == 0) are not visible to Ruby code invoked from other threads or signal handlers, so they can never be accessed from other contexts. This makes it safe to call rb_gc_force_recycle on the object slot after releasing malloc memory. * marshal.c (rb_marshal_dump_limited): hide dump_arg and recycle when done (rb_marshal_load_with_proc): hide load_arg and recycle when done [ruby-core:79518] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b89623fb1e
commit
9f20ee518d
12
marshal.c
12
marshal.c
@ -1026,7 +1026,7 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
|
|||||||
struct dump_arg *arg;
|
struct dump_arg *arg;
|
||||||
VALUE wrapper; /* used to avoid memory leak in case of exception */
|
VALUE wrapper; /* used to avoid memory leak in case of exception */
|
||||||
|
|
||||||
wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
|
wrapper = TypedData_Make_Struct(0, struct dump_arg, &dump_arg_data, arg);
|
||||||
arg->dest = 0;
|
arg->dest = 0;
|
||||||
arg->symbols = st_init_numtable();
|
arg->symbols = st_init_numtable();
|
||||||
arg->data = rb_init_identtable();
|
arg->data = rb_init_identtable();
|
||||||
@ -1053,8 +1053,8 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
|
|||||||
rb_io_write(arg->dest, arg->str);
|
rb_io_write(arg->dest, arg->str);
|
||||||
rb_str_resize(arg->str, 0);
|
rb_str_resize(arg->str, 0);
|
||||||
}
|
}
|
||||||
clear_dump_arg(arg);
|
free_dump_arg(arg);
|
||||||
RB_GC_GUARD(wrapper);
|
rb_gc_force_recycle(wrapper);
|
||||||
|
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
@ -2053,7 +2053,7 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
|
|||||||
else {
|
else {
|
||||||
io_needed();
|
io_needed();
|
||||||
}
|
}
|
||||||
wrapper = TypedData_Make_Struct(rb_cData, struct load_arg, &load_arg_data, arg);
|
wrapper = TypedData_Make_Struct(0, struct load_arg, &load_arg_data, arg);
|
||||||
arg->infection = infection;
|
arg->infection = infection;
|
||||||
arg->src = port;
|
arg->src = port;
|
||||||
arg->offset = 0;
|
arg->offset = 0;
|
||||||
@ -2084,8 +2084,8 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
|
|||||||
|
|
||||||
if (!NIL_P(proc)) arg->proc = proc;
|
if (!NIL_P(proc)) arg->proc = proc;
|
||||||
v = r_object(arg);
|
v = r_object(arg);
|
||||||
clear_load_arg(arg);
|
free_load_arg(arg);
|
||||||
RB_GC_GUARD(wrapper);
|
rb_gc_force_recycle(wrapper);
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user