Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Unified Diff: runtime/bin/socket_stream.dart

Issue 8437090: Change the handling of closing sockets (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments by ager@ Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket_impl.dart ('k') | tests/standalone/src/EchoServerStreamTest.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/socket_stream.dart
diff --git a/runtime/bin/socket_stream.dart b/runtime/bin/socket_stream.dart
index a5982ced29a50b8bace189b67680688aa28a5c7f..195186b6b035ce76cdc045517e55a148cab9e42f 100644
--- a/runtime/bin/socket_stream.dart
+++ b/runtime/bin/socket_stream.dart
@@ -36,9 +36,7 @@ class SocketInputStream implements InputStream {
return _socket.readList(buffer, offset, len);
}
- int available() {
- return _socket.available();
- }
+ int available() => _socket.available();
void set dataHandler(void callback()) {
_socket.dataHandler = callback;
@@ -67,7 +65,7 @@ class _BufferList2 {
void add(List<int> buffer, [int offset = 0]) {
assert(offset == 0 || _buffers.isEmpty());
_buffers.addLast(buffer);
- _length += buffer.length;
+ _length += buffer.length - offset;
if (offset != 0) _index = offset;
}
@@ -117,19 +115,23 @@ class SocketOutputStream implements OutputStream {
return _write(buffer, offset, (len == null) ? buffer.length : len, true);
}
- void end() {
- if (_ending || _ended) throw new StreamException("Stream ended");
- _ending = true;
- if (_pendingWrites.isEmpty()) {
- close();
+ void close() {
+ if (!_pendingWrites.isEmpty()) {
+ // Mark the socket for close when all data is written.
+ _closing = true;
+ _socket.writeHandler = _writeHandler;
+ } else {
+ // Close the socket for writing.
+ _socket._closeWrite();
+ _closed = true;
}
}
- void close() {
+ void destroy() {
_socket.writeHandler = null;
_pendingWrites.clear();
_socket.close();
- _ended = true;
+ _closed = true;
}
void set noPendingWriteHandler(void callback()) {
@@ -146,7 +148,7 @@ class SocketOutputStream implements OutputStream {
}
bool _write(List<int> buffer, int offset, int len, bool copyBuffer) {
- if (_ending || _ended) throw new StreamException("Stream ended");
+ if (_closing || _closed) throw new StreamException("Stream closed");
if (len == null) len = buffer.length;
int bytesWritten = 0;
if (_pendingWrites.isEmpty()) {
@@ -167,7 +169,6 @@ class SocketOutputStream implements OutputStream {
}
void _writeHandler() {
- _socket.writeHandler = _writeHandler;
// Write as much buffered data to the socket as possible.
while (!_pendingWrites.isEmpty()) {
List<int> buffer = _pendingWrites.first;
@@ -175,13 +176,16 @@ class SocketOutputStream implements OutputStream {
int bytesToWrite = buffer.length - offset;
int bytesWritten = _socket.writeList(buffer, offset, bytesToWrite);
_pendingWrites.removeBytes(bytesWritten);
- if (bytesWritten < bytesToWrite) return;
+ if (bytesWritten < bytesToWrite) {
+ _socket.writeHandler = _writeHandler;
+ return;
+ }
}
// All buffered data was written.
- if (_ending) {
- _socket.close();
- _ended = true;
+ if (_closing) {
+ _socket._closeWrite();
+ _closed = true;
} else {
if (_noPendingWriteHandler != null) _noPendingWriteHandler();
}
@@ -194,8 +198,8 @@ class SocketOutputStream implements OutputStream {
Socket _socket;
_BufferList2 _pendingWrites;
- bool _ending = false;
- bool _ended = false;
var _noPendingWriteHandler;
var _streamErrorHandler;
+ bool _closing = false;
+ bool _closed = false;
}
« no previous file with comments | « runtime/bin/socket_impl.dart ('k') | tests/standalone/src/EchoServerStreamTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698