gc.c: ensure GC state is consistent during VM shutdown
* gc.c (rb_objspace_free): cause rb_bug if lazy sweep is in progress during rb_objspace_free. Adds extra protection for r46340. Patch by Vicent Marti. [Bug #10768] [ruby-core:67734] * gc.c (rb_objspace_call_finalizer): Ensure GC is completed after finalizers have run. We already call gc_rest() before invoking finalizers, but finalizer can allocate new objects and start new GC cycle, so we call gc_rest() again after finalizers are complete. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49474 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8be3f74e19
commit
829fcdb2e8
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Tue Feb 3 05:52:00 2015 Aman Gupta <ruby@tmm1.net>
|
||||
|
||||
* gc.c (rb_objspace_free): cause rb_bug if lazy sweep is in progress
|
||||
during rb_objspace_free. Adds extra protection for r46340.
|
||||
Patch by Vicent Marti. [Bug #10768] [ruby-core:67734]
|
||||
* gc.c (rb_objspace_call_finalizer): Ensure GC is completed after
|
||||
finalizers have run. We already call gc_rest() before invoking
|
||||
finalizers, but finalizer can allocate new objects and start new GC
|
||||
cycle, so we call gc_rest() again after finalizers are complete.
|
||||
|
||||
Mon Feb 2 10:51:34 2015 Ari Pollak <ajp@aripollak.com>
|
||||
|
||||
* doc/security.rdoc (Symbols): update about Symbol GC. Symbols
|
||||
|
|
9
gc.c
9
gc.c
|
@ -1209,6 +1209,9 @@ static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page);
|
|||
void
|
||||
rb_objspace_free(rb_objspace_t *objspace)
|
||||
{
|
||||
if (is_lazy_sweeping(heap_eden))
|
||||
rb_bug("lazy sweeping underway when freeing object space");
|
||||
|
||||
if (objspace->profile.records) {
|
||||
free(objspace->profile.records);
|
||||
objspace->profile.records = 0;
|
||||
|
@ -2620,6 +2623,12 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
|
|||
st_free_table(finalizer_table);
|
||||
finalizer_table = 0;
|
||||
ATOMIC_SET(finalizing, 0);
|
||||
|
||||
/*
|
||||
* finish any lazy sweeps that may have been started
|
||||
* when finalizing the objects in the heap
|
||||
*/
|
||||
gc_rest(objspace);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
Loading…
Reference in New Issue