mirror of https://github.com/mgba-emu/mgba.git
Wait on thread initialization before returning from thread creation
This commit is contained in:
parent
9ba9fac898
commit
fffe39153f
|
@ -26,6 +26,12 @@ static void* _GBAThreadRun(void* context) {
|
||||||
GBALoadROM(&gba, threadContext->fd);
|
GBALoadROM(&gba, threadContext->fd);
|
||||||
}
|
}
|
||||||
GBAAttachDebugger(&gba, &debugger);
|
GBAAttachDebugger(&gba, &debugger);
|
||||||
|
|
||||||
|
threadContext->started = 1;
|
||||||
|
pthread_mutex_lock(&threadContext->mutex);
|
||||||
|
pthread_cond_broadcast(&threadContext->cond);
|
||||||
|
pthread_mutex_unlock(&threadContext->mutex);
|
||||||
|
|
||||||
ARMDebuggerRun(&debugger);
|
ARMDebuggerRun(&debugger);
|
||||||
GBADeinit(&gba);
|
GBADeinit(&gba);
|
||||||
|
|
||||||
|
@ -33,5 +39,21 @@ static void* _GBAThreadRun(void* context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int GBAThreadStart(struct GBAThread* threadContext, pthread_t* thread) {
|
int GBAThreadStart(struct GBAThread* threadContext, pthread_t* thread) {
|
||||||
return pthread_create(thread, 0, _GBAThreadRun, threadContext);
|
// TODO: error check
|
||||||
|
{
|
||||||
|
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
threadContext->mutex = mutex;
|
||||||
|
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
||||||
|
threadContext->cond = cond;
|
||||||
|
}
|
||||||
|
pthread_mutex_init(&threadContext->mutex, 0);
|
||||||
|
pthread_cond_init(&threadContext->cond, 0);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&threadContext->mutex);
|
||||||
|
threadContext->started = 0;
|
||||||
|
pthread_create(thread, 0, _GBAThreadRun, threadContext);
|
||||||
|
pthread_cond_wait(&threadContext->cond, &threadContext->mutex);
|
||||||
|
pthread_mutex_unlock(&threadContext->mutex);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,17 @@
|
||||||
|
|
||||||
struct GBAThread {
|
struct GBAThread {
|
||||||
// Output
|
// Output
|
||||||
|
int started;
|
||||||
struct GBA* gba;
|
struct GBA* gba;
|
||||||
struct ARMDebugger* debugger;
|
struct ARMDebugger* debugger;
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
struct GBAVideoRenderer* renderer;
|
struct GBAVideoRenderer* renderer;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
// Threading state
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
pthread_cond_t cond;
|
||||||
};
|
};
|
||||||
|
|
||||||
int GBAThreadStart(struct GBAThread* threadContext, pthread_t* thread);
|
int GBAThreadStart(struct GBAThread* threadContext, pthread_t* thread);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "gba-thread.h"
|
#include "gba-thread.h"
|
||||||
|
#include "renderers/video-software.h"
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -15,8 +15,11 @@ int main(int argc, char** argv) {
|
||||||
pthread_sigmask(SIG_BLOCK, &signals, 0);
|
pthread_sigmask(SIG_BLOCK, &signals, 0);
|
||||||
|
|
||||||
struct GBAThread context;
|
struct GBAThread context;
|
||||||
|
struct GBAVideoSoftwareRenderer renderer;
|
||||||
context.fd = fd;
|
context.fd = fd;
|
||||||
|
context.renderer = 0;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
|
||||||
GBAThreadStart(&context, &thread);
|
GBAThreadStart(&context, &thread);
|
||||||
|
|
||||||
pthread_join(thread, 0);
|
pthread_join(thread, 0);
|
||||||
|
|
Loading…
Reference in New Issue