mirror of
https://github.com/dart-lang/sdk
synced 2024-09-22 14:23:30 +00:00
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:
parent
031f3e66c2
commit
59feb2f848
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue