From a9998a7816d341fd8bf96a4b0981db581afb59cf Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Mon, 20 Feb 2023 11:45:07 +0100 Subject: [PATCH] Fixed mark skipping Co-authored-by: ValterMiari --- src/GC/Makefile | 3 +- src/GC/lib/heap.cpp | 56 ++++++++++++++++++++++++++++++------ src/GC/lib/heap.o | Bin 137120 -> 138408 bytes src/GC/lib/libheap.so | Bin 82728 -> 82920 bytes src/GC/tests/extern_lib.cpp | 10 +++---- src/GC/tests/h_test.cpp | 25 ++++++++++++---- 6 files changed, 73 insertions(+), 21 deletions(-) diff --git a/src/GC/Makefile b/src/GC/Makefile index b99d2a4..00389c3 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -36,8 +36,7 @@ linker_vg: valgrind $(VGFLAGS) tests/linker.out extern_lib: - rm -f lib/heap.o - rm -f lib/libheap.so + rm -f lib/heap.o lib/libheap.so tests/extern_lib.out $(CC) $(STDFLAGS) -c -fPIC -o lib/heap.o lib/heap.cpp $(CC) $(STDFLAGS) -shared -o lib/libheap.so lib/heap.o $(CC) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index a222833..d13cec6 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -20,6 +20,7 @@ namespace GC { */ void Heap::check_init() { auto heap = Heap::the(); + cout << "Heap addr:\t" << heap << endl; cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; auto stack_start = reinterpret_cast(__builtin_frame_address(0)); cout << "GC stack_start:\t" << stack_start << endl; @@ -172,10 +173,11 @@ namespace GC { if (heap->m_stack_end != nullptr) stack_end = heap->m_stack_end; else - stack_end = (uintptr_t *) stack_start - 40; // dummy value + stack_end = (uintptr_t *) stack_start - 80; // dummy value + cout << "Stack end in collect: " << stack_end << endl; auto work_list = heap->m_allocated_chunks; - // print_worklist(work_list); + //print_worklist(work_list); if (flags & MARK) { mark(stack_start, stack_end, work_list); @@ -210,20 +212,58 @@ namespace GC { void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { for (; start > end; start--) { // to find adresses thats in the worklist if (*start % 8 == 0) { // all pointers must be aligned as double words - for (size_t i = 0; i < worklist.size(); i++) { // fix this - auto chunk = worklist.at(i); + for (auto it = worklist.begin(); it != worklist.end();) { + //for (size_t i = 0; i < worklist.size(); i++) { // fix this + //auto chunk = worklist.at(i); + auto chunk = *it; uintptr_t c_start = reinterpret_cast(chunk->start); uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); if (c_start <= *start && *start < c_end) { uintptr_t c_start = reinterpret_cast(chunk->start); if (!chunk->marked) { chunk->marked = true; - worklist.erase(worklist.begin() + i); - auto new_stack_start = reinterpret_cast(start); - mark(new_stack_start, end, worklist); // - return; + //worklist.erase(worklist.begin() + i); + it = worklist.erase(it); + //auto new_stack_start = reinterpret_cast(start); + //mark(new_stack_start, end, worklist); // + //return; + } + else { + ++it; } } + else { + ++it; + } + } + } + } + } + + // Mark child references from the root references + void mark_test(vector worklist) { + while (worklist.size() > 0) { + Chunk *ref = worklist.back(); + worklist.pop_back(); + Chunk *child = (Chunk*) ref; // this is probably not correct + if (child != nullptr && !child->marked) { + child->marked = true; + worklist.push_back(child); + mark_test(worklist); + } + } + } + + // Mark the root references and look for child references to them + void mark_from_roots(uintptr_t *start, const uintptr_t *end) { + vector worklist; + for (;start > end; start --) { + if (*start % 8 == 0) { // all pointers must be aligned as double words + Chunk *ref = (Chunk*) *start; + if (ref != nullptr && !ref->marked) { + ref->marked = true; + worklist.push_back(ref); + //mark_test(worklist) } } } diff --git a/src/GC/lib/heap.o b/src/GC/lib/heap.o index 2f2a154ff8b4dc0a38c5b68f34e79b2532e61b68..0e5421d2990b2561b9577b4d3ef9c10913213458 100644 GIT binary patch delta 30176 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 TIy0JcJ+OkbqnQ~&VI~Iv15=k% diff --git a/src/GC/tests/extern_lib.cpp b/src/GC/tests/extern_lib.cpp index 5f3e0c7..2d47576 100644 --- a/src/GC/tests/extern_lib.cpp +++ b/src/GC/tests/extern_lib.cpp @@ -3,11 +3,9 @@ #include "heap.hpp" -// using namespace std; - -// GC::Heap *singleton_test(); -// void init_gc(GC::Heap *heap); -// void frame_test(GC::Heap *heap); +GC::Heap *singleton_test(); +void init_gc(GC::Heap *heap); +void frame_test(GC::Heap *heap); GC::Heap *singleton_test() { std::cout << "TESTING SINGLETON INSTANCES" << std::endl; @@ -38,11 +36,13 @@ void frame_test(GC::Heap *heap) { std::cout << "Previous stack frame:\t" << prev_frame << std::endl; heap->check_init(); + // auto alloced = heap->alloc(sizeof(unsigned long)); std::cout << "===========================" << std::endl; } int main() { + std::cout << "in main" << std::endl; auto heap = singleton_test(); init_gc(heap); diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 774f091..65f51d6 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -2,21 +2,34 @@ GC::Heap *gc = GC::Heap::the(); +/* void assign(int *dst) { + int *local = static_cast(gc->alloc(sizeof(int))); + *local = 10; + dst = reinterpret_cast(dst); + *dst = local; +} */ + void init() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - auto stack_end = stack_start - 40; + //auto stack_end = stack_start - 40; std::cout << "Stack start from init:\t" << stack_start << std::endl; - std::cout << "Imaginary stack end:\t" << stack_end << std::endl; + //std::cout << "Imaginary stack end:\t" << stack_end << std::endl; int *arr = static_cast(gc->alloc(sizeof(int) * 100)); - std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; + //std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; for (int i = 0; i < (sizeof(int) * 100); i++) { arr[i] = i; } - std::cout << "First stack pointer:\t" << &arr << std::endl; + for (int i = 0; i < (sizeof(int) * 20); i++) { + gc->alloc(sizeof(int)); + } + std::cout << "Pointer for arr:\t" << &arr << std::endl; long a = 20; long *l = static_cast(gc->alloc(sizeof(long))); - l = &a; + std::cout << "Pointer for l:\t\t" << &l << std::endl; + int *i = static_cast(gc->alloc(sizeof(int))); + std::cout << "Pointer for i:\t\t" << &i << std::endl; + //l = &a; //*l = 20; } @@ -24,7 +37,7 @@ int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; init(); - gc->collect(MARK | SWEEP | FREE); + gc->collect(MARK | SWEEP); // some bug in free (vector out of range) gc->print_contents(); //delete gc; return 0;