Fixed bug in sweep and updated tests
This commit is contained in:
parent
ce714db3f1
commit
78ccade17d
6 changed files with 56 additions and 32 deletions
|
|
@ -18,6 +18,7 @@ namespace GC
|
||||||
enum CollectOption {
|
enum CollectOption {
|
||||||
MARK=0x1,
|
MARK=0x1,
|
||||||
SWEEP=0x2,
|
SWEEP=0x2,
|
||||||
|
MARK_SWEEP = 0x3,
|
||||||
FREE=0x4,
|
FREE=0x4,
|
||||||
COLLECT_ALL=0x7
|
COLLECT_ALL=0x7
|
||||||
};
|
};
|
||||||
|
|
@ -103,6 +104,7 @@ namespace GC
|
||||||
void collect(CollectOption flags); // conditional collection
|
void collect(CollectOption flags); // conditional collection
|
||||||
void check_init(); // print dummy things
|
void check_init(); // print dummy things
|
||||||
void print_contents(); // print dummy things
|
void print_contents(); // print dummy things
|
||||||
|
void print_allocated_chunks(Heap *heap); // print the contents in m_allocated_chunks
|
||||||
void set_profiler(bool mode);
|
void set_profiler(bool mode);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +185,7 @@ namespace GC
|
||||||
auto it = worklist.begin();
|
auto it = worklist.begin();
|
||||||
auto stop = worklist.end();
|
auto stop = worklist.end();
|
||||||
// for (auto it = worklist.begin(); it != worklist.end();) {
|
// for (auto it = worklist.begin(); it != worklist.end();) {
|
||||||
while (it != stop)
|
while (it != stop) // while (it != stop)
|
||||||
{
|
{
|
||||||
Chunk *chunk = *it;
|
Chunk *chunk = *it;
|
||||||
|
|
||||||
|
|
@ -193,10 +193,10 @@ namespace GC
|
||||||
auto c_size = reinterpret_cast<uintptr_t>(chunk->size);
|
auto c_size = reinterpret_cast<uintptr_t>(chunk->size);
|
||||||
auto c_end = reinterpret_cast<uintptr_t>(c_start + c_size);
|
auto c_end = reinterpret_cast<uintptr_t>(c_start + c_size);
|
||||||
|
|
||||||
cout << "Value of Start:\t\t" << start << endl;
|
/* cout << "Value of Start:\t\t" << start << endl;
|
||||||
cout << "Start points to:\t" << hex << *start << endl;
|
cout << "Start points to:\t" << hex << *start << endl;
|
||||||
cout << "Chunk start:\t\t" << hex << c_start << endl;
|
cout << "Chunk start:\t\t" << hex << c_start << endl;
|
||||||
cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl;
|
cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; */
|
||||||
|
|
||||||
// Check if the stack pointer aligns with the chunk
|
// Check if the stack pointer aligns with the chunk
|
||||||
if (c_start <= *start && *start < c_end)
|
if (c_start <= *start && *start < c_end)
|
||||||
|
|
@ -212,6 +212,7 @@ namespace GC
|
||||||
it = worklist.erase(it);
|
it = worklist.erase(it);
|
||||||
// Recursively call mark, to see if the reachable chunk further points to another chunk
|
// Recursively call mark, to see if the reachable chunk further points to another chunk
|
||||||
mark((uintptr_t *)c_start, (uintptr_t *)c_end, worklist);
|
mark((uintptr_t *)c_start, (uintptr_t *)c_end, worklist);
|
||||||
|
|
||||||
//mark_step(c_start, c_end, worklist);
|
//mark_step(c_start, c_end, worklist);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -283,10 +284,11 @@ namespace GC
|
||||||
*/
|
*/
|
||||||
void Heap::sweep(Heap *heap)
|
void Heap::sweep(Heap *heap)
|
||||||
{
|
{
|
||||||
|
cout << "--- sweep() was called ---" << endl;
|
||||||
auto iter = heap->m_allocated_chunks.begin();
|
auto iter = heap->m_allocated_chunks.begin();
|
||||||
auto stop = heap->m_allocated_chunks.end();
|
auto stop = heap->m_allocated_chunks.end();
|
||||||
// for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) {
|
// This cannot "iter != stop", results in seg fault, since the end gets updated, I think.
|
||||||
while (iter != stop)
|
while (iter != heap->m_allocated_chunks.end())
|
||||||
{
|
{
|
||||||
Chunk *chunk = *iter;
|
Chunk *chunk = *iter;
|
||||||
|
|
||||||
|
|
@ -318,12 +320,14 @@ namespace GC
|
||||||
*/
|
*/
|
||||||
void Heap::free(Heap *heap)
|
void Heap::free(Heap *heap)
|
||||||
{
|
{
|
||||||
|
cout << "--- free() was called ---" << endl;
|
||||||
if (heap->m_freed_chunks.size() > FREE_THRESH)
|
if (heap->m_freed_chunks.size() > FREE_THRESH)
|
||||||
{
|
{
|
||||||
while (heap->m_freed_chunks.size())
|
while (heap->m_freed_chunks.size())
|
||||||
{
|
{
|
||||||
auto chunk = heap->m_freed_chunks.back();
|
auto chunk = heap->m_freed_chunks.back();
|
||||||
heap->m_freed_chunks.pop_back();
|
heap->m_freed_chunks.pop_back();
|
||||||
|
cout << "Freed chunk was deleted" << endl;
|
||||||
delete chunk;
|
delete chunk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -392,6 +396,8 @@ namespace GC
|
||||||
*/
|
*/
|
||||||
void Heap::collect(CollectOption flags)
|
void Heap::collect(CollectOption flags)
|
||||||
{
|
{
|
||||||
|
set_profiler(true);
|
||||||
|
|
||||||
if (getProfilerMode())
|
if (getProfilerMode())
|
||||||
Profiler::record(CollectStart);
|
Profiler::record(CollectStart);
|
||||||
|
|
||||||
|
|
@ -504,4 +510,11 @@ namespace GC
|
||||||
auto heap = Heap::the();
|
auto heap = Heap::the();
|
||||||
heap->m_profiler_enable = mode;
|
heap->m_profiler_enable = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Heap::print_allocated_chunks(Heap *heap) {
|
||||||
|
cout << "--- Allocated Chunks ---\n" << endl;
|
||||||
|
for (auto chunk : heap->m_allocated_chunks) {
|
||||||
|
print_line(chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -32,7 +32,7 @@ namespace GC
|
||||||
auto start = profiler->m_events.begin();
|
auto start = profiler->m_events.begin();
|
||||||
auto end = profiler->m_events.end();
|
auto end = profiler->m_events.end();
|
||||||
|
|
||||||
std::ofstream fstr = profiler->createFileStream(); // this is now found
|
std::ofstream fstr = profiler->createFileStream();
|
||||||
char buffer[22];
|
char buffer[22];
|
||||||
std::tm *btm;
|
std::tm *btm;
|
||||||
std::time_t tt;
|
std::time_t tt;
|
||||||
|
|
@ -42,15 +42,15 @@ namespace GC
|
||||||
{
|
{
|
||||||
auto event = *start++;
|
auto event = *start++;
|
||||||
|
|
||||||
tt = event->getTimeStamp(); // this is found
|
tt = event->getTimeStamp();
|
||||||
btm = std::localtime(&tt);
|
btm = std::localtime(&tt);
|
||||||
std::strftime(buffer, 22, "%a %T", btm);
|
std::strftime(buffer, 22, "%a %T", btm);
|
||||||
|
|
||||||
fstr << "--------------------------------\n"
|
fstr << "--------------------------------\n"
|
||||||
<< buffer
|
<< buffer
|
||||||
<< "\nEvent:\t" << event->TypeToString(); // this is not found
|
<< "\nEvent:\t" << event->TypeToString();
|
||||||
|
|
||||||
chunk = event->getChunk(); // this is found
|
chunk = event->getChunk();
|
||||||
|
|
||||||
if (chunk) {
|
if (chunk) {
|
||||||
fstr << "\nChunk:\t" << chunk->start
|
fstr << "\nChunk:\t" << chunk->start
|
||||||
|
|
@ -69,7 +69,8 @@ namespace GC
|
||||||
std::strftime(buffer, 32, "/profiler/log_%a_%H_%M_%S.txt", ptm);
|
std::strftime(buffer, 32, "/profiler/log_%a_%H_%M_%S.txt", ptm);
|
||||||
std::string filename(buffer);
|
std::string filename(buffer);
|
||||||
|
|
||||||
const std::string ABS_PATH = "/home/virre/dev/systemF/org/language/src/GC/";
|
//const std::string ABS_PATH = "/home/virre/dev/systemF/org/language/src/GC/";
|
||||||
|
const std::string ABS_PATH = "/Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC";
|
||||||
std::string fullpath = ABS_PATH + filename;
|
std::string fullpath = ABS_PATH + filename;
|
||||||
|
|
||||||
std::ofstream fstr(fullpath);
|
std::ofstream fstr(fullpath);
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ class Game {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
//std::vector<Player*> *players;
|
std::vector<Player*> *players;
|
||||||
std::vector<Player> *players;
|
//std::vector<Player> *players;
|
||||||
Point *dimensions;
|
Point *dimensions;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -38,18 +38,18 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
//players = static_cast<std::vector<Player*>*>(GC::Heap::alloc(sizeof(Player*) * MAX_PLAYERS));
|
players = static_cast<std::vector<Player*>*>(GC::Heap::alloc(sizeof(Player*) * MAX_PLAYERS));
|
||||||
players = static_cast<std::vector<Player>*>(GC::Heap::alloc(sizeof(Player) * MAX_PLAYERS));
|
//players = static_cast<std::vector<Player>*>(GC::Heap::alloc(sizeof(Player) * MAX_PLAYERS));
|
||||||
dimensions = static_cast<Point*>(GC::Heap::alloc(sizeof(Point)));
|
dimensions = static_cast<Point*>(GC::Heap::alloc(sizeof(Point)));
|
||||||
dimensions->x = X_LENGTH;
|
dimensions->x = X_LENGTH;
|
||||||
dimensions->y = Y_LENGTH;
|
dimensions->y = Y_LENGTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_player(Player *p) {
|
void add_player(Player *p) {
|
||||||
players->push_back(*p);
|
players->push_back(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
Player* create_player(string s, Point pos, Point size, Point dir) {
|
Player* create_player(string *s, Point *pos, Point *size, Point *dir) {
|
||||||
Player *p = static_cast<Player*>(GC::Heap::alloc(sizeof(Player)));
|
Player *p = static_cast<Player*>(GC::Heap::alloc(sizeof(Player)));
|
||||||
/*
|
/*
|
||||||
Cannot allocate by new, since it the allocates outside of "out" heap. That also lead so us having to
|
Cannot allocate by new, since it the allocates outside of "out" heap. That also lead so us having to
|
||||||
|
|
@ -62,7 +62,13 @@ public:
|
||||||
|
|
||||||
void create_players(int nr) {
|
void create_players(int nr) {
|
||||||
for (int i = 0; i < nr; i++) {
|
for (int i = 0; i < nr; i++) {
|
||||||
Player *p = create_player(std::to_string(i), Point(i, i), Point(2, 2), Point(0, 0));
|
|
||||||
|
std::string *str = static_cast<std::string*>(GC::Heap::alloc(sizeof(std::string)));
|
||||||
|
Point *pos = static_cast<Point*>(GC::Heap::alloc(sizeof(Point)));
|
||||||
|
Point *size = static_cast<Point*>(GC::Heap::alloc(sizeof(Point)));
|
||||||
|
Point *dir = static_cast<Point*>(GC::Heap::alloc(sizeof(Point)));
|
||||||
|
|
||||||
|
Player *p = create_player(str, pos, size, dir);
|
||||||
add_player(p);
|
add_player(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,10 +78,11 @@ int main() {
|
||||||
// long *l = static_cast<long *>(gc->alloc(sizeof(long))); // 0x6-0xd | 0x
|
// long *l = static_cast<long *>(gc->alloc(sizeof(long))); // 0x6-0xd | 0x
|
||||||
|
|
||||||
// This is allocated outside of the scope of the GC (if gc->init() isn't called), thus garbage
|
// This is allocated outside of the scope of the GC (if gc->init() isn't called), thus garbage
|
||||||
/* long *longs[21];
|
/* long *longs;
|
||||||
std::cout << "Pointer to ints:\t" << longs << std::endl;
|
std::cout << "Pointer to ints:\t" << longs << std::endl;
|
||||||
for (int i = 0; i < 21; i++) {
|
for (int i = 0; i < 21; i++) {
|
||||||
longs[i] = static_cast<long *>(gc->alloc(sizeof(long)));
|
longs = static_cast<long *>(gc->alloc(sizeof(long)));
|
||||||
|
longs++;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
Node *root = static_cast<Node *>(gc->alloc(sizeof(Node)));
|
Node *root = static_cast<Node *>(gc->alloc(sizeof(Node)));
|
||||||
|
|
@ -93,7 +94,7 @@ int main() {
|
||||||
std::cout << "Root child, child:\t" << root_child->child << std::endl;
|
std::cout << "Root child, child:\t" << root_child->child << std::endl;
|
||||||
|
|
||||||
|
|
||||||
gc->collect(GC::MARK);
|
gc->collect(GC::COLLECT_ALL);
|
||||||
gc->print_contents();
|
gc->print_contents();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -15,36 +15,37 @@ class Player {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
string name;
|
string *name;
|
||||||
Point position;
|
Point *position;
|
||||||
Point size;
|
Point *size;
|
||||||
Point direction;
|
Point *direction;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Player() {}
|
Player() {}
|
||||||
|
|
||||||
Player(string n, Point pos, Point s, Point dir)
|
/* Player(string n, Point pos, Point s, Point dir)
|
||||||
: name(n), position(pos.x, pos.y), size(s.x, s.y), direction(dir.x, dir.y)
|
: name(n), position(pos.x, pos.y), size(s.x, s.y), direction(dir.x, dir.y)
|
||||||
{}
|
{} */
|
||||||
|
|
||||||
void move() {
|
void move() {
|
||||||
position.x += direction.x;
|
position->x += direction->x;
|
||||||
position.y += direction.y;
|
position->y += direction->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_speed(int dx, int dy) {
|
void set_speed(int dx, int dy) {
|
||||||
direction.x = dx;
|
direction->x = dx;
|
||||||
direction.y = dy;
|
direction->y = dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is probably neccessary to initialize an object with our GC
|
// This is probably neccessary to initialize an object with our GC
|
||||||
// Since allocation and construction cannot be done at the same time
|
// Since allocation and construction cannot be done at the same time
|
||||||
void init(string n, Point pos, Point s, Point dir) {
|
void init(string *n, Point *pos, Point *s, Point *dir) {
|
||||||
name = n;
|
name = n;
|
||||||
position = pos;
|
position = pos;
|
||||||
size = s;
|
size = s;
|
||||||
direction = dir;
|
direction = dir;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue