// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_HEAP_COMPACTOR_H_ #define RUNTIME_VM_HEAP_COMPACTOR_H_ #include "platform/growable_array.h" #include "vm/allocation.h" #include "vm/dart_api_state.h" #include "vm/globals.h" #include "vm/visitor.h" namespace dart { // Forward declarations. class FreeList; class Heap; class OldPage; // Implements a sliding compactor. class GCCompactor : public ValueObject, public HandleVisitor, public ObjectPointerVisitor { public: GCCompactor(Thread* thread, Heap* heap) : HandleVisitor(thread), ObjectPointerVisitor(thread->isolate_group()), heap_(heap) {} ~GCCompactor() { free(image_page_ranges_); } void Compact(OldPage* pages, FreeList* freelist, Mutex* mutex); private: friend class CompactorTask; void SetupImagePageBoundaries(); void ForwardStackPointers(); void ForwardPointer(ObjectPtr* ptr); void ForwardCompressedPointer(uword heap_base, CompressedObjectPtr* ptr); void VisitTypedDataViewPointers(TypedDataViewPtr view, CompressedObjectPtr* first, CompressedObjectPtr* last); void VisitPointers(ObjectPtr* first, ObjectPtr* last); void VisitCompressedPointers(uword heap_base, CompressedObjectPtr* first, CompressedObjectPtr* last); void VisitHandle(uword addr); Heap* heap_; struct ImagePageRange { uword start; uword end; }; static int CompareImagePageRanges(const ImagePageRange* a, const ImagePageRange* b) { if (a->start < b->start) { return -1; } else if (a->start == b->start) { return 0; } else { return 1; } } intptr_t image_page_hi_ = 0; ImagePageRange* image_page_ranges_ = nullptr; // The typed data views whose inner pointer must be updated after sliding is // complete. Mutex typed_data_view_mutex_; MallocGrowableArray typed_data_views_; }; } // namespace dart #endif // RUNTIME_VM_HEAP_COMPACTOR_H_