[CONSRV] Keep a count of input events in the console queue + code simplifications.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 22 Feb 2020 22:19:45 +0000 (23:19 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 22 Feb 2020 22:27:42 +0000 (23:27 +0100)
- Update the documentation of members of CONSOLE_INPUT_BUFFER.
- Simplify ConDrvGetConsoleNumberOfInputEvents().
- Simplify ConDrvFlushConsoleInputBuffer().
- Use also GetConsoleInputBufferMode() more often.

win32ss/user/winsrv/consrv/condrv/coninput.c
win32ss/user/winsrv/consrv/console.c
win32ss/user/winsrv/consrv/frontends/gui/conwnd.c
win32ss/user/winsrv/consrv/frontends/gui/guiterm.c
win32ss/user/winsrv/consrv/frontends/input.c
win32ss/user/winsrv/consrv/frontends/terminal.c
win32ss/user/winsrv/consrv/include/conio.h

index e3894d8..a2041a0 100644 (file)
@@ -156,6 +156,7 @@ AddInputEvents(PCONSOLE Console,
             /* Append the event to the beginning of the queue */
             InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
         }
+        _InterlockedIncrement((PLONG)&Console->InputBuffer.NumberOfEvents);
 
         // return STATUS_SUCCESS;
         Status = STATUS_SUCCESS;
@@ -170,14 +171,16 @@ Done:
 }
 
 static VOID
-PurgeInputBuffer(PCONSOLE Console)
+PurgeInputBuffer(IN PCONSOLE_INPUT_BUFFER InputBuffer)
 {
     PLIST_ENTRY CurrentEntry;
     ConsoleInput* Event;
 
-    while (!IsListEmpty(&Console->InputBuffer.InputEvents))
+    /* Discard all entries in the input event queue */
+    _InterlockedExchange((PLONG)&InputBuffer->NumberOfEvents, 0);
+    while (!IsListEmpty(&InputBuffer->InputEvents))
     {
-        CurrentEntry = RemoveHeadList(&Console->InputBuffer.InputEvents);
+        CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
         Event = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
         ConsoleFreeHeap(Event);
     }
@@ -206,6 +209,7 @@ ConDrvInitInputBuffer(IN PCONSOLE Console,
         return Status;
 
     Console->InputBuffer.InputBufferSize = InputBufferSize;
+    Console->InputBuffer.NumberOfEvents  = 0;
     InitializeListHead(&Console->InputBuffer.InputEvents);
     Console->InputBuffer.Mode = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT |
                                 ENABLE_ECHO_INPUT      | ENABLE_MOUSE_INPUT;
@@ -216,7 +220,7 @@ ConDrvInitInputBuffer(IN PCONSOLE Console,
 VOID NTAPI
 ConDrvDeinitInputBuffer(IN PCONSOLE Console)
 {
-    PurgeInputBuffer(Console);
+    PurgeInputBuffer(&Console->InputBuffer);
     CloseHandle(Console->InputBuffer.ActiveEvent);
 }
 
@@ -303,6 +307,7 @@ ConDrvGetConsoleInput(IN PCONSOLE Console,
         /* Remove the events from the queue if needed */
         if (!KeepEvents)
         {
+            _InterlockedDecrement((PLONG)&InputBuffer->NumberOfEvents);
             RemoveEntryList(&Input->ListEntry);
             ConsoleFreeHeap(Input);
         }
@@ -352,9 +357,6 @@ NTSTATUS NTAPI
 ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
                               IN PCONSOLE_INPUT_BUFFER InputBuffer)
 {
-    PLIST_ENTRY CurrentEntry;
-    ConsoleInput* Event;
-
     if (Console == NULL || InputBuffer == NULL)
         return STATUS_INVALID_PARAMETER;
 
@@ -362,12 +364,7 @@ ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
     ASSERT(Console == InputBuffer->Header.Console);
 
     /* Discard all entries in the input event queue */
-    while (!IsListEmpty(&InputBuffer->InputEvents))
-    {
-        CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
-        Event = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
-        ConsoleFreeHeap(Event);
-    }
+    PurgeInputBuffer(InputBuffer);
     ResetEvent(InputBuffer->ActiveEvent);
 
     return STATUS_SUCCESS;
@@ -378,24 +375,13 @@ ConDrvGetConsoleNumberOfInputEvents(IN PCONSOLE Console,
                                     IN PCONSOLE_INPUT_BUFFER InputBuffer,
                                     OUT PULONG NumberOfEvents)
 {
-    PLIST_ENTRY CurrentInput;
-
     if (Console == NULL || InputBuffer == NULL || NumberOfEvents == NULL)
         return STATUS_INVALID_PARAMETER;
 
     /* Validity check */
     ASSERT(Console == InputBuffer->Header.Console);
 
-    *NumberOfEvents = 0;
-
-    /* If there are any events ... */
-    CurrentInput = InputBuffer->InputEvents.Flink;
-    while (CurrentInput != &InputBuffer->InputEvents)
-    {
-        CurrentInput = CurrentInput->Flink;
-        (*NumberOfEvents)++;
-    }
-
+    *NumberOfEvents = InputBuffer->NumberOfEvents;
     return STATUS_SUCCESS;
 }
 
index b4e4668..ea39840 100644 (file)
@@ -284,7 +284,7 @@ ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData,
                               CONSOLE_RUNNING,
                               LockConsole))
     {
-        InterlockedIncrement(&GrabConsole->ReferenceCount);
+        _InterlockedIncrement(&GrabConsole->ReferenceCount);
         *Console = GrabConsole;
         Status = STATUS_SUCCESS;
     }
index ffc6939..f79ad14 100644 (file)
@@ -1711,7 +1711,7 @@ OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam)
                 break;
         }
     }
-    else if (Console->InputBuffer.Mode & ENABLE_MOUSE_INPUT)
+    else if (GetConsoleInputBufferMode(Console) & ENABLE_MOUSE_INPUT)
     {
         INPUT_RECORD er;
         WORD  wKeyState         = GET_KEYSTATE_WPARAM(wParam);
index 1014294..d5a88a4 100644 (file)
@@ -173,7 +173,7 @@ GuiConsoleInputThread(PVOID Param)
 
                 ASSERT(NewWindow == GuiData->hWindow);
 
-                InterlockedIncrement(&WindowCount);
+                _InterlockedIncrement(&WindowCount);
 
                 //
                 // FIXME: TODO: Move everything there into conwnd.c!OnNcCreate()
@@ -238,7 +238,7 @@ GuiConsoleInputThread(PVOID Param)
 
                 NtSetEvent(GuiData->hGuiTermEvent, NULL);
 
-                if (InterlockedDecrement(&WindowCount) == 0)
+                if (_InterlockedDecrement(&WindowCount) == 0)
                 {
                     DPRINT("CONSRV: Going to quit the Input Thread 0x%p\n", InputThreadId);
                     goto Quit;
index 25a53a1..8bc0ad0 100644 (file)
@@ -125,7 +125,7 @@ ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg)
     if (Fake) return;
 
     /* Process Ctrl-C and Ctrl-Break */
-    if ( Console->InputBuffer.Mode & ENABLE_PROCESSED_INPUT &&
+    if ( (GetConsoleInputBufferMode(Console) & ENABLE_PROCESSED_INPUT) &&
          Down && (VirtualKeyCode == VK_PAUSE || VirtualKeyCode == 'C') &&
          (ShiftState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) || KeyState[VK_CONTROL] & 0x80) )
     {
index 4d20af2..ece6bb2 100644 (file)
@@ -361,6 +361,7 @@ ConSrvTermReadStream(IN OUT PTERMINAL This,
         while (!Console->LineComplete && !IsListEmpty(&InputBuffer->InputEvents))
         {
             /* Remove an input event from the queue */
+            _InterlockedDecrement((PLONG)&InputBuffer->NumberOfEvents);
             CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
             if (IsListEmpty(&InputBuffer->InputEvents))
             {
@@ -425,6 +426,7 @@ ConSrvTermReadStream(IN OUT PTERMINAL This,
         while (i < NumCharsToRead && !IsListEmpty(&InputBuffer->InputEvents))
         {
             /* Remove an input event from the queue */
+            _InterlockedDecrement((PLONG)&InputBuffer->NumberOfEvents);
             CurrentEntry = RemoveHeadList(&InputBuffer->InputEvents);
             if (IsListEmpty(&InputBuffer->InputEvents))
             {
index 87f22a7..17837c6 100644 (file)
@@ -189,9 +189,10 @@ typedef struct _CONSOLE_INPUT_BUFFER
 {
     CONSOLE_IO_OBJECT Header;       /* Object header - MUST BE IN FIRST PLACE */
 
-    ULONG       InputBufferSize;    /* Size of this input buffer -- UNUSED!! */
-    LIST_ENTRY  InputEvents;        /* List head for input event queue */
-    HANDLE      ActiveEvent;        /* Event set when an input event is added in its queue */
+    ULONG       InputBufferSize;    /* Size of this input buffer (maximum number of events) -- UNUSED!! */
+    ULONG       NumberOfEvents;     /* Current number of events in the queue */
+    LIST_ENTRY  InputEvents;        /* Input events queue list head */
+    HANDLE      ActiveEvent;        /* Event set when an input event is added to the queue */
 
     USHORT      Mode;               /* Input buffer modes */
 } CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER;