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

Side by Side Diff: sdk/lib/io/io_resource_info.dart

Issue 1323943003: Extract meta data about open sockets into separate class. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 part of dart.io;
6
7 abstract class _IOResourceInfo {
8 String type;
Søren Gjesse 2015/09/02 09:07:49 Can't type and id and be final?
ricow1 2015/09/02 10:45:42 Done.
9 int id;
10 String get name;
11 static int _count = 0;
12
13 _IOResourceInfo(this.type) : id = _IOResourceInfo.getNextID();
14
15 String toJSON();
16
17 /// Get the full set of values for a specific implementation. This is normally
18 /// looked up based on an id from a referenceValueMap.
19 Map<String, String> get fullValueMap;
20
21 /// The reference map, used to return a list of values, e.g., getting
22 /// all open sockets. The structure of this is shared among all subclasses.
23 Map<String, String> get referenceValueMap =>
Søren Gjesse 2015/09/02 09:07:49 Cache this value?
ricow1 2015/09/02 10:45:42 Imagine how few times this will be called compared
Søren Gjesse 2015/09/02 12:24:50 Good point. Lets leave it as is.
24 {
25 'type': '@$type',
Søren Gjesse 2015/09/02 09:07:49 What is the reason for the @?
ricow1 2015/09/02 10:45:42 John told me that the reference objects have that
Søren Gjesse 2015/09/02 12:24:50 Thought so :-) - maybe add a comment.
ricow1 2015/09/02 12:45:50 Done.
26 'id': id,
27 'name': name,
28 };
29
30 static int getNextID() => _count++;
31 }
32
33 abstract class _ReadWriteResourceInfo extends _IOResourceInfo {
34 int totalRead;
35 int totalWritten;
36 int readCount;
37 int writeCount;
38 double lastRead;
39 double lastWrite;
40
41 _ReadWriteResourceInfo(String type) :
42 totalRead = 0,
43 totalWritten = 0,
44 readCount = 0,
45 writeCount = 0,
46 lastRead = 0.0,
47 lastWrite = 0.0,
48 super(type);
49
50 Map<String, String> get fullValueMap =>
51 {
52 'type': type,
53 'id': id,
54 'name': name,
55 'total_read': totalRead,
56 'total_written': totalWritten,
57 'read_count': readCount,
58 'write_count': writeCount,
59 'last_read': lastRead,
60 'last_write': lastWrite
61 };
62
63 String toJSON() {
64 return JSON.encode(fullValueMap);
65 }
66 }
67
68 class _SocketResourceInfo extends _ReadWriteResourceInfo{
Søren Gjesse 2015/09/02 09:07:49 nit: missing space before {.
ricow1 2015/09/02 10:45:42 Done.
69 final _NativeSocket socket;
70
71 static Map<int, _SocketResourceInfo> openSockets =
72 new Map<int, _SocketResourceInfo>();
73
74 _SocketResourceInfo(this.socket) : super('_socket') {
75 SocketOpened(this);
76 }
77
78 String get name {
Søren Gjesse 2015/09/02 09:07:49 Cache the String generated here?
ricow1 2015/09/02 10:45:42 Same answer as above, happy to add caching though
Søren Gjesse 2015/09/02 12:24:50 ditto answer.
79 if (socket.isListening) {
80 return 'listening:${socket.address.host}:${socket.port}';
81 }
82 var remote = '';
83 try {
84 var remoteHost = socket.remoteAddress.host;
85 var remotePort = socket.remotePort;
86 remote = ' -> $remoteHost:$remotePort';
87 } catch (e) { } // ignored if we can't get the information
88 return '${socket.address.host}:${socket.port}$remote';
89 }
90
91 static Iterable<Map<String, String>> getOpenSocketsList() {
92 return new List.from(openSockets.values.map((e) => e.referenceValueMap));
93 }
94
95 Map<String, String> getSocketInfoMap() {
96 var result = fullValueMap;
97 result['socket_type'] = socket.isTcp ? 'TCP' : 'UDP';
Søren Gjesse 2015/09/02 09:07:49 Please make constants for these string keys.
ricow1 2015/09/02 10:45:42 Done.
98 result['listening'] = socket.isListening;
99 result['host'] = socket.address.host;
100 result['port'] = socket.port;
101 if (!socket.isListening) {
102 try {
103 result['remote_host'] = socket.remoteAddress.host;
104 result['remote_port'] = socket.remotePort;
105 } catch (e) {
106 // UDP.
107 result['remote_port'] = 'NA';
108 result['remote_host'] = 'NA';
109 }
110 } else {
111 result['remote_port'] = 'NA';
112 result['remote_host'] = 'NA';
113 }
114 result['address_type'] = socket.address.type.name;
115 return result;
116 }
117
118 static Future<ServiceExtensionResponse> getSocketInfoMapByID(
119 String function, Map<String, String> params) {
120 assert(params.containsKey('id'));
121 var id = int.parse(params['id']);
122 var result =
123 openSockets.containsKey(id) ? openSockets[id].getSocketInfoMap() : {};
124 var json = JSON.encode(result);
125 return new Future.value(new ServiceExtensionResponse.result(json));
126 }
127
128 static Future<ServiceExtensionResponse> getOpenSockets(function, params) {
129 assert(function == '__getOpenSockets');
130 var data = {'type': '_opensockets', 'data': getOpenSocketsList()};
131 var json = JSON.encode(data);
132 return new Future.value(new ServiceExtensionResponse.result(json));
133 }
134
135 static Future<ServiceExtensionResponse> getSocketInfo(function, params) {
136 assert(function == '__getSocketInfo');
137 assert(params.containsKey('id'));
138 var result = openSockets.containsKey(params['id']) != null
139 ? openSockets[params['id']].getSocketInfoMap() : {};
140 return
141 Future.value(new ServiceExtensionResponse.result(JSON.encode(result)));
142 }
143
144 static SocketOpened(_SocketResourceInfo info) {
145 assert(!openSockets.containsKey(info.id));
146 openSockets[info.id] = info;
147 }
148
149 static SocketClosed(_SocketResourceInfo info) {
150 assert(openSockets.containsKey(info.id));
151 openSockets.remove(info.id);
152 }
153
154 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698