Fixed lost chunks in free_overlap
This commit is contained in:
parent
ffdffc475d
commit
4bf1fd7610
2 changed files with 21 additions and 13 deletions
|
|
@ -380,11 +380,14 @@ namespace GC
|
||||||
std::vector<Chunk *> filtered;
|
std::vector<Chunk *> filtered;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
// filtered.push_back(heap->m_freed_chunks.at(i++));
|
// filtered.push_back(heap->m_freed_chunks.at(i++));
|
||||||
filtered.push_back(Heap::get_at(heap->m_freed_chunks, i++));
|
// filtered.push_back(Heap::get_at(heap->m_freed_chunks, i++));
|
||||||
|
auto prev = Heap::get_at(heap->m_freed_chunks, i++);
|
||||||
|
prev->marked = true;
|
||||||
|
filtered.push_back(prev);
|
||||||
cout << filtered.back()->start << endl;
|
cout << filtered.back()->start << endl;
|
||||||
for (; i < heap->m_freed_chunks.size(); i++)
|
for (; i < heap->m_freed_chunks.size(); i++)
|
||||||
{
|
{
|
||||||
auto prev = filtered.back();
|
prev = filtered.back();
|
||||||
// auto next = heap->m_freed_chunks.at(i);
|
// auto next = heap->m_freed_chunks.at(i);
|
||||||
auto next = Heap::get_at(heap->m_freed_chunks, i);
|
auto next = Heap::get_at(heap->m_freed_chunks, i);
|
||||||
auto p_start = (uintptr_t)(prev->start);
|
auto p_start = (uintptr_t)(prev->start);
|
||||||
|
|
@ -392,10 +395,25 @@ namespace GC
|
||||||
auto n_start = (uintptr_t)(next->start);
|
auto n_start = (uintptr_t)(next->start);
|
||||||
if (n_start >= (p_start + p_size))
|
if (n_start >= (p_start + p_size))
|
||||||
{
|
{
|
||||||
|
next->marked = true;
|
||||||
filtered.push_back(next);
|
filtered.push_back(next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
heap->m_freed_chunks.swap(filtered);
|
heap->m_freed_chunks.swap(filtered);
|
||||||
|
|
||||||
|
bool profiler_enabled = heap->profiler_enabled();
|
||||||
|
// after swap m_freed_chunks contains still available chunks
|
||||||
|
// and filtered contains all the chunks, so delete unused chunks
|
||||||
|
for (Chunk *chunk : filtered)
|
||||||
|
{
|
||||||
|
// if chunk was filtered away, delete it
|
||||||
|
if (!chunk->marked)
|
||||||
|
{
|
||||||
|
if (profiler_enabled)
|
||||||
|
Profiler::record(ChunkFreed, chunk);
|
||||||
|
delete chunk;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----- ONLY DEBUGGING -----------------------------------------------------------------------
|
// ----- ONLY DEBUGGING -----------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,6 @@ Goal for next week (24/2):
|
||||||
- Write more complex tests
|
- Write more complex tests
|
||||||
|
|
||||||
## GC TODO:
|
## GC TODO:
|
||||||
- Skriva klart profiler
|
|
||||||
- fixa abs_path i create_file_stream
|
|
||||||
- delete chunk i free_overlap
|
|
||||||
- Kolla linking med Valter/Victor
|
- Kolla linking med Valter/Victor
|
||||||
- Fixa en a-fil/static lib till Samuel
|
- Fixa en a-fil/static lib till Samuel
|
||||||
- Kolla vektor vs list complexity
|
- Kolla vektor vs list complexity
|
||||||
|
|
@ -16,11 +13,4 @@ Goal for next week (24/2):
|
||||||
då är alla efter varandra i minnet.
|
då är alla efter varandra i minnet.
|
||||||
|
|
||||||
## Tests TODO
|
## Tests TODO
|
||||||
- Write complex datastructures for tests with larger programs
|
- Write complex datastructures for tests with larger programs
|
||||||
|
|
||||||
## Profiler grejer
|
|
||||||
1. [x] Kolla existerande events
|
|
||||||
2. [x] Nya events för init, dispose i heap.cpp
|
|
||||||
3. [x] Skriv om try_recycle för att returnera en chunk
|
|
||||||
4. [x] Copy constructor för chunks (reused chunks)
|
|
||||||
5. [x] Nya events för try_recycle
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue