SDL: Fixed the queue filling up with sentinel events when the WaitEvent call is passed NULL for the event

From 84320266f2fec31c79f1bf7267288c6f30a06365 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 25 Jan 2022 12:37:43 -0800
Subject: [PATCH] Fixed the queue filling up with sentinel events when the
 WaitEvent call is passed NULL for the event

The use case is an application that waits for events on the main thread and dispatches them on a separate thread.
---
 src/events/SDL_events.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c
index 220fe177742..a6c2dd68c50 100644
--- a/src/events/SDL_events.c
+++ b/src/events/SDL_events.c
@@ -891,7 +891,11 @@ SDL_WaitEventTimeout_Device(_THIS, SDL_Window *wakeup_window, SDL_Event * event,
            c) Periodic processing that takes place in some platform PumpEvents() functions happens
            d) Signals received in WaitEventTimeout() are turned into SDL events
         */
-        SDL_PumpEventsInternal(SDL_TRUE);
+        /* We only want a single sentinel in the queue. We could get more than one if event is NULL,
+         * since the SDL_PeepEvents() call below won't remove it in that case.
+         */
+        SDL_bool add_sentinel = (SDL_AtomicGet(&SDL_sentinel_pending) == 0) ? SDL_TRUE : SDL_FALSE;
+        SDL_PumpEventsInternal(add_sentinel);
 
         if (!_this->wakeup_lock || SDL_LockMutex(_this->wakeup_lock) == 0) {
             int status = SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);