Просмотр исходного кода

terminal: faster handling of output data

Do not block UI thread on conversion of data to JS command.

Fixes #2404
Fixes #2555
osy 3 лет назад
Родитель
Сommit
9b79c43f4d

+ 1 - 3
Managers/UTMTerminal.m

@@ -161,9 +161,7 @@ dispatch_io_t createInputIO(NSURL* url, dispatch_queue_t queue) {
         size_t estimated = dispatch_source_get_data(source);
         NSData* bytesRead = [self evaluateChangesForDescriptor: fd estimatedSize: estimated];
         if (bytesRead != nil) {
-            dispatch_async(dispatch_get_main_queue(), ^{
-                [[self delegate] terminal: self didReceiveData: bytesRead];
-            });
+            [[self delegate] terminal: self didReceiveData: bytesRead];
         }
     });
     dispatch_source_set_cancel_handler(source, ^{

+ 7 - 5
Platform/iOS/Display/VMDisplayTerminalViewController.m

@@ -180,11 +180,13 @@ NSString* const kVMSendTerminalSizeHandler = @"UTMSendTerminalSize";
     [dataString appendString:@"]"];
     //UTMLog(@"Array: %@", dataString);
     NSString* jsString = [NSString stringWithFormat: @"writeData(new Uint8Array(%@));", dataString];
-    [_webView evaluateJavaScript: jsString completionHandler:^(id _Nullable _, NSError * _Nullable error) {
-        if (error != nil) {
-            UTMLog(@"JS evaluation failed: %@", [error localizedDescription]);
-        }
-    }];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [_webView evaluateJavaScript: jsString completionHandler:^(id _Nullable _, NSError * _Nullable error) {
+            if (error != nil) {
+                UTMLog(@"JS evaluation failed: %@", [error localizedDescription]);
+            }
+        }];
+    });
 }
 
 #pragma mark - UTMVirtualMachineDelegate

+ 5 - 3
Platform/macOS/Display/VMDisplayTerminalWindowController.swift

@@ -150,9 +150,11 @@ extension VMDisplayTerminalWindowController: UTMTerminalDelegate {
         }
         dataString = dataString + "]"
         let jsString = "writeData(new Uint8Array(\(dataString)));"
-        webView.evaluateJavaScript(jsString) { (_, err) in
-            if let error = err {
-                logger.error("JS evaluation failed: \(error)")
+        DispatchQueue.main.async {
+            self.webView.evaluateJavaScript(jsString) { (_, err) in
+                if let error = err {
+                    logger.error("JS evaluation failed: \(error)")
+                }
             }
         }
     }