[CLI] Auto-exit ncdb when dubugging process is finished or detached.
authorOleg Lekarev <o.lekarev@samsung.com>
Tue, 14 Dec 2021 10:34:45 +0000 (13:34 +0300)
committerAlexander Soldatov/Platform Lab /SRR/Staff Engineer/Samsung Electronics <soldatov.a@samsung.com>
Tue, 1 Feb 2022 14:34:14 +0000 (17:34 +0300)
src/protocols/cliprotocol.cpp
src/protocols/cliprotocol.h

index b6cea47586d916c1faf81eb25924e782687b84db..051ec7000c518fe865e92f5b835960f137f0b116 100644 (file)
@@ -1007,10 +1007,22 @@ void CLIProtocol::EmitExitedEvent(const ExitedEvent &event)
     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.
@@ -2249,8 +2261,6 @@ HRESULT CLIProtocol::execCommands(LineReader&& lr, bool printCommands)
             m_sharedDebugger->Disconnect();
 
             lock.lock();
-            m_processStatus = NotStarted;
-            m_state_cv.notify_all();
             exited = 1;
         }
 
@@ -2457,6 +2467,7 @@ void CLIProtocol::CommandLoop()
 
     linenoiseHistorySave(HistoryFileName);
     linenoiseHistoryFree();
+    cleanupConsoleInputBuffer();
 
     // At this point we assume, that no EmitStoppedEvent and
     // no EmitExitEvent can occur anymore.
@@ -2540,4 +2551,40 @@ void CLIProtocol::setupInterruptHandler()
 #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
index 89fdea4d201289c290902052480b483b35f3eac2..4e89e74061f1a4a6127c6c8454d9a96a302a6f01 100644 (file)
@@ -91,7 +91,7 @@ public:
     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;
@@ -246,6 +246,9 @@ private:
     // remove/set Ctrl-C handlers
     void removeInterruptHandler();
     void setupInterruptHandler();
+
+    void resetConsole();
+    void cleanupConsoleInputBuffer();
 };
 
 } // namespace netcoredbg