Commit 6d67c98e70fc3565d9f75c5a58b44cc38633f20b

Sam Lantinga 2016-10-19T20:39:12

Fixed crash on Mac OS X 10.10 and earlier

diff --git a/src/video/cocoa/SDL_cocoakeyboard.m b/src/video/cocoa/SDL_cocoakeyboard.m
index 91267e5..8b2ed91 100644
--- a/src/video/cocoa/SDL_cocoakeyboard.m
+++ b/src/video/cocoa/SDL_cocoakeyboard.m
@@ -195,6 +195,11 @@ static IOHIDManagerRef s_hidManager = NULL;
 static void
 HIDCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value)
 {
+    if (context != s_hidManager) {
+        /* An old callback, ignore it (related to bug 2157 below) */
+        return;
+    }
+
     IOHIDElementRef elem = IOHIDValueGetElement(value);
     if (IOHIDElementGetUsagePage(elem) != kHIDPage_KeyboardOrKeypad
         || IOHIDElementGetUsage(elem) != kHIDUsage_KeyboardCapsLock) {
@@ -232,13 +237,14 @@ QuitHIDCallback()
     if (!s_hidManager) {
         return;
     }
-    IOHIDManagerUnscheduleFromRunLoop(s_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
-    IOHIDManagerRegisterInputValueCallback(s_hidManager, NULL, NULL);
-    IOHIDManagerClose(s_hidManager, 0);
 
 #if 0 /* Releasing here causes a crash on Mac OS X 10.10 and earlier,
        * so just leak it for now. See bug 2157 for details.
        */
+    IOHIDManagerUnscheduleFromRunLoop(s_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+    IOHIDManagerRegisterInputValueCallback(s_hidManager, NULL, NULL);
+    IOHIDManagerClose(s_hidManager, 0);
+
     CFRelease(s_hidManager);
 #endif
     s_hidManager = NULL;
@@ -267,7 +273,7 @@ InitHIDCallback()
         goto fail;
     }
     IOHIDManagerSetDeviceMatchingMultiple(s_hidManager, matches);
-    IOHIDManagerRegisterInputValueCallback(s_hidManager, HIDCallback, NULL);
+    IOHIDManagerRegisterInputValueCallback(s_hidManager, HIDCallback, s_hidManager);
     IOHIDManagerScheduleWithRunLoop(s_hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
     if (IOHIDManagerOpen(s_hidManager, kIOHIDOptionsTypeNone) == kIOReturnSuccess) {
         goto cleanup;