Perf: Fix deadlock when interrupting the process

This commit is contained in:
Jeffrey Pfau 2014-12-12 01:10:53 -08:00
parent 31f0e179c0
commit 8ea97f0047
1 changed files with 7 additions and 1 deletions

View File

@ -36,6 +36,7 @@ static void _GBAPerfShutdown(int signal);
static bool _parsePerfOpts(struct SubParser* parser, struct GBAConfig* config, int option, const char* arg); static bool _parsePerfOpts(struct SubParser* parser, struct GBAConfig* config, int option, const char* arg);
static struct GBAThread* _thread; static struct GBAThread* _thread;
static bool _dispatchExiting = false;
int main(int argc, char** argv) { int main(int argc, char** argv) {
signal(SIGINT, _GBAPerfShutdown); signal(SIGINT, _GBAPerfShutdown);
@ -152,6 +153,9 @@ static void _GBAPerfRunloop(struct GBAThread* context, int* frames, bool quiet)
if (*frames == duration) { if (*frames == duration) {
_GBAPerfShutdown(0); _GBAPerfShutdown(0);
} }
if (_dispatchExiting) {
GBAThreadEnd(context);
}
} }
if (!quiet) { if (!quiet) {
printf("\033[2K\r"); printf("\033[2K\r");
@ -160,7 +164,9 @@ static void _GBAPerfRunloop(struct GBAThread* context, int* frames, bool quiet)
static void _GBAPerfShutdown(int signal) { static void _GBAPerfShutdown(int signal) {
UNUSED(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) { static bool _parsePerfOpts(struct SubParser* parser, struct GBAConfig* config, int option, const char* arg) {