浏览代码

helper: terminate child task on quit

osy 3 年之前
父节点
当前提交
88e7c27e7b
共有 3 个文件被更改,包括 12 次插入3 次删除
  1. 1 0
      Managers/UTMQemu.m
  2. 9 2
      QEMUHelper/QEMUHelper.m
  3. 2 1
      QEMUHelper/QEMUHelperProtocol.h

+ 1 - 0
Managers/UTMQemu.m

@@ -201,6 +201,7 @@
 
 
 - (void)stopQemu {
 - (void)stopQemu {
     if (_connection) {
     if (_connection) {
+        [[_connection remoteObjectProxy] terminate];
         [_connection invalidate];
         [_connection invalidate];
     }
     }
     for (NSURL *url in _urls) {
     for (NSURL *url in _urls) {

+ 9 - 2
QEMUHelper/QEMUHelper.m

@@ -20,7 +20,7 @@
 @interface QEMUHelper ()
 @interface QEMUHelper ()
 
 
 @property NSMutableArray<NSURL *> *urls;
 @property NSMutableArray<NSURL *> *urls;
-@property dispatch_queue_t childWaitQueue;
+@property NSTask *childTask;
 
 
 @end
 @end
 
 
@@ -29,7 +29,6 @@
 - (instancetype)init {
 - (instancetype)init {
     if (self = [super init]) {
     if (self = [super init]) {
         self.urls = [NSMutableArray array];
         self.urls = [NSMutableArray array];
-        self.childWaitQueue = dispatch_queue_create("childWaitQueue", DISPATCH_QUEUE_CONCURRENT);
     }
     }
     return self;
     return self;
 }
 }
@@ -107,6 +106,7 @@
     NSTask *task = [NSTask new];
     NSTask *task = [NSTask new];
     NSMutableArray<NSString *> *newArgv = [argv mutableCopy];
     NSMutableArray<NSString *> *newArgv = [argv mutableCopy];
     NSString *path = [libraryPath URLByAppendingPathComponent:binName].path;
     NSString *path = [libraryPath URLByAppendingPathComponent:binName].path;
+    __weak typeof(self) _self = self;
     [newArgv insertObject:path atIndex:0];
     [newArgv insertObject:path atIndex:0];
     task.executableURL = [[[NSBundle mainBundle] URLForAuxiliaryExecutable:@"QEMULauncher.app"] URLByAppendingPathComponent:@"Contents/MacOS/QEMULauncher"];
     task.executableURL = [[[NSBundle mainBundle] URLForAuxiliaryExecutable:@"QEMULauncher.app"] URLByAppendingPathComponent:@"Contents/MacOS/QEMULauncher"];
     task.arguments = newArgv;
     task.arguments = newArgv;
@@ -116,12 +116,19 @@
     task.qualityOfService = NSQualityOfServiceUserInitiated;
     task.qualityOfService = NSQualityOfServiceUserInitiated;
     task.terminationHandler = ^(NSTask *task) {
     task.terminationHandler = ^(NSTask *task) {
         BOOL normalExit = task.terminationReason == NSTaskTerminationReasonExit && task.terminationStatus == 0;
         BOOL normalExit = task.terminationReason == NSTaskTerminationReasonExit && task.terminationStatus == 0;
+        _self.childTask = nil;
         onExit(normalExit, nil);
         onExit(normalExit, nil);
     };
     };
     if (![task launchAndReturnError:&err]) {
     if (![task launchAndReturnError:&err]) {
         NSLog(@"Error starting QEMU: %@", err);
         NSLog(@"Error starting QEMU: %@", err);
         onExit(NO, NSLocalizedString(@"Error starting QEMU.", @"QEMUHelper"));
         onExit(NO, NSLocalizedString(@"Error starting QEMU.", @"QEMUHelper"));
     }
     }
+    self.childTask = task;
+}
+
+- (void)terminate {
+    [self.childTask terminate];
+    self.childTask = nil;
 }
 }
 
 
 @end
 @end

+ 2 - 1
QEMUHelper/QEMUHelperProtocol.h

@@ -24,7 +24,8 @@ NS_ASSUME_NONNULL_BEGIN
 - (void)accessDataWithBookmark:(NSData *)bookmark securityScoped:(BOOL)securityScoped completion:(void(^)(BOOL, NSData * _Nullable, NSString * _Nullable))completion;
 - (void)accessDataWithBookmark:(NSData *)bookmark securityScoped:(BOOL)securityScoped completion:(void(^)(BOOL, NSData * _Nullable, NSString * _Nullable))completion;
 - (void)stopAccessingPath:(nullable NSString *)path;
 - (void)stopAccessingPath:(nullable NSString *)path;
 - (void)startQemu:(NSString *)binName standardOutput:(NSFileHandle *)standardOutput standardError:(NSFileHandle *)standardError libraryBookmark:(NSData *)libBookmark argv:(NSArray<NSString *> *)argv onExit:(void(^)(BOOL,NSString *))onExit;
 - (void)startQemu:(NSString *)binName standardOutput:(NSFileHandle *)standardOutput standardError:(NSFileHandle *)standardError libraryBookmark:(NSData *)libBookmark argv:(NSArray<NSString *> *)argv onExit:(void(^)(BOOL,NSString *))onExit;
-    
+- (void)terminate;
+
 @end
 @end
 
 
 NS_ASSUME_NONNULL_END
 NS_ASSUME_NONNULL_END