From cdac5e0763e6edc352e7b0182ec826567dafd89d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 19 Dec 2012 17:22:21 -0800 Subject: [PATCH] Read output for terminate handler off main thread Follow on to commit 1bd0cc4152 --- native/v8_extensions/native.mm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 5fb4cb28f..c947aec01 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -407,7 +407,7 @@ bool Native::Execute(const CefString& name, CefRefPtr context = CefV8Context::GetCurrentContext(); void (^outputHandle)(NSString *contents, CefRefPtr function) = nil; - void (^taskTerminatedHandle)() = nil; + void (^taskTerminatedHandle)(NSString *output, NSString *errorOutput) = nil; outputHandle = ^(NSString *contents, CefRefPtr function) { context->Enter(); @@ -423,13 +423,10 @@ bool Native::Execute(const CefString& name, context->Exit(); }; - taskTerminatedHandle = ^() { + taskTerminatedHandle = ^(NSString *output, NSString *errorOutput) { context->Enter(); - NSString *output = [[NSString alloc] initWithData:[[stdout fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding]; - NSString *errorOutput = [[NSString alloc] initWithData:[[task.standardError fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding]; CefV8ValueList args; - args.push_back(CefV8Value::CreateInt([task terminationStatus])); args.push_back(CefV8Value::CreateString([output UTF8String])); args.push_back(CefV8Value::CreateString([errorOutput UTF8String])); @@ -447,7 +444,13 @@ bool Native::Execute(const CefString& name, }; task.terminationHandler = ^(NSTask *) { - dispatch_sync(dispatch_get_main_queue(), taskTerminatedHandle); + NSString *output = [[NSString alloc] initWithData:[[stdout fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding]; + NSString *errorOutput = [[NSString alloc] initWithData:[[stderr fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding]; + dispatch_sync(dispatch_get_main_queue(), ^() { + taskTerminatedHandle(output, errorOutput); + }); + [output release]; + [errorOutput release]; }; CefRefPtr stdoutFunction = options->GetValue("stdout");