diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-05-20 17:53:35 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-05-20 17:53:35 +0000 |
| commit | 071c83ecdf11a22ea4a045be6c87d849a21c8f38 (patch) | |
| tree | 62b88dc27753d681ef32b56ead033b4f7f05a1a4 | |
| parent | 6085634d2dad25a9c2fa13d7bfb1be25376e26d3 (diff) | |
| download | pcsxr-071c83ecdf11a22ea4a045be6c87d849a21c8f38.tar.gz | |
Prevent deadlocking when saving states on OS X.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@84818 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rwxr-xr-x | macosx/EmuThread.m | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/macosx/EmuThread.m b/macosx/EmuThread.m index 9f0dd97a..2f8c5d62 100755 --- a/macosx/EmuThread.m +++ b/macosx/EmuThread.m @@ -312,6 +312,23 @@ done: return NO; } ++ (void)pauseSafeWithBlock:(void (^)(BOOL))theBlock +{ + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + BOOL wasPaused = NO; + if ((paused == 2) || ![EmuThread active]) + { + wasPaused = YES; + } else { + [EmuThread pause]; + while ([EmuThread isPaused] != 2) [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:0.05]]; + wasPaused = NO; + } + + dispatch_async(dispatch_get_main_queue(), ^{theBlock(wasPaused);}); + }); +} + + (void)resume { if (!paused || ![EmuThread active]) @@ -369,18 +386,20 @@ done: + (void)freezeAt:(NSString *)path which:(int)num { - BOOL emuWasPaused = [EmuThread pauseSafe]; - char Text[256]; - - GPU_freeze(2, (GPUFreeze_t *)&num); - int ret = SaveState([path fileSystemRepresentation]); - if (ret == 0) sprintf (Text, _("*PCSXR*: Saved State %d"), num); - else sprintf (Text, _("*PCSXR*: Error Saving State %d"), num); - GPU_displayText(Text); - - if (!emuWasPaused) { - [EmuThread resume]; - } + [self pauseSafeWithBlock:^(BOOL emuWasPaused) { + char Text[256]; + + GPU_freeze(2, (GPUFreeze_t *)&num); + int ret = SaveState([path fileSystemRepresentation]); + if (ret == 0) sprintf (Text, _("*PCSXR*: Saved State %d"), num); + else sprintf (Text, _("*PCSXR*: Error Saving State %d"), num); + GPU_displayText(Text); + + if (!emuWasPaused) { + [EmuThread resume]; + } + + }]; } + (BOOL)defrostAt:(NSString *)path |
