Better logging in macOS unmount code.
authorCarl Hetherington <cth@carlh.net>
Thu, 12 Jan 2023 23:59:40 +0000 (00:59 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 29 Jan 2023 21:43:43 +0000 (22:43 +0100)
src/lib/cross_osx.cc

index c54dd99f3f8f5e87da82a30c46d465399b37e3f8..3b04f1011d40bd1daed90ac1a26c041ef833a7d4 100644 (file)
@@ -405,16 +405,23 @@ config_path (optional<string> version)
 }
 
 
+struct UnmountState
+{
+       bool success = false;
+       bool callback = false;
+};
+
+
 void done_callback(DADiskRef, DADissenterRef dissenter, void* context)
 {
        LOG_DISK_NC("Unmount finished");
-       bool* success = reinterpret_cast<bool*> (context);
+       auto state = reinterpret_cast<UnmountState*>(context);
+       state->callback = true;
        if (dissenter) {
                LOG_DISK("Error: %1", DADissenterGetStatus(dissenter));
-               *success = false;
        } else {
                LOG_DISK_NC("Successful");
-               *success = true;
+               state->success = true;
        }
 }
 
@@ -434,19 +441,22 @@ Drive::unmount ()
                return false;
        }
        LOG_DISK("Requesting unmount of %1 from %2", _device, thread_id());
-       bool success = false;
-       DADiskUnmount(disk, kDADiskUnmountOptionWhole, &done_callback, &success);
+       UnmountState state;
+       DADiskUnmount(disk, kDADiskUnmountOptionWhole, &done_callback, &state);
        CFRelease (disk);
 
        CFRunLoopRef run_loop = CFRunLoopGetCurrent ();
        DASessionScheduleWithRunLoop (session, run_loop, kCFRunLoopDefaultMode);
        CFRunLoopStop (run_loop);
-       CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, 0);
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5, 0);
        CFRelease(session);
 
-       LOG_DISK_NC("End of unmount");
-       return success;
+       if (!state.callback) {
+               LOG_DISK_NC("End of unmount: timeout");
+       } else {
+               LOG_DISK("End of unmount: %1", state.success ? "success" : "failure");
+       }
+       return state.success;
 }