| Index: src/global-handles.cc
|
| diff --git a/src/global-handles.cc b/src/global-handles.cc
|
| index 9ede90852831707059f5a3d174727236a0fb4b81..a9caf59476326d0bae25c461f326203db96b400b 100644
|
| --- a/src/global-handles.cc
|
| +++ b/src/global-handles.cc
|
| @@ -372,13 +372,14 @@ void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
|
|
|
| int post_gc_processing_count = 0;
|
|
|
| -void GlobalHandles::PostGarbageCollectionProcessing() {
|
| +bool GlobalHandles::PostGarbageCollectionProcessing() {
|
| // Process weak global handle callbacks. This must be done after the
|
| // GC is completely done, because the callbacks may invoke arbitrary
|
| // API functions.
|
| // At the same time deallocate all DESTROYED nodes.
|
| ASSERT(Heap::gc_state() == Heap::NOT_IN_GC);
|
| const int initial_post_gc_processing_count = ++post_gc_processing_count;
|
| + bool next_gc_could_collect_more = false;
|
| Node** p = &head_;
|
| while (*p != NULL) {
|
| if ((*p)->PostGarbageCollectionProcessing()) {
|
| @@ -399,6 +400,7 @@ void GlobalHandles::PostGarbageCollectionProcessing() {
|
| }
|
| node->set_next_free(first_deallocated());
|
| set_first_deallocated(node);
|
| + next_gc_could_collect_more = true;
|
| } else {
|
| p = (*p)->next_addr();
|
| }
|
| @@ -407,6 +409,8 @@ void GlobalHandles::PostGarbageCollectionProcessing() {
|
| if (first_deallocated()) {
|
| first_deallocated()->set_next(head());
|
| }
|
| +
|
| + return next_gc_could_collect_more;
|
| }
|
|
|
|
|
|
|