From 402fa9aed6eb2017e342c1b9a2e8e3d3f3efe786 Mon Sep 17 00:00:00 2001 From: Michael Buckley Date: Tue, 3 Dec 2019 19:55:26 -0800 Subject: [PATCH] Mac: Replace os_unfair_lock with pthread_mutex_t, since os_unfair_lock is crashong on at least one computer --- macosx/mac-joypad.mm | 19 +++++----- macosx/mac-os.h | 2 +- macosx/mac-os.mm | 84 ++++++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/macosx/mac-joypad.mm b/macosx/mac-joypad.mm index e982eec8..67b78838 100755 --- a/macosx/mac-joypad.mm +++ b/macosx/mac-joypad.mm @@ -18,9 +18,10 @@ (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ - #include +#include + #include "port.h" #include @@ -112,14 +113,14 @@ std::string NameForDevice(struct JoypadDevice device) { } void gamepadAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValueRef v) { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); IOHIDDeviceRef device = (IOHIDDeviceRef) inSender; uint32 port = ((NSNumber *)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDLocationIDKey))).unsignedIntValue; if (deviceIndexByPort.find(port) == deviceIndexByPort.end()) { - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return; } @@ -135,20 +136,20 @@ void gamepadAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValu if (allDevices.find(deviceStruct) == allDevices.end()) { - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return; } if ( playerNumByDevice.find(deviceStruct) == playerNumByDevice.end()) { - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return; } int8 playerNum = playerNumByDevice[deviceStruct]; if (playerNum < 0 || playerNum >= MAC_MAX_PLAYERS) { - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return; } @@ -173,7 +174,7 @@ void gamepadAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValu objcInput.cookie = inputStruct.cookie.cookie; objcInput.value =inputStruct.value; - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); if (info.min != info.max) { if (inputStruct.value <= info.min || inputStruct.value >= info.max) @@ -191,7 +192,7 @@ void gamepadAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValu return; } } - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); struct JoypadInput oppositeInputStruct = inputStruct; @@ -265,7 +266,7 @@ void gamepadAction(void *inContext, IOReturn inResult, void *inSender, IOHIDValu } } - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } void findControls(struct JoypadDevice &device, NSDictionary *properties, NSMutableArray *buttons, NSMutableArray *axes, int64 *hat) diff --git a/macosx/mac-os.h b/macosx/mac-os.h index 15d55fd9..cc1a89cb 100644 --- a/macosx/mac-os.h +++ b/macosx/mac-os.h @@ -165,7 +165,7 @@ extern IconRef macIconRef[118]; extern bool8 pressedKeys[MAC_MAX_PLAYERS][kNumButtons]; extern bool8 pressedGamepadButtons[MAC_MAX_PLAYERS][kNumButtons]; -extern os_unfair_lock keyLock; +extern pthread_mutex_t keyLock; extern NSOpenGLView *s9xView; diff --git a/macosx/mac-os.mm b/macosx/mac-os.mm index cca286fc..32d198a9 100644 --- a/macosx/mac-os.mm +++ b/macosx/mac-os.mm @@ -231,8 +231,8 @@ bool8 pressedGamepadButtons[MAC_MAX_PLAYERS][kNumButtons] = { 0 }; bool8 pressedFunctionButtons[kNumFunctionButtons] = { 0 }; bool8 pressedRawKeyboardButtons[MAC_NUM_KEYCODES] = { 0 }; bool8 heldFunctionButtons[kNumFunctionButtons] = { 0 }; -os_unfair_lock keyLock; -os_unfair_lock renderLock; +pthread_mutex_t keyLock; +pthread_mutex_t renderLock; NSOpenGLView *s9xView; @@ -350,10 +350,10 @@ static void * MacSnes9xThread (void *) void CopyPressedKeys(bool8 keys[MAC_MAX_PLAYERS][kNumButtons], bool8 gamepadButtons[MAC_MAX_PLAYERS][kNumButtons]) { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); memcpy(keys, pressedKeys, sizeof(pressedKeys)); memcpy(gamepadButtons, pressedGamepadButtons, sizeof(pressedGamepadButtons)); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } static inline void EmulationLoop (void) @@ -413,9 +413,9 @@ static inline void EmulationLoop (void) if (!pauseEmulation) { - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); S9xMainLoop(); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); } else { @@ -424,9 +424,9 @@ static inline void EmulationLoop (void) macFrameSkip = 1; skipFrames = 1; frameAdvance = false; - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); S9xMainLoop(); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); macFrameSkip = storedMacFrameSkip; } @@ -2291,9 +2291,9 @@ static void ProcessInput (void) CopyPressedKeys(keys, gamepadButtons); isok = SNES9X_Freeze(); - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); ClearGFXScreen(); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); return; } @@ -2304,9 +2304,9 @@ static void ProcessInput (void) CopyPressedKeys(keys, gamepadButtons); isok = SNES9X_Defrost(); - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); ClearGFXScreen(); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); return; } @@ -2880,8 +2880,8 @@ void QuitWithFatalError ( NSString *message) + (void)initialize { - keyLock = OS_UNFAIR_LOCK_INIT; - renderLock = OS_UNFAIR_LOCK_INIT; + keyLock = PTHREAD_MUTEX_INITIALIZER; + renderLock = PTHREAD_MUTEX_INITIALIZER; } - (instancetype)initWithFrame:(NSRect)frameRect pixelFormat:(nullable NSOpenGLPixelFormat *)format @@ -2916,7 +2916,7 @@ void QuitWithFatalError ( NSString *message) return; } - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); S9xButton button = keyCodes[event.keyCode]; if ( button.buttonCode >= 0 && button.buttonCode < kNumButtons && button.player <= 0 && button.player <= MAC_MAX_PLAYERS) { @@ -2934,7 +2934,7 @@ void QuitWithFatalError ( NSString *message) pressedRawKeyboardButtons[event.keyCode] = true; - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (void)keyUp:(NSEvent *)event @@ -2944,7 +2944,7 @@ void QuitWithFatalError ( NSString *message) return; } - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); S9xButton button = keyCodes[event.keyCode]; if ( button.buttonCode >= 0 && button.buttonCode < kNumButtons && button.player <= 0 && button.player <= MAC_MAX_PLAYERS) { @@ -2963,7 +2963,7 @@ void QuitWithFatalError ( NSString *message) pressedRawKeyboardButtons[event.keyCode] = false; - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (void)flagsChanged:(NSEvent *)event @@ -2973,7 +2973,7 @@ void QuitWithFatalError ( NSString *message) return; } - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); NSEventModifierFlags flags = event.modifierFlags; @@ -3001,7 +3001,7 @@ void QuitWithFatalError ( NSString *message) pressedKeys[button.player][button.buttonCode] = (flags & NSEventModifierFlagOption) != 0; } - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (void)mouseDown:(NSEvent *)event @@ -3012,13 +3012,13 @@ void QuitWithFatalError ( NSString *message) - (void)drawRect:(NSRect)dirtyRect { - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); self.subviews[0].hidden = !pauseEmulation; CGFloat scaleFactor = MAX(self.window.backingScaleFactor, 1.0); glScreenW = self.frame.size.width * scaleFactor; glScreenH = self.frame.size.height * scaleFactor; S9xPutImage(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); } - (void)setFrame:(NSRect)frame @@ -3089,9 +3089,9 @@ void QuitWithFatalError ( NSString *message) skipFrames = macFrameSkip; S9xInitDisplay(NULL, NULL); - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); ClearGFXScreen(); - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); [NSThread detachNewThreadWithBlock:^ { @@ -3157,7 +3157,7 @@ void QuitWithFatalError ( NSString *message) - (NSArray *)listJoypads { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); NSMutableArray *joypads = [NSMutableArray new]; for (auto joypadStruct : ListJoypads()) { @@ -3191,44 +3191,44 @@ void QuitWithFatalError ( NSString *message) return result; }]; - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return joypads; } - (void)setPlayer:(int8)player forVendorID:(uint32)vendorID productID:(uint32)productID index:(uint32)index oldPlayer:(int8 *)oldPlayer { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); SetPlayerForJoypad(player, vendorID, productID, index, oldPlayer); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (BOOL)setButton:(S9xButtonCode)button forVendorID:(uint32)vendorID productID:(uint32)productID index:(uint32)index cookie:(uint32)cookie value:(int32)value oldButton:(S9xButtonCode *)oldButton { BOOL result = NO; - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); result = SetButtonCodeForJoypadControl(vendorID, productID, index, cookie, value, button, true, oldButton); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return result; } - (void)clearJoypadForVendorID:(uint32)vendorID productID:(uint32)productID index:(uint32)index { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); ClearJoypad(vendorID, productID, index); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (void)clearJoypadForVendorID:(uint32)vendorID productID:(uint32)productID index:(uint32)index buttonCode:(S9xButtonCode)buttonCode { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); ClearButtonCodeForJoypad(vendorID, productID, index, buttonCode); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (NSArray *)getInputsForVendorID:(uint32)vendorID productID:(uint32)productID index:(uint32)index { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); NSMutableArray *inputs = [NSMutableArray new]; std::unordered_map buttonCodeMap = GetJuypadButtons(vendorID, productID, index); for (auto it = buttonCodeMap.begin(); it != buttonCodeMap.end(); ++it) @@ -3240,7 +3240,7 @@ void QuitWithFatalError ( NSString *message) [inputs addObject:input]; } - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return inputs; } @@ -3253,17 +3253,17 @@ void QuitWithFatalError ( NSString *message) - (BOOL)setButton:(S9xButtonCode)button forKey:(int16)key player:(int8)player oldButton:(S9xButtonCode *)oldButton oldPlayer:(int8 *)oldPlayer oldKey:(int16 *)oldKey { BOOL result = NO; - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); result = SetKeyCode(key, button, player, oldKey, oldButton, oldPlayer); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); return result; } - (void)clearButton:(S9xButtonCode)button forPlayer:(int8)player { - os_unfair_lock_lock(&keyLock); + pthread_mutex_lock(&keyLock); ClearKeyCode(button, player); - os_unfair_lock_unlock(&keyLock); + pthread_mutex_unlock(&keyLock); } - (BOOL)loadROM:(NSURL *)fileURL @@ -3287,9 +3287,9 @@ void QuitWithFatalError ( NSString *message) - (void)setVideoMode:(int)mode { - os_unfair_lock_lock(&renderLock); + pthread_mutex_lock(&renderLock); videoMode = mode; - os_unfair_lock_unlock(&renderLock); + pthread_mutex_unlock(&renderLock); } @dynamic inputDelegate;