all repos — mgba @ 8ea97f00476f4a630340a1578106b7791bcbf0f9

mGBA Game Boy Advance Emulator

Perf: Fix deadlock when interrupting the process
Jeffrey Pfau jeffrey@endrift.com
Fri, 12 Dec 2014 01:10:53 -0800
commit

8ea97f00476f4a630340a1578106b7791bcbf0f9

parent

31f0e179c028ee0d33cd9891d7bf667b26dfe087

1 files changed, 7 insertions(+), 1 deletions(-)

jump to
M src/platform/perf-main.csrc/platform/perf-main.c

@@ -36,6 +36,7 @@ static void _GBAPerfShutdown(int signal);

static bool _parsePerfOpts(struct SubParser* parser, struct GBAConfig* config, int option, const char* arg); static struct GBAThread* _thread; +static bool _dispatchExiting = false; int main(int argc, char** argv) { signal(SIGINT, _GBAPerfShutdown);

@@ -152,6 +153,9 @@ GBASyncWaitFrameEnd(&context->sync);

if (*frames == duration) { _GBAPerfShutdown(0); } + if (_dispatchExiting) { + GBAThreadEnd(context); + } } if (!quiet) { printf("\033[2K\r");

@@ -160,7 +164,9 @@ }

static void _GBAPerfShutdown(int signal) { UNUSED(signal); - GBAThreadEnd(_thread); + // This will come in ON the GBA thread, so we have to handle it carefully + _dispatchExiting = true; + ConditionWake(&_thread->sync.videoFrameAvailableCond); } static bool _parsePerfOpts(struct SubParser* parser, struct GBAConfig* config, int option, const char* arg) {