diff --git a/virtualization.m b/virtualization.m index 0631da1..4ce545a 100644 --- a/virtualization.m +++ b/virtualization.m @@ -806,40 +806,53 @@ 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) { + 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) { + 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) { + 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) { + 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); } // TODO(codehex): use KVO @@ -908,4 +921,4 @@ void startVirtualMachineWindow(void *machine, double width, double height) NSApp.delegate = appDelegate; [NSApp run]; } -} \ No newline at end of file +}