Index: runtime/bin/process_impl.dart |
diff --git a/runtime/bin/process_impl.dart b/runtime/bin/process_impl.dart |
index b121d2cece06d22bdd2004086834d22c20286273..98546472f5de45d479b160943e518217f7b2051b 100644 |
--- a/runtime/bin/process_impl.dart |
+++ b/runtime/bin/process_impl.dart |
@@ -42,8 +42,10 @@ class _Process implements Process { |
// Setup an exit handler to handle internal cleanup and possible |
// callback when a process terminates. |
_exitHandler.setDataHandler(() { |
- List<int> buffer = new List<int>(8); |
- SocketInputStream input = _exitHandler.inputStream; |
+ final int EXIT_DATA_SIZE = 8; |
+ List<int> exitDataBuffer = new List<int>(EXIT_DATA_SIZE); |
+ InputStream input = _exitHandler.inputStream; |
+ int exitDataRead = 0; |
int exitCode(List<int> ints) { |
return ints[4] + (ints[5] << 8) + (ints[6] << 16) + (ints[7] << 24); |
@@ -54,20 +56,19 @@ class _Process implements Process { |
} |
void handleExit() { |
- _processExit(exitPid(buffer)); |
+ _processExit(exitPid(exitDataBuffer)); |
if (_exitHandlerCallback != null) { |
- _exitHandlerCallback(exitCode(buffer)); |
+ _exitHandlerCallback(exitCode(exitDataBuffer)); |
} |
} |
- void readData() { |
- handleExit(); |
+ void exitData() { |
+ exitDataRead += input.readInto( |
+ exitDataBuffer, exitDataRead, EXIT_DATA_SIZE - exitDataRead); |
+ if (exitDataRead == EXIT_DATA_SIZE) handleExit(); |
} |
- bool result = input.read(buffer, 0, 8, readData); |
- if (result) { |
- handleExit(); |
- } |
+ input.dataHandler = exitData; |
}); |
} |