27 std::queue<unsigned char> m_queue;
29 std::atomic_bool m_running;
30 std::unique_ptr<std::thread> rcv_thread_id;
35#pragma message("CharBackendStdio not yet implemented for WIN32")
37 static void catch_fn(
int signo) {}
39 static void tty_reset()
56 SCP_TRACE(()) <<
"legacy_char_backend_stdio constructor";
74 gs::SigHandler::get().register_on_exit_cb(std::string(this->name()) +
".char_backend_stdio::tty_reset",
76 gs::SigHandler::get().add_sigint_handler(gs::Handler_CB::PASS);
77 gs::SigHandler::get().register_handler(std::string(this->name()) +
".char_backend_stdio::SIGINT_handler",
79 std::lock_guard<std::mutex>
lock(m_mutex);
83 if (!m_queue.empty()) m_event.async_notify();
88 rcv_thread_id = std::make_unique<std::thread>(&legacy_char_backend_stdio::rcv_thread,
this);
95 act.sa_handler = &catch_fn;
108 int r = read(
fd, &
c, 1);
110 std::lock_guard<std::mutex>
lock(m_mutex);
115 if (!m_queue.empty()) {
116 m_event.async_notify();
131 std::lock_guard<std::mutex>
lock(m_mutex);
133 while (!m_queue.empty()) {
134 if (m_can_receive(m_opaque)) {
137 m_receive(m_opaque, &
c, 1);
146 void write(
unsigned char c)
154 gs::SigHandler::get().deregister_on_exit_cb(std::string(name()) +
".char_backend_stdio::tty_reset");
155 gs::SigHandler::get().deregister_handler(std::string(name()) +
".char_backend_stdio::SIGINT_handler");
158 if (rcv_thread_id->joinable()) rcv_thread_id->join();