m_state_cv.notify_all();
printf("\nstopped, reason: exited, exit-code: %i\n", event.exitCode);
+ m_exit = true;
repaint();
}
+void CLIProtocol::EmitTerminatedEvent()
+{
+ LogFuncEntry();
+ lock_guard lock(m_mutex);
+
+ m_processStatus = Exited;
+ m_state_cv.notify_all();
+
+ resetConsole();
+ m_exit = true;
+}
// This function implements Debugger interface and called from ManagedDebugger,
// as callback function, in separate thread.
m_sharedDebugger->Disconnect();
lock.lock();
- m_processStatus = NotStarted;
- m_state_cv.notify_all();
exited = 1;
}
linenoiseHistorySave(HistoryFileName);
linenoiseHistoryFree();
+ cleanupConsoleInputBuffer();
// At this point we assume, that no EmitStoppedEvent and
// no EmitExitEvent can occur anymore.
#endif
}
+void CLIProtocol::resetConsole()
+{
+#ifdef _WIN32
+ INPUT_RECORD rec;
+ DWORD count;
+ rec.EventType = KEY_EVENT;
+ rec.Event.KeyEvent.bKeyDown = 1;
+ rec.Event.KeyEvent.dwControlKeyState = 0x8; // CONTROL_KEY_STATE_PRESSED;
+ rec.Event.KeyEvent.uChar.AsciiChar = 0xd; // SYMBOL_CTRL_D;
+ rec.Event.KeyEvent.uChar.UnicodeChar = 0xd; // SYMBOL_CTRL_D;
+ rec.Event.KeyEvent.wRepeatCount = 1;
+ rec.Event.KeyEvent.wVirtualKeyCode = 0xd; // KEYCODE_CTRL_D;
+ rec.Event.KeyEvent.wVirtualScanCode = 0x1c; // SCANCODE_CTRL_D;
+ WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &rec, 1, &count);
+#else
+ freopen(static_cast<char*>(nullptr), "wr", stdin);
+#endif
+}
+
+void CLIProtocol::cleanupConsoleInputBuffer()
+{
+// No need to do something for linux
+#ifdef _WIN32
+ DWORD bytesRead;
+ HANDLE fh = GetStdHandle(STD_INPUT_HANDLE);
+ if (!fh)
+ return;
+ while (GetNumberOfConsoleInputEvents(fh, &bytesRead) && bytesRead)
+ {
+ INPUT_RECORD event;
+ if (!ReadConsoleInput(fh, &event, 1, &bytesRead))
+ return;
+ }
+#endif
+}
+
} // namespace netcoredbg
void EmitExecEvent(PID, const std::string& argv) override {}
void EmitStoppedEvent(const StoppedEvent &event) override;
void EmitExitedEvent(const ExitedEvent &event) override;
- void EmitTerminatedEvent() override {}
+ void EmitTerminatedEvent() override;
void EmitContinuedEvent(ThreadId threadId) override;
void EmitThreadEvent(const ThreadEvent &event) override;
void EmitModuleEvent(const ModuleEvent &event) override;
// remove/set Ctrl-C handlers
void removeInterruptHandler();
void setupInterruptHandler();
+
+ void resetConsole();
+ void cleanupConsoleInputBuffer();
};
} // namespace netcoredbg