summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-05-20 17:53:35 +0000
committerSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-05-20 17:53:35 +0000
commit071c83ecdf11a22ea4a045be6c87d849a21c8f38 (patch)
tree62b88dc27753d681ef32b56ead033b4f7f05a1a4
parent6085634d2dad25a9c2fa13d7bfb1be25376e26d3 (diff)
downloadpcsxr-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-xmacosx/EmuThread.m43
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