mirror of https://github.com/encounter/SDL.git
Wait for all the threads to actually finish before exiting
Fixes https://github.com/libsdl-org/SDL/issues/5748
This commit is contained in:
parent
847539afeb
commit
345efdcb10
|
@ -471,9 +471,6 @@ static SDL_bool DequeueEvent_Mutex(SDL_EventQueue *queue, SDL_Event *event)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_sem *writersDone;
|
|
||||||
static SDL_sem *readersDone;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SDL_EventQueue *queue;
|
SDL_EventQueue *queue;
|
||||||
|
@ -482,6 +479,7 @@ typedef struct
|
||||||
int waits;
|
int waits;
|
||||||
SDL_bool lock_free;
|
SDL_bool lock_free;
|
||||||
char padding2[SDL_CACHELINE_SIZE-sizeof(int)-sizeof(SDL_bool)];
|
char padding2[SDL_CACHELINE_SIZE-sizeof(int)-sizeof(SDL_bool)];
|
||||||
|
SDL_Thread *thread;
|
||||||
} WriterData;
|
} WriterData;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -491,6 +489,7 @@ typedef struct
|
||||||
int waits;
|
int waits;
|
||||||
SDL_bool lock_free;
|
SDL_bool lock_free;
|
||||||
char padding[SDL_CACHELINE_SIZE-(sizeof(SDL_EventQueue*)+sizeof(int)*NUM_WRITERS+sizeof(int)+sizeof(SDL_bool))%SDL_CACHELINE_SIZE];
|
char padding[SDL_CACHELINE_SIZE-(sizeof(SDL_EventQueue*)+sizeof(int)*NUM_WRITERS+sizeof(int)+sizeof(SDL_bool))%SDL_CACHELINE_SIZE];
|
||||||
|
SDL_Thread *thread;
|
||||||
} ReaderData;
|
} ReaderData;
|
||||||
|
|
||||||
static int SDLCALL FIFO_Writer(void* _data)
|
static int SDLCALL FIFO_Writer(void* _data)
|
||||||
|
@ -523,7 +522,6 @@ static int SDLCALL FIFO_Writer(void* _data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SDL_SemPost(writersDone);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,7 +558,6 @@ static int SDLCALL FIFO_Reader(void* _data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SDL_SemPost(readersDone);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,6 +587,7 @@ static int SDLCALL FIFO_Watcher(void* _data)
|
||||||
static void RunFIFOTest(SDL_bool lock_free)
|
static void RunFIFOTest(SDL_bool lock_free)
|
||||||
{
|
{
|
||||||
SDL_EventQueue queue;
|
SDL_EventQueue queue;
|
||||||
|
SDL_Thread *fifo_thread = NULL;
|
||||||
WriterData writerData[NUM_WRITERS];
|
WriterData writerData[NUM_WRITERS];
|
||||||
ReaderData readerData[NUM_READERS];
|
ReaderData readerData[NUM_READERS];
|
||||||
Uint32 start, end;
|
Uint32 start, end;
|
||||||
|
@ -601,9 +599,6 @@ static void RunFIFOTest(SDL_bool lock_free)
|
||||||
SDL_Log("\nFIFO test---------------------------------------\n\n");
|
SDL_Log("\nFIFO test---------------------------------------\n\n");
|
||||||
SDL_Log("Mode: %s\n", lock_free ? "LockFree" : "Mutex");
|
SDL_Log("Mode: %s\n", lock_free ? "LockFree" : "Mutex");
|
||||||
|
|
||||||
readersDone = SDL_CreateSemaphore(0);
|
|
||||||
writersDone = SDL_CreateSemaphore(0);
|
|
||||||
|
|
||||||
SDL_memset(&queue, 0xff, sizeof(queue));
|
SDL_memset(&queue, 0xff, sizeof(queue));
|
||||||
|
|
||||||
InitEventQueue(&queue);
|
InitEventQueue(&queue);
|
||||||
|
@ -616,7 +611,7 @@ static void RunFIFOTest(SDL_bool lock_free)
|
||||||
#ifdef TEST_SPINLOCK_FIFO
|
#ifdef TEST_SPINLOCK_FIFO
|
||||||
/* Start a monitoring thread */
|
/* Start a monitoring thread */
|
||||||
if (lock_free) {
|
if (lock_free) {
|
||||||
SDL_CreateThread(FIFO_Watcher, "FIFOWatcher", &queue);
|
fifo_thread = SDL_CreateThread(FIFO_Watcher, "FIFOWatcher", &queue);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -628,7 +623,7 @@ static void RunFIFOTest(SDL_bool lock_free)
|
||||||
SDL_snprintf(name, sizeof (name), "FIFOReader%d", i);
|
SDL_snprintf(name, sizeof (name), "FIFOReader%d", i);
|
||||||
readerData[i].queue = &queue;
|
readerData[i].queue = &queue;
|
||||||
readerData[i].lock_free = lock_free;
|
readerData[i].lock_free = lock_free;
|
||||||
SDL_CreateThread(FIFO_Reader, name, &readerData[i]);
|
readerData[i].thread = SDL_CreateThread(FIFO_Reader, name, &readerData[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start up the writers */
|
/* Start up the writers */
|
||||||
|
@ -640,12 +635,12 @@ static void RunFIFOTest(SDL_bool lock_free)
|
||||||
writerData[i].queue = &queue;
|
writerData[i].queue = &queue;
|
||||||
writerData[i].index = i;
|
writerData[i].index = i;
|
||||||
writerData[i].lock_free = lock_free;
|
writerData[i].lock_free = lock_free;
|
||||||
SDL_CreateThread(FIFO_Writer, name, &writerData[i]);
|
writerData[i].thread = SDL_CreateThread(FIFO_Writer, name, &writerData[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for the writers */
|
/* Wait for the writers */
|
||||||
for (i = 0; i < NUM_WRITERS; ++i) {
|
for (i = 0; i < NUM_WRITERS; ++i) {
|
||||||
SDL_SemWait(writersDone);
|
SDL_WaitThread(writerData[i].thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Shut down the queue so readers exit */
|
/* Shut down the queue so readers exit */
|
||||||
|
@ -653,13 +648,15 @@ static void RunFIFOTest(SDL_bool lock_free)
|
||||||
|
|
||||||
/* Wait for the readers */
|
/* Wait for the readers */
|
||||||
for (i = 0; i < NUM_READERS; ++i) {
|
for (i = 0; i < NUM_READERS; ++i) {
|
||||||
SDL_SemWait(readersDone);
|
SDL_WaitThread(readerData[i].thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
end = SDL_GetTicks();
|
end = SDL_GetTicks();
|
||||||
|
|
||||||
SDL_DestroySemaphore(readersDone);
|
/* Wait for the FIFO thread */
|
||||||
SDL_DestroySemaphore(writersDone);
|
if (fifo_thread) {
|
||||||
|
SDL_WaitThread(fifo_thread, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!lock_free) {
|
if (!lock_free) {
|
||||||
SDL_DestroyMutex(queue.mutex);
|
SDL_DestroyMutex(queue.mutex);
|
||||||
|
|
Loading…
Reference in New Issue