Fix secure socket filter after edge-triggering.

The read events would happen through the microtask-queue, thus blocking
the filter from returning. We now pause for read events when buffer is
full, and continue when the filter is done processing.

BUG=
R=whesse@google.com

Review URL: https://codereview.chromium.org//170843010

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32782 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
ajohnsen@google.com 2014-02-19 10:46:45 +00:00
parent 031f3e66c2
commit 59feb2f848

View file

@ -895,6 +895,7 @@ class _RawSecureSocket extends Stream<RawSocketEvent>
_secureFilter = null;
return;
}
_socket.readEventsEnabled = true;
if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
// Checks for and handles all cases of partially closed sockets.
shutdown(SocketDirection.SEND);
@ -948,6 +949,8 @@ class _RawSecureSocket extends Stream<RawSocketEvent>
var buffer = _secureFilter.buffers[READ_ENCRYPTED];
if (buffer.writeFromSource(_readSocketOrBufferedData) > 0) {
_filterStatus.readEmpty = false;
} else {
_socket.readEventsEnabled = false;
}
}
@ -1165,7 +1168,7 @@ class _ExternalBuffer {
int written = 0;
int toWrite = linearFree;
// Loop over zero, one, or two linear data ranges.
do {
while (toWrite > 0) {
// Source returns at most toWrite bytes, and it returns null when empty.
var inputData = getData(toWrite);
if (inputData == null || inputData.length == 0) break;
@ -1174,7 +1177,7 @@ class _ExternalBuffer {
advanceEnd(len);
written += len;
toWrite = linearFree;
} while (toWrite > 0);
}
return written;
}