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

Unified Diff: runtime/bin/socket_patch.dart

Issue 163903002: Prototype of I/O statistics for Observatory (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months 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
Index: runtime/bin/socket_patch.dart
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 56f04d16ac83f5e20daea12c422a37d3ca1feb92..95666a52bf39619cf33ff1599234f5e137571f90 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -205,6 +205,64 @@ class _NetworkInterface implements NetworkInterface {
}
+// Statics information for the observatory.
+class _SocketsObservatory {
+ static int socketCount = 0;
+ static Set sockets = new Set();
+
+ static add(_NativeSocket socket) {
+ sockets.add(socket);
+ socketCount++;
+ }
+
+ static remove(_NativeSicket socket) {
+ sockets.remove(socket);
+ socketCount--;
+ }
+
+ static String toJSON() {
+ var sb = new StringBuffer();
+ sb.write('{"type":"io","sockets":[');
+ sockets.forEach((s) {
Cutch 2014/02/13 22:42:09 You probably should use the dart:convert library i
Søren Gjesse 2014/02/14 12:10:13 Absolutely - this was just a first hack.
+ var type = s.typeFlags == _NativeSocket.TYPE_LISTENING_SOCKET ? "LISTENING" : "NORMAL";
+ var localAddress;
+ var localPort;
+ var remoteAddress;
+ var remotePort;
+ try {
+ localAddress = s.address.address;
+ } catch (e) {
+ localAddress = "UNKNOWN";
+ }
+ try {
+ localPort = s.port;
+ } catch (e) {
+ localPort = "UNKNOWN";
+ }
+ try {
+ remoteAddress = s.remoteAddress.address;
+ } catch (e) {
+ remoteAddress = "UNKNOWN";
+ }
+ try {
+ remotePort = s.remotePort;
+ } catch (e) {
+ remotePort = "UNKNOWN";
+ }
+ sb.write('{"type","$type"},');
+ sb.write('{"localHost","$localAddress"},');
+ sb.write('{"localPort","$localPort"},');
+ sb.write('{"remoteAddress","$remoteAddress"},');
+ sb.write('{"remotePort","$remotePort"},');
+ sb.write('{"bytesRead","${s.bytesRead}"},');
+ sb.write('{"bytesWritten","${s.bytesWritten}"},');
Cutch 2014/02/13 22:42:09 What about rates over the last second, 5 seconds,
Søren Gjesse 2014/02/14 12:10:13 Added rate calculation using a timer. We might hav
+ });
+ sb.write(']}');
+ return sb.toString();
+ }
+}
+
+
// The _NativeSocket class encapsulates an OS socket.
class _NativeSocket extends NativeFieldWrapperClass1 {
// Bit flags used when communicating between the eventhandler and
@@ -272,6 +330,10 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
// Holds the address used to connect or bind the socket.
InternetAddress address;
+ // Statistics.
+ int bytesRead = 0;
+ int bytesWritten = 0;
+
static Future<List<InternetAddress>> lookup(
String host, {InternetAddressType type: InternetAddressType.ANY}) {
return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value])
@@ -426,27 +488,31 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
});
}
- _NativeSocket.datagram(this.address)
- : typeFlags = TYPE_NORMAL_SOCKET {
+ _NativeSocket.datagram(this.address) : typeFlags = TYPE_NORMAL_SOCKET {
eventHandlers = new List(EVENT_COUNT + 1);
+ _SocketsObservatory.add(this);
}
_NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET {
eventHandlers = new List(EVENT_COUNT + 1);
+ _SocketsObservatory.add(this);
}
_NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET {
eventHandlers = new List(EVENT_COUNT + 1);
+ _SocketsObservatory.add(this);
}
_NativeSocket.pipe() : typeFlags = TYPE_PIPE {
eventHandlers = new List(EVENT_COUNT + 1);
+ _SocketsObservatory.add(this);
}
_NativeSocket.watch(int id) : typeFlags = TYPE_NORMAL_SOCKET {
eventHandlers = new List(EVENT_COUNT + 1);
isClosedWrite = true;
nativeSetSocketId(id);
+ _SocketsObservatory.add(this);
}
int available() {
@@ -470,6 +536,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
reportError(result, "Read failed");
return null;
}
+ bytesRead += result.length;
return result;
}
@@ -510,6 +577,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
scheduleMicrotask(() => reportError(result, "Write failed"));
result = 0;
}
+ bytesWritten += result;
return result;
}
@@ -574,6 +642,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
closeCompleter.complete();
disconnectFromEventHandler();
if (handler != null) handler();
+ _SocketsObservatory.remove(this);
continue;
}
assert(handler != null);
@@ -869,7 +938,9 @@ class _RawServerSocket extends Stream<RawSocket>
_socket.setHandlers(
read: zone.bindCallback(() {
var socket = _socket.accept();
- if (socket != null) _controller.add(new _RawSocket(socket));
+ if (socket != null) {
+ _controller.add(new _RawSocket(socket));
+ }
}),
error: zone.bindUnaryCallback((e) {
_controller.addError(e);
@@ -1558,3 +1629,5 @@ Datagram _makeDatagram(List<int> data,
new _InternetAddress(address, null, in_addr),
port);
}
+
+String _test() => _SocketsObservatory.toJSON();
« no previous file with comments | « runtime/bin/socket_macos.cc ('k') | runtime/bin/socket_win.cc » ('j') | runtime/vm/service.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698