|
@@ -20,8 +20,9 @@
|
|
|
|
|
|
@interface QEMUHelper ()
|
|
@interface QEMUHelper ()
|
|
|
|
|
|
-@property NSMutableArray<NSURL *> *urls;
|
|
|
|
-@property NSTask *childTask;
|
|
|
|
|
|
+@property (nonatomic) NSMutableArray<NSURL *> *urls;
|
|
|
|
+@property (nonatomic, nullable) NSTask *childTask;
|
|
|
|
+@property (nonatomic, nullable) tokenCallback_t activeToken;
|
|
|
|
|
|
@end
|
|
@end
|
|
|
|
|
|
@@ -136,9 +137,11 @@
|
|
task.terminationHandler = ^(NSTask *task) {
|
|
task.terminationHandler = ^(NSTask *task) {
|
|
_self.childTask = nil;
|
|
_self.childTask = nil;
|
|
[_self.connection.remoteObjectProxy processHasExited:task.terminationStatus message:nil];
|
|
[_self.connection.remoteObjectProxy processHasExited:task.terminationStatus message:nil];
|
|
|
|
+ [_self invalidateToken];
|
|
};
|
|
};
|
|
if (![task launchAndReturnError:&err]) {
|
|
if (![task launchAndReturnError:&err]) {
|
|
NSLog(@"Error starting QEMU: %@", err);
|
|
NSLog(@"Error starting QEMU: %@", err);
|
|
|
|
+ [self invalidateToken];
|
|
completion(NO, err.localizedDescription);
|
|
completion(NO, err.localizedDescription);
|
|
} else {
|
|
} else {
|
|
self.childTask = task;
|
|
self.childTask = task;
|
|
@@ -149,6 +152,25 @@
|
|
- (void)terminate {
|
|
- (void)terminate {
|
|
[self.childTask terminate];
|
|
[self.childTask terminate];
|
|
self.childTask = nil;
|
|
self.childTask = nil;
|
|
|
|
+ [self invalidateToken];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)assertActiveWithToken:(tokenCallback_t)token {
|
|
|
|
+ @synchronized (self) {
|
|
|
|
+ if (self.activeToken) {
|
|
|
|
+ self.activeToken(NO);
|
|
|
|
+ }
|
|
|
|
+ self.activeToken = token;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)invalidateToken {
|
|
|
|
+ @synchronized (self) {
|
|
|
|
+ if (self.activeToken) {
|
|
|
|
+ self.activeToken(YES);
|
|
|
|
+ }
|
|
|
|
+ self.activeToken = nil;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@end
|
|
@end
|