diff --git a/CMakeLists.txt b/CMakeLists.txt index d1a2cc0..c2a75a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,8 @@ add_executable( include(CheckIPOSupported) check_ipo_supported(RESULT supported) -set(CMAKE_BUILD_TYPE RelWithDebInfo) -#set(CMAKE_BUILD_TYPE Debug) +#set(CMAKE_BUILD_TYPE RelWithDebInfo) +set(CMAKE_BUILD_TYPE Debug) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) diff --git a/ESP32/console_esp32.cpp b/ESP32/console_esp32.cpp index 8c6e433..ac47e56 100644 --- a/ESP32/console_esp32.cpp +++ b/ESP32/console_esp32.cpp @@ -8,10 +8,16 @@ console_esp32::console_esp32(std::atomic_bool *const terminate) : console(terminate) { + th = new std::thread(std::ref(*this)); } console_esp32::~console_esp32() { + if (th) { + th->join(); + + delete th; + } } int console_esp32::wait_for_char(const int timeout) diff --git a/console.cpp b/console.cpp index e749638..8f35a46 100644 --- a/console.cpp +++ b/console.cpp @@ -12,17 +12,10 @@ console::console(std::atomic_bool *const terminate) : terminate(terminate) { memset(screen_buffer, ' ', sizeof screen_buffer); - - th = new std::thread(std::ref(*this)); } console::~console() { - if (th) { - th->join(); - - delete th; - } } bool console::poll_char() diff --git a/console.h b/console.h index f5a144b..4a2bf94 100644 --- a/console.h +++ b/console.h @@ -13,8 +13,6 @@ class console private: std::atomic_bool *const terminate { nullptr }; - std::thread *th { nullptr }; - std::vector input_buffer; char screen_buffer[t_height][t_width]; @@ -22,6 +20,8 @@ private: uint8_t ty { 0 }; protected: + std::thread *th { nullptr }; + virtual int wait_for_char(const int timeout) = 0; virtual void put_char_ll(const char c) = 0; diff --git a/console_ncurses.cpp b/console_ncurses.cpp index 2dfa6a2..4de6c10 100644 --- a/console_ncurses.cpp +++ b/console_ncurses.cpp @@ -12,10 +12,18 @@ console_ncurses::console_ncurses(std::atomic_bool *const terminate) : console(te init_ncurses(true); resize_terminal(); + + th = new std::thread(std::ref(*this)); } console_ncurses::~console_ncurses() { + if (th) { + th->join(); + + delete th; + } + wprintw(w_main->win, "\n\n *** PRESS ENTER TO TERMINATE ***\n"); mydoupdate(); diff --git a/console_posix.cpp b/console_posix.cpp index dedcf63..feab326 100644 --- a/console_posix.cpp +++ b/console_posix.cpp @@ -17,12 +17,21 @@ console_posix::console_posix(std::atomic_bool *const terminate) : console(termin if (tcsetattr(STDIN_FILENO, TCSANOW, &tty_opts_raw) == -1) error_exit(true, "console_posix: tcsetattr failed"); + + th = new std::thread(std::ref(*this)); } console_posix::~console_posix() { + if (th) { + th->join(); + + delete th; + } + if (tcsetattr(STDIN_FILENO, TCSANOW, &org_tty_opts) == -1) error_exit(true, "~console_posix: tcsetattr failed"); + } int console_posix::wait_for_char(const int timeout) diff --git a/main.cpp b/main.cpp index 7e9329e..c95466e 100644 --- a/main.cpp +++ b/main.cpp @@ -306,11 +306,11 @@ int main(int argc, char *argv[]) terminate = true; + delete b; + delete cnsl; fprintf(stderr, "Instructions per second: %.3f\n\n", icount * 1000.0 / (get_ms() - start)); - delete b; - return 0; }