diff --git a/virtualization.m b/virtualization.m index 682ef168..d85f9a2d 100644 --- a/virtualization.m +++ b/virtualization.m @@ -1005,47 +1005,60 @@ bool requestStopVirtualMachine(void *machine, void *queue, void **error) return queue; } +typedef void (^handler_t)(NSError *); + +handler_t generateHandler(void handler(void *, char *)) +{ + handler_t ret; + @autoreleasepool { + ret = Block_copy(^(NSError *err){ + virtualMachineCompletionHandler(handler, err); + }); + } + return ret; +} + void startWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + handler_t handler = generateHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine startWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine startWithCompletionHandler:handler]; }); + Block_release(handler); } } void pauseWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + handler_t handler = generateHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine pauseWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine pauseWithCompletionHandler:handler]; }); + Block_release(handler); } } void resumeWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 11, *)) { + handler_t handler = generateHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine resumeWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine resumeWithCompletionHandler:handler]; }); + Block_release(handler); } } void stopWithCompletionHandler(void *machine, void *queue, void *completionHandler) { if (@available(macOS 12, *)) { + handler_t handler = generateHandler(completionHandler); dispatch_sync((dispatch_queue_t)queue, ^{ - [(VZVirtualMachine *)machine stopWithCompletionHandler:^(NSError *err) { - virtualMachineCompletionHandler(completionHandler, err); - }]; + [(VZVirtualMachine *)machine stopWithCompletionHandler:handler]; }); + Block_release(handler); } }