27 std::queue<unsigned char> m_queue;
29 std::atomic_bool m_running;
30 std::unique_ptr<std::thread> rcv_thread_id;
36#pragma message("CharBackendStdio not yet implemented for WIN32")
38 static void catch_fn(
int signo) {}
40 static void tty_reset()
57 SCP_TRACE(()) <<
"legacy_char_backend_stdio constructor";
75 gs::SigHandler::get().register_on_exit_cb(std::string(this->name()) +
".char_backend_stdio::tty_reset",
77 gs::SigHandler::get().add_sig_handler(
SIGINT, gs::SigHandler::Handler_CB::PASS);
78 gs::SigHandler::get().register_handler(std::string(this->name()) +
".char_backend_stdio::SIGINT_handler",
80 std::lock_guard<std::mutex>
lock(m_mutex);
84 if (!m_queue.empty()) m_event.async_notify();
89 rcv_thread_id = std::make_unique<std::thread>(&legacy_char_backend_stdio::rcv_thread,
this);
96 act.sa_handler = &catch_fn;
109 int r = read(
fd, &
c, 1);
111 std::lock_guard<std::mutex>
lock(m_mutex);
116 if (!m_queue.empty()) {
117 m_event.async_notify();
132 std::lock_guard<std::mutex>
lock(m_mutex);
134 while (!m_queue.empty()) {
135 if (m_can_receive(m_opaque)) {
138 m_receive(m_opaque, &
c, 1);
147 void write(
unsigned char c)
155 gs::SigHandler::get().deregister_on_exit_cb(std::string(name()) +
".char_backend_stdio::tty_reset");
156 gs::SigHandler::get().deregister_handler(std::string(name()) +
".char_backend_stdio::SIGINT_handler");
159 if (rcv_thread_id->joinable()) rcv_thread_id->join();