summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-02-02 20:58:32 +0000
committertmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-02-02 20:58:32 +0000
commit829fcdb2e8572d6c23173303b04959148b2e25e5 (patch)
treeeacec5e91d4f77af00d00f3de6b39d8e6b2db839
parent8be3f74e19492a313c930e031254116df3994078 (diff)
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
-rw-r--r--ChangeLog10
-rw-r--r--gc.c9
2 files changed, 19 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9d2f5082af..43f22d94dd 100644
--- a/ChangeLog
+++ b/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
diff --git a/gc.c b/gc.c
index 5f67bdec29..104dac2b5e 100644
--- a/gc.c
+++ b/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