mirror of https://github.com/encounter/SDL.git
fix handling of SDL_EventQ.active
- SDL_EventQ.active is a bool variable -> do not use SDL_AtomicGet/Set, it does not help in any way - protect SDL_EventQ.active with SDL_EventQ.lock - set SDL_EventQ.active to FALSE by default
This commit is contained in:
parent
eb670742f5
commit
e873d60981
|
@ -86,7 +86,7 @@ typedef struct _SDL_SysWMEntry
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
SDL_mutex *lock;
|
SDL_mutex *lock;
|
||||||
SDL_atomic_t active;
|
SDL_bool active;
|
||||||
SDL_atomic_t count;
|
SDL_atomic_t count;
|
||||||
int max_events_seen;
|
int max_events_seen;
|
||||||
SDL_EventEntry *head;
|
SDL_EventEntry *head;
|
||||||
|
@ -94,7 +94,7 @@ static struct
|
||||||
SDL_EventEntry *free;
|
SDL_EventEntry *free;
|
||||||
SDL_SysWMEntry *wmmsg_used;
|
SDL_SysWMEntry *wmmsg_used;
|
||||||
SDL_SysWMEntry *wmmsg_free;
|
SDL_SysWMEntry *wmmsg_free;
|
||||||
} SDL_EventQ = { NULL, { 1 }, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };
|
} SDL_EventQ = { NULL, SDL_FALSE, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };
|
||||||
|
|
||||||
|
|
||||||
#if !SDL_JOYSTICK_DISABLED
|
#if !SDL_JOYSTICK_DISABLED
|
||||||
|
@ -474,7 +474,7 @@ SDL_StopEventLoop(void)
|
||||||
SDL_LockMutex(SDL_EventQ.lock);
|
SDL_LockMutex(SDL_EventQ.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_AtomicSet(&SDL_EventQ.active, 0);
|
SDL_EventQ.active = SDL_FALSE;
|
||||||
|
|
||||||
if (report && SDL_atoi(report)) {
|
if (report && SDL_atoi(report)) {
|
||||||
SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
|
SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
|
||||||
|
@ -554,10 +554,12 @@ SDL_StartEventLoop(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SDL_LockMutex(SDL_EventQ.lock);
|
||||||
|
|
||||||
if (!SDL_event_watchers_lock) {
|
if (!SDL_event_watchers_lock) {
|
||||||
SDL_event_watchers_lock = SDL_CreateMutex();
|
SDL_event_watchers_lock = SDL_CreateMutex();
|
||||||
if (SDL_event_watchers_lock == NULL) {
|
if (SDL_event_watchers_lock == NULL) {
|
||||||
|
SDL_UnlockMutex(SDL_EventQ.lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -572,8 +574,10 @@ SDL_StartEventLoop(void)
|
||||||
SDL_EventState(SDL_DROPTEXT, SDL_DISABLE);
|
SDL_EventState(SDL_DROPTEXT, SDL_DISABLE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SDL_AtomicSet(&SDL_EventQ.active, 1);
|
SDL_EventQ.active = SDL_TRUE;
|
||||||
|
if (SDL_EventQ.lock) {
|
||||||
|
SDL_UnlockMutex(SDL_EventQ.lock);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,17 +696,20 @@ SDL_PeepEventsInternal(SDL_Event * events, int numevents, SDL_eventaction action
|
||||||
{
|
{
|
||||||
int i, used, sentinels_expected = 0;
|
int i, used, sentinels_expected = 0;
|
||||||
|
|
||||||
|
/* Lock the event queue */
|
||||||
|
used = 0;
|
||||||
|
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
|
||||||
/* Don't look after we've quit */
|
/* Don't look after we've quit */
|
||||||
if (!SDL_AtomicGet(&SDL_EventQ.active)) {
|
if (!SDL_EventQ.active) {
|
||||||
|
if (SDL_EventQ.lock) {
|
||||||
|
SDL_UnlockMutex(SDL_EventQ.lock);
|
||||||
|
}
|
||||||
/* We get a few spurious events at shutdown, so don't warn then */
|
/* We get a few spurious events at shutdown, so don't warn then */
|
||||||
if (action == SDL_GETEVENT) {
|
if (action == SDL_GETEVENT) {
|
||||||
SDL_SetError("The event system has been shut down");
|
SDL_SetError("The event system has been shut down");
|
||||||
}
|
}
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
/* Lock the event queue */
|
|
||||||
used = 0;
|
|
||||||
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
|
|
||||||
if (action == SDL_ADDEVENT) {
|
if (action == SDL_ADDEVENT) {
|
||||||
for (i = 0; i < numevents; ++i) {
|
for (i = 0; i < numevents; ++i) {
|
||||||
used += SDL_AddEvent(&events[i]);
|
used += SDL_AddEvent(&events[i]);
|
||||||
|
@ -810,15 +817,12 @@ SDL_FlushEvent(Uint32 type)
|
||||||
void
|
void
|
||||||
SDL_FlushEvents(Uint32 minType, Uint32 maxType)
|
SDL_FlushEvents(Uint32 minType, Uint32 maxType)
|
||||||
{
|
{
|
||||||
|
SDL_EventEntry *entry, *next;
|
||||||
|
Uint32 type;
|
||||||
/* !!! FIXME: we need to manually SDL_free() the strings in TEXTINPUT and
|
/* !!! FIXME: we need to manually SDL_free() the strings in TEXTINPUT and
|
||||||
drag'n'drop events if we're flushing them without passing them to the
|
drag'n'drop events if we're flushing them without passing them to the
|
||||||
app, but I don't know if this is the right place to do that. */
|
app, but I don't know if this is the right place to do that. */
|
||||||
|
|
||||||
/* Don't look after we've quit */
|
|
||||||
if (!SDL_AtomicGet(&SDL_EventQ.active)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure the events are current */
|
/* Make sure the events are current */
|
||||||
#if 0
|
#if 0
|
||||||
/* Actually, we can't do this since we might be flushing while processing
|
/* Actually, we can't do this since we might be flushing while processing
|
||||||
|
@ -829,8 +833,13 @@ SDL_FlushEvents(Uint32 minType, Uint32 maxType)
|
||||||
|
|
||||||
/* Lock the event queue */
|
/* Lock the event queue */
|
||||||
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
|
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
|
||||||
SDL_EventEntry *entry, *next;
|
/* Don't look after we've quit */
|
||||||
Uint32 type;
|
if (!SDL_EventQ.active) {
|
||||||
|
if (SDL_EventQ.lock) {
|
||||||
|
SDL_UnlockMutex(SDL_EventQ.lock);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (entry = SDL_EventQ.head; entry; entry = next) {
|
for (entry = SDL_EventQ.head; entry; entry = next) {
|
||||||
next = entry->next;
|
next = entry->next;
|
||||||
type = entry->event.type;
|
type = entry->event.type;
|
||||||
|
|
Loading…
Reference in New Issue