Merge branch 'g-collection' of https://github.com/bachelor-group-66-systemf/churf into g-collection

This commit is contained in:
Victor Olin 2023-05-15 18:27:27 +02:00
commit 4d427ea00e
4 changed files with 163 additions and 0 deletions

View file

@ -69,6 +69,7 @@ static_lib:
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/event.o lib/event.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/event.o lib/event.cpp -fPIC
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/profiler.o lib/profiler.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/profiler.o lib/profiler.cpp -fPIC
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/heap.o lib/heap.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -c -o lib/heap.o lib/heap.cpp -fPIC
<<<<<<< HEAD
# create static library # create static library
ar r lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o ar r lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o
@ -92,6 +93,8 @@ wrapper:
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -g -c -o lib/heap.o lib/heap.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -g -c -o lib/heap.o lib/heap.cpp -fPIC
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -g -c -o lib/cheap.o lib/cheap.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -g -c -o lib/cheap.o lib/cheap.cpp -fPIC
<<<<<<< HEAD <<<<<<< HEAD
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
# create static library # create static library
ar r lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o ar r lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o
======= =======
@ -100,19 +103,35 @@ wrapper:
alloc_free_list: static_lib alloc_free_list: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/alloc_fl.out tests/alloc_free_list.cpp lib/gcoll.a $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/alloc_fl.out tests/alloc_free_list.cpp lib/gcoll.a
<<<<<<< HEAD
linked_list_test: static_lib linked_list_test: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/linkedlist.out tests/linkedlist.cpp lib/gcoll.a $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/linkedlist.out tests/linkedlist.cpp lib/gcoll.a
<<<<<<< HEAD <<<<<<< HEAD
>>>>>>> d7ea27e (testing testing...) >>>>>>> d7ea27e (testing testing...)
======= =======
=======
# create test program
static_lib_test: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/extern_lib.out tests/extern_lib.cpp lib/gcoll.a
alloc_free_list: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/alloc_fl.out tests/alloc_free_list.cpp lib/gcoll.a
linked_list_test: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/linkedlist.out tests/linkedlist.cpp lib/gcoll.a
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
revrange: static_lib revrange: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/revrange.out tests/revrange.cpp lib/gcoll.a $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/revrange.out tests/revrange.cpp lib/gcoll.a
pointers: static_lib pointers: static_lib
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/pointers.out tests/pointers.cpp lib/gcoll.a $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -o tests/pointers.out tests/pointers.cpp lib/gcoll.a
<<<<<<< HEAD
>>>>>>> a910d54 (rip gc) >>>>>>> a910d54 (rip gc)
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
wrapper: wrapper:
# remove old files # remove old files
rm -f lib/event.o lib/profiler.o lib/heap.o lib/coll.a tests/wrapper.out rm -f lib/event.o lib/profiler.o lib/heap.o lib/coll.a tests/wrapper.out
@ -122,8 +141,14 @@ wrapper:
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -c -o lib/heap.o lib/heap.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -c -o lib/heap.o lib/heap.cpp -fPIC
$(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -c -o lib/cheap.o lib/cheap.cpp -fPIC $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -O3 -c -o lib/cheap.o lib/cheap.cpp -fPIC
# compile object files into library # compile object files into library
<<<<<<< HEAD
>>>>>>> 01c93a6 (Wrapper docs) >>>>>>> 01c93a6 (Wrapper docs)
ar rcs lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o lib/cheap.o ar rcs lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o lib/cheap.o
# compile test program wrapper.c with normal clang # compile test program wrapper.c with normal clang
clang -stdlib=libc++ $(WFLAGS) $(LIB_INCL) -o tests/wrapper.out tests/wrapper.c lib/gcoll.a -lstdc++ clang -stdlib=libc++ $(WFLAGS) $(LIB_INCL) -o tests/wrapper.out tests/wrapper.c lib/gcoll.a -lstdc++
>>>>>>> 12816ea (Wrapper works) >>>>>>> 12816ea (Wrapper works)
=======
ar rcs lib/gcoll.a lib/event.o lib/profiler.o lib/heap.o lib/cheap.o
# compile test program wrapper.c with normal clang
clang -stdlib=libc++ $(WFLAGS) $(LIB_INCL) -o tests/wrapper.out tests/wrapper.c lib/gcoll.a -lstdc++
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c

View file

@ -7,11 +7,16 @@
extern "C" { extern "C" {
#endif #endif
<<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
#define WRAPPER_DEBUG #define WRAPPER_DEBUG
======= =======
#define DEBUG #define DEBUG
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
=======
#define DEBUG
#define WRAPPER_DEBUG
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
#ifdef WRAPPER_DEBUG #ifdef WRAPPER_DEBUG
typedef struct cheap typedef struct cheap

View file

@ -12,6 +12,7 @@
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD
#define HEAP_SIZE 320//65536 #define HEAP_SIZE 320//65536
#define FREE_THRESH (uint) 0 #define FREE_THRESH (uint) 0
======= =======
@ -28,6 +29,11 @@
#define FREE_THRESH (uint) 100000 //1000 #define FREE_THRESH (uint) 100000 //1000
#define DEBUG #define DEBUG
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
=======
#define HEAP_SIZE 160000//65536
#define FREE_THRESH (uint) 5
// #define HEAP_DEBUG
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
namespace GC namespace GC
{ {
@ -81,11 +87,16 @@ namespace GC
std::vector<Chunk *> m_allocated_chunks; std::vector<Chunk *> m_allocated_chunks;
std::vector<Chunk *> m_freed_chunks; std::vector<Chunk *> m_freed_chunks;
<<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
std::list<Chunk *> m_free_list; std::list<Chunk *> m_free_list;
======= =======
std::unordered_map<uintptr_t, Chunk*> m_chunk_table; std::unordered_map<uintptr_t, Chunk*> m_chunk_table;
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
=======
std::list<Chunk *> m_free_list;
std::unordered_map<uintptr_t, Chunk*> m_chunk_table;
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
static bool profiler_enabled(); static bool profiler_enabled();
// static Chunk *get_at(std::vector<Chunk *> &list, size_t n); // static Chunk *get_at(std::vector<Chunk *> &list, size_t n);

View file

@ -3,6 +3,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <vector> #include <vector>
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD
=======
#include <unordered_map>
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
#include <chrono> #include <chrono>
#include <queue> #include <queue>
#include <set> #include <set>
@ -12,6 +16,7 @@
#define time_now std::chrono::high_resolution_clock::now() #define time_now std::chrono::high_resolution_clock::now()
#define to_us std::chrono::duration_cast<std::chrono::microseconds> #define to_us std::chrono::duration_cast<std::chrono::microseconds>
<<<<<<< HEAD
using std::cout, std::endl, std::vector, std::hex, std::dec; using std::cout, std::endl, std::vector, std::hex, std::dec;
======= =======
#include <unordered_map> #include <unordered_map>
@ -20,6 +25,9 @@ using std::cout, std::endl, std::vector, std::hex, std::dec;
using std::cout, std::endl, std::vector, std::hex, std::dec, std::unordered_map; using std::cout, std::endl, std::vector, std::hex, std::dec, std::unordered_map;
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
=======
using std::cout, std::endl, std::vector, std::hex, std::dec, std::unordered_map;
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
namespace GC namespace GC
{ {
@ -104,6 +112,7 @@ namespace GC
heap.collect(stack_bottom); heap.collect(stack_bottom);
// If memory is not enough after collect, crash with OOM error // If memory is not enough after collect, crash with OOM error
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
if (heap.m_size + size > HEAP_SIZE) if (heap.m_size + size > HEAP_SIZE)
{ {
@ -114,14 +123,19 @@ namespace GC
======= =======
======= =======
>>>>>>> 208ff86 (Fixed bug in size handling and mark hash) >>>>>>> 208ff86 (Fixed bug in size handling and mark hash)
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
if (heap.m_size > HEAP_SIZE) if (heap.m_size > HEAP_SIZE)
{ {
throw std::runtime_error(std::string("Error: Heap out of memory")); throw std::runtime_error(std::string("Error: Heap out of memory"));
} }
//throw std::runtime_error(std::string("Error: Heap out of memory")); //throw std::runtime_error(std::string("Error: Heap out of memory"));
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
======= =======
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
} }
if (heap.m_size + size > HEAP_SIZE) if (heap.m_size + size > HEAP_SIZE)
{ {
@ -256,6 +270,7 @@ namespace GC
// create_table(); // create_table();
// mark_hash(stack_bottom, stack_top); // mark_hash(stack_bottom, stack_top);
<<<<<<< HEAD
vector<uintptr_t *> roots; vector<uintptr_t *> roots;
// cout << "\nb4 find_roots\n"; // cout << "\nb4 find_roots\n";
find_roots(stack_bottom, roots); find_roots(stack_bottom, roots);
@ -263,6 +278,16 @@ namespace GC
// cout << "b4 mark\n";'' // cout << "b4 mark\n";''
mark(roots); mark(roots);
=======
create_table();
vector<uintptr_t *> roots;
// cout << "\nb4 find_roots\n";
find_roots(stack_bottom, roots);
// cout << "b4 mark\n";''
mark(roots);
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
// cout << "b4 sweep\n"; // cout << "b4 sweep\n";
sweep(heap); sweep(heap);
@ -320,6 +345,7 @@ namespace GC
} }
void Heap::find_chunks(uintptr_t *stack_addr, std::queue<std::pair<uintptr_t, uintptr_t>> &chunk_spaces) void Heap::find_chunks(uintptr_t *stack_addr, std::queue<std::pair<uintptr_t, uintptr_t>> &chunk_spaces)
<<<<<<< HEAD
{ {
auto iter = m_allocated_chunks.begin(); auto iter = m_allocated_chunks.begin();
auto end = m_allocated_chunks.end(); auto end = m_allocated_chunks.end();
@ -346,12 +372,70 @@ namespace GC
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
void Heap::mark_range(vector<AddrRange *> &ranges, vector<Chunk *> &worklist) void Heap::mark_range(vector<AddrRange *> &ranges, vector<Chunk *> &worklist)
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
{ {
Heap &heap = Heap::the(); Heap &heap = Heap::the();
auto it = heap.m_chunk_table.find(*stack_addr);
if (it != heap.m_chunk_table.end())
{
auto chunk = it->second;
if (!chunk->m_marked)
{
auto c_start = reinterpret_cast<uintptr_t>(chunk->m_start);
auto c_size = reinterpret_cast<uintptr_t>(chunk->m_size);
auto c_end = reinterpret_cast<uintptr_t>(c_start + c_size);
chunk->m_marked = true;
chunk_spaces.push(std::make_pair(c_start, c_end));
}
}
/* auto iter = m_allocated_chunks.begin();
auto end = m_allocated_chunks.end();
while (iter != end)
{
auto chunk = *iter++;
if (chunk->m_marked)
continue;
auto c_start = reinterpret_cast<uintptr_t>(chunk->m_start);
auto c_size = reinterpret_cast<uintptr_t>(chunk->m_size);
auto c_end = reinterpret_cast<uintptr_t>(c_start + c_size);
if (c_start < *stack_addr && *stack_addr < c_end)
{
chunk->m_marked = true;
chunk_spaces.push(std::make_pair(c_start, c_end));
}
} */
}
void Heap::create_table()
{
Heap &heap = Heap::the();
unordered_map<uintptr_t, Chunk*> chunk_table;
for (auto chunk : heap.m_allocated_chunks) {
auto pair = std::make_pair(reinterpret_cast<uintptr_t>(chunk->m_start), chunk);
heap.m_chunk_table.insert(pair);
}
}
void Heap::mark_hash(uintptr_t *start, const uintptr_t* const end)
{
Heap &heap = Heap::the();
bool profiler_enabled = heap.m_profiler_enable; bool profiler_enabled = heap.m_profiler_enable;
if (profiler_enabled) if (profiler_enabled)
Profiler::record(MarkStart); Profiler::record(MarkStart);
<<<<<<< HEAD
auto iter = ranges.begin(); auto iter = ranges.begin();
auto stop = ranges.end(); auto stop = ranges.end();
@ -419,6 +503,41 @@ namespace GC
chunk->m_marked = true; chunk->m_marked = true;
mark_hash(chunk->m_start, c_end); mark_hash(chunk->m_start, c_end);
>>>>>>> 74e0282 (Added Hash map marking) >>>>>>> 74e0282 (Added Hash map marking)
=======
for (; start <= end; start++)
{
auto search = heap.m_chunk_table.find(*start);
if (search != heap.m_chunk_table.end())
{
Chunk *chunk = search->second;
auto c_start = reinterpret_cast<uintptr_t>(chunk->m_start);
auto c_size = reinterpret_cast<uintptr_t>(chunk->m_size);
auto c_end = reinterpret_cast<uintptr_t*>(c_start + c_size);
if (!chunk->m_marked)
{
chunk->m_marked = true;
if (profiler_enabled)
Profiler::record(ChunkMarked, chunk);
//mark_hash(chunk->m_start, c_end);
Chunk *next = find_pointer_hash((uintptr_t *) c_start, (uintptr_t *) c_end);
while (next != NULL)
{
if (!next->m_marked)
{
next->m_marked = true;
if (profiler_enabled)
Profiler::record(ChunkMarked, chunk);
auto c_start = reinterpret_cast<uintptr_t>(next->m_start);
auto c_size = reinterpret_cast<uintptr_t>(next->m_size);
auto c_end = reinterpret_cast<uintptr_t>(c_start + c_size);
next = find_pointer_hash((uintptr_t *) c_start, (uintptr_t *) c_end);
}
}
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
} }
} }
} }
@ -440,6 +559,7 @@ namespace GC
} }
} }
<<<<<<< HEAD
void Heap::mark_hash(uintptr_t *start, const uintptr_t* const end) void Heap::mark_hash(uintptr_t *start, const uintptr_t* const end)
{ {
Heap &heap = Heap::the(); Heap &heap = Heap::the();
@ -486,6 +606,8 @@ namespace GC
} }
} }
=======
>>>>>>> 7e93aab6268ac896dea03dcd045b8bc249f2576c
/** /**
* Sweeps the heap, unmarks the marked chunks for the next cycle, * Sweeps the heap, unmarks the marked chunks for the next cycle,
* adds the unmarked nodes to the list of freed chunks; to be freed. * adds the unmarked nodes to the list of freed chunks; to be freed.