Backport #9463

SEGV when calling GC.start in a finalizer

Added by Usaku NAKAMURA about 1 year ago. Updated about 1 year ago.

[ruby-dev:47939]
Status:Closed
Priority:Normal
Assignee:Usaku NAKAMURA

Description

minimum reproduce code:

raise_proc = proc do |id|
  GC.start
end
3.times do
  ObjectSpace.define_finalizer(Object.new, raise_proc)
end

to fix this, need to backport r33361 and r33460.


Related issues

Related to Ruby trunk - Bug #9205: Assertion failed: heap_pages_deferred_final == 0 Closed 12/03/2013

Associated revisions

Revision 44762
Added by Usaku NAKAMURA about 1 year ago

merge revision(s) 33361,33460: [Backport #9463]

* gc.c (slot_sweep, rb_gc_finalize_deferred)
  (rb_objspace_call_finalizer, rb_gc): run finalizers
  sequencially.  

* gc.c (rb_gc_finalize_deferred, rb_objspace_call_finalizer):
  should use ATOMIC_EXCHANGE() to check the previous value.
   [Bug #5439]

History

#1 Updated by Usaku NAKAMURA about 1 year ago

  • Related to Bug #9205: Assertion failed: heap_pages_deferred_final == 0 added

#2 Updated by Usaku NAKAMURA about 1 year ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

Applied in changeset r44762.


merge revision(s) 33361,33460: [Backport #9463]

* gc.c (slot_sweep, rb_gc_finalize_deferred)
  (rb_objspace_call_finalizer, rb_gc): run finalizers
  sequencially.  

* gc.c (rb_gc_finalize_deferred, rb_objspace_call_finalizer):
  should use ATOMIC_EXCHANGE() to check the previous value.
   [Bug #5439]

Also available in: Atom PDF