From ffdffc475dfc290ff101aa85dbc31fc1881cde21 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Mon, 20 Mar 2023 13:24:14 +0100 Subject: [PATCH] Fixed ABS_PATH for profiler --- src/GC/include/event.hpp | 2 +- src/GC/include/profiler.hpp | 2 +- src/GC/lib/event.cpp | 22 +++++++++------- src/GC/lib/heap.cpp | 6 ++--- src/GC/lib/profiler.cpp | 39 +++++++++++++++++++++++++--- src/GC/tests/file.cpp | 52 +++++++++++++++++++++++++++++++++---- 6 files changed, 99 insertions(+), 24 deletions(-) diff --git a/src/GC/include/event.hpp b/src/GC/include/event.hpp index 6eb38f4..89139c9 100644 --- a/src/GC/include/event.hpp +++ b/src/GC/include/event.hpp @@ -60,6 +60,6 @@ namespace GC GCEventType get_type(); std::time_t get_time_stamp(); Chunk *get_chunk(); - const char *type_to_string(); + const char *const type_to_string(); }; } \ No newline at end of file diff --git a/src/GC/include/profiler.hpp b/src/GC/include/profiler.hpp index 23a83b5..ebfd77a 100644 --- a/src/GC/include/profiler.hpp +++ b/src/GC/include/profiler.hpp @@ -27,7 +27,7 @@ namespace GC { std::vector m_events; std::ofstream create_file_stream(); - + std::string get_log_folder(); public: static void record(GCEventType type); diff --git a/src/GC/lib/event.cpp b/src/GC/lib/event.cpp index e031382..40ab185 100644 --- a/src/GC/lib/event.cpp +++ b/src/GC/lib/event.cpp @@ -24,19 +24,21 @@ namespace GC return m_chunk; } - // Try to remove inline - const char *GCEvent::type_to_string() + const char *const GCEvent::type_to_string() { switch (m_type) { - case CollectStart: return "CollectStart"; - case MarkStart: return "MarkStart"; - case ChunkMarked: return "ChunkMarked"; - case ChunkSwept: return "ChunkSwept"; - case ChunkFreed: return "ChunkFreed"; - case NewChunk: return "NewChunk"; - case ReusedChunk: return "ReusedChunk"; - default: return "[Unknown]"; + case HeapInit: return "HeapInit"; + case AllocStart: return "AllocStart"; + case CollectStart: return "CollectStart"; + case MarkStart: return "MarkStart"; + case ChunkMarked: return "ChunkMarked"; + case ChunkSwept: return "ChunkSwept"; + case ChunkFreed: return "ChunkFreed"; + case NewChunk: return "NewChunk"; + case ReusedChunk: return "ReusedChunk"; + case ProfilerDispose: return "ProfilerDispose"; + default: return "[Unknown]"; } } } \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index bab2c99..4d40550 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -422,7 +422,9 @@ namespace GC { set_profiler(true); - if (Heap::get_profiler_mode()) + auto heap = Heap::the(); + + if (heap->profiler_enabled()) Profiler::record(CollectStart); cout << "DEBUG COLLECT\nFLAGS: "; @@ -434,8 +436,6 @@ namespace GC cout << "\n - FREE"; cout << "\n"; - auto heap = Heap::the(); - // get the frame adress, whwere local variables and saved registers are located auto stack_bottom = reinterpret_cast(__builtin_frame_address(0)); cout << "Stack bottom in collect:\t" << stack_bottom << "\n"; diff --git a/src/GC/lib/profiler.cpp b/src/GC/lib/profiler.cpp index ce6fc0b..1b09fb2 100644 --- a/src/GC/lib/profiler.cpp +++ b/src/GC/lib/profiler.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "chunk.hpp" #include "event.hpp" @@ -80,17 +82,46 @@ namespace GC std::ofstream Profiler::create_file_stream() { + // get current time std::time_t tt = std::time(NULL); std::tm *ptm = std::localtime(&tt); + + // format to string char buffer[32]; - std::strftime(buffer, 32, "/profiler/log_%a_%H_%M_%S.txt", ptm); + std::strftime(buffer, 32, "/log_%a_%H_%M_%S.txt", ptm); std::string filename(buffer); - 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; + // 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; + + const std::string fullpath = get_log_folder() + filename; std::ofstream fstr(fullpath); return fstr; } + + std::string get_log_folder() + { + char buffer[1024]; + // chars read from path + ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer)-1); + + // if readlink fails + if (len == -1) + { + throw std::runtime_error(std::string("Error: readlink failed on '/proc/self/exe/'")); + } + + buffer[len] = '\0'; + + // convert to string for string operators + auto path = std::string(buffer); + + // remove filename + size_t last_slash = path.find_last_of('/'); + std::string folder = path.substr(0, last_slash); + + return folder; + } } \ No newline at end of file diff --git a/src/GC/tests/file.cpp b/src/GC/tests/file.cpp index 92c9af2..df9e441 100644 --- a/src/GC/tests/file.cpp +++ b/src/GC/tests/file.cpp @@ -3,24 +3,66 @@ #include #include #include +#include + +void time_string(char *buffer); +void print_log_file(const std::string TESTS_PATH); +void readlink_test(); int main() { - char buffer[31]; + // char time_buffer[31]; + // time_string(time_buffer); + + // const std::string TESTS_PATH = "/home/virre/dev/systemF/org/language/src/GC/tests/"; + // print_log_file(TESTS_PATH); + + readlink_test(); + + return 0; +} + +void time_string(char *const buffer) +{ std::time_t tt = std::time(NULL); std::tm *ptm = std::localtime(&tt); std::strftime(buffer, 31, "/logs/log_%a_%H_%M_%S.txt", ptm); std::cout << buffer << std::endl; +} - const std::string TESTS_PATH = "/home/virre/dev/systemF/org/language/src/GC/tests/"; - +void print_log_file(const std::string TESTS_PATH) +{ std::string path = TESTS_PATH + "/testlog.txt"; std::ofstream testF(path); - testF << "hellow yorld"; + testF << "hellow york"; testF.close(); +} + +void readlink_test() +{ + char buffer[1024]; + ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer)-1); + if (len == -1) + { + std::cout << "readlink error" << std::endl; + return; + } + + buffer[len] = '\0'; + std::cout << "readlink:\n" << "'''" << buffer << "'''"; // << std::endl; + + auto path = std::string(buffer); + std::cout << path << "\nlen: " << path.size() << "\ncap:" << path.capacity(); + + size_t last_slash = path.find_last_of('/'); + std::string folder = path.substr(0, last_slash); + + std::cout << "\n" << folder; + + std::string log_path = folder + "/log_file_bla.txt"; + std::cout << "\n" << log_path << std::endl; - return 0; } \ No newline at end of file