Switched stack start and ends to tops and bottoms.
This commit is contained in:
parent
a684fe1ea0
commit
019c54bdad
3 changed files with 24 additions and 26 deletions
|
|
@ -63,7 +63,7 @@ namespace GC {
|
||||||
const char *m_heap;
|
const char *m_heap;
|
||||||
size_t m_size;
|
size_t m_size;
|
||||||
size_t m_allocated_size;
|
size_t m_allocated_size;
|
||||||
uintptr_t *m_stack_end = nullptr;
|
uintptr_t *m_stack_top = nullptr;
|
||||||
|
|
||||||
// maybe change to std::list
|
// maybe change to std::list
|
||||||
std::list<Chunk *> m_allocated_chunks;
|
std::list<Chunk *> m_allocated_chunks;
|
||||||
|
|
|
||||||
|
|
@ -14,13 +14,13 @@ namespace GC {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialises the heap singleton and saves the address
|
* Initialises the heap singleton and saves the address
|
||||||
* of the calling stack frame as the stack_end. Presumeably
|
* of the calling stack frame as the stack_top. Presumeably
|
||||||
* this address points to the stack frame of the compiled
|
* this address points to the stack frame of the compiled
|
||||||
* LLVM executable after linking.
|
* LLVM executable after linking.
|
||||||
*/
|
*/
|
||||||
void Heap::init() {
|
void Heap::init() {
|
||||||
Heap *heap = Heap::the();
|
Heap *heap = Heap::the();
|
||||||
heap->m_stack_end = reinterpret_cast<uintptr_t *>(__builtin_frame_address(1));
|
heap->m_stack_top = reinterpret_cast<uintptr_t *>(__builtin_frame_address(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -139,17 +139,17 @@ namespace GC {
|
||||||
auto heap = Heap::the();
|
auto heap = Heap::the();
|
||||||
|
|
||||||
// get current stack
|
// get current stack
|
||||||
auto stack_start = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
auto stack_bottom = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
||||||
|
|
||||||
// fix this block, it's nästy
|
// fix this block, it's nästy
|
||||||
uintptr_t *stack_end;
|
uintptr_t *stack_top;
|
||||||
if (heap->m_stack_end != nullptr)
|
if (heap->m_stack_top != nullptr)
|
||||||
stack_end = heap->m_stack_end;
|
stack_top = heap->m_stack_top;
|
||||||
else
|
else
|
||||||
stack_end = (uintptr_t *)0; // temporary
|
stack_top = (uintptr_t *)0; // temporary
|
||||||
|
|
||||||
auto work_list = heap->m_allocated_chunks;
|
auto work_list = heap->m_allocated_chunks;
|
||||||
mark(stack_start, stack_end, work_list);
|
mark(stack_bottom, stack_top, work_list);
|
||||||
|
|
||||||
sweep(heap);
|
sweep(heap);
|
||||||
|
|
||||||
|
|
@ -211,9 +211,9 @@ namespace GC {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 vector of freed chunks; to be freed.
|
* adds the unmarked nodes to the list of freed chunks; to be freed.
|
||||||
*
|
*
|
||||||
* @param heap Pointer to the heap to oporate on.
|
* @param heap Pointer to the heap singleton instance.
|
||||||
*/
|
*/
|
||||||
void Heap::sweep(Heap *heap) {
|
void Heap::sweep(Heap *heap) {
|
||||||
auto iter = heap->m_allocated_chunks.begin();
|
auto iter = heap->m_allocated_chunks.begin();
|
||||||
|
|
@ -301,9 +301,9 @@ namespace GC {
|
||||||
void Heap::check_init() {
|
void Heap::check_init() {
|
||||||
auto heap = Heap::the();
|
auto heap = Heap::the();
|
||||||
cout << "Heap addr:\t" << heap << endl;
|
cout << "Heap addr:\t" << heap << endl;
|
||||||
cout << "GC m_stack_end:\t" << heap->m_stack_end << endl;
|
cout << "GC m_stack_top:\t" << heap->m_stack_top << endl;
|
||||||
auto stack_start = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
auto stack_bottom = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
||||||
cout << "GC stack_start:\t" << stack_start << endl;
|
cout << "GC stack_bottom:\t" << stack_bottom << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -325,20 +325,20 @@ namespace GC {
|
||||||
auto heap = Heap::the();
|
auto heap = Heap::the();
|
||||||
|
|
||||||
// get the frame adress, whwere local variables and saved registers are located
|
// get the frame adress, whwere local variables and saved registers are located
|
||||||
auto stack_start = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
auto stack_bottom = reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));
|
||||||
cout << "Stack start in collect:\t" << stack_start << endl;
|
cout << "Stack bottom in collect:\t" << stack_bottom << endl;
|
||||||
uintptr_t *stack_end;
|
uintptr_t *stack_top;
|
||||||
|
|
||||||
if (heap->m_stack_end != nullptr)
|
if (heap->m_stack_top != nullptr)
|
||||||
stack_end = heap->m_stack_end;
|
stack_top = heap->m_stack_top;
|
||||||
else
|
else
|
||||||
stack_end = (uintptr_t *) stack_start - 80; // dummy value
|
stack_top = (uintptr_t *) stack_bottom + 80; // dummy value
|
||||||
|
|
||||||
cout << "Stack end in collect:\t " << stack_end << endl;
|
cout << "Stack end in collect:\t " << stack_top << endl;
|
||||||
auto work_list = heap->m_allocated_chunks;
|
auto work_list = heap->m_allocated_chunks;
|
||||||
|
|
||||||
if (flags & MARK) {
|
if (flags & MARK) {
|
||||||
mark(stack_start, stack_end, work_list);
|
mark(stack_bottom, stack_top, work_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & SWEEP) {
|
if (flags & SWEEP) {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,15 @@
|
||||||
# Garbage collection
|
# Garbage collection
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Project
|
## Project
|
||||||
|
|
||||||
Goal for next week (24/2):
|
Goal for next week (24/2):
|
||||||
- Debug
|
- Write more complex tests
|
||||||
|
|
||||||
## GC TODO:
|
## GC TODO:
|
||||||
- Merge to main branch
|
- Merge to main branch
|
||||||
- stack_end, stack_start -> stack_top, stack_bottom
|
|
||||||
- Double check m_heap_size functionality and when a collection is triggered
|
- Double check m_heap_size functionality and when a collection is triggered
|
||||||
- Kolla vektor vs list complexity
|
- Kolla vektor vs list complexity
|
||||||
|
|
||||||
## Tests TODO
|
## Tests TODO
|
||||||
|
- Write complex datastructures for tests with larger programs
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue