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

Side by Side Diff: runtime/bin/socket.cc

Issue 10962012: Use native wrapper fields to store socket ids. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/socket.h" 5 #include "bin/socket.h"
6 #include "bin/dartutils.h" 6 #include "bin/dartutils.h"
7 #include "bin/thread.h" 7 #include "bin/thread.h"
8 #include "bin/utils.h" 8 #include "bin/utils.h"
9 9
10 #include "platform/globals.h" 10 #include "platform/globals.h"
11 #include "platform/thread.h" 11 #include "platform/thread.h"
12 #include "platform/utils.h" 12 #include "platform/utils.h"
13 13
14 #include "include/dart_api.h" 14 #include "include/dart_api.h"
15 15
16 static const int kSocketIdNativeField = 0;
17
16 dart::Mutex Socket::mutex_; 18 dart::Mutex Socket::mutex_;
17 int Socket::service_ports_size_ = 0; 19 int Socket::service_ports_size_ = 0;
18 Dart_Port* Socket::service_ports_ = NULL; 20 Dart_Port* Socket::service_ports_ = NULL;
19 int Socket::service_ports_index_ = 0; 21 int Socket::service_ports_index_ = 0;
20 22
21 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 23 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
22 Dart_EnterScope(); 24 Dart_EnterScope();
23 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 25 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
24 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); 26 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
25 int64_t port = 0; 27 int64_t port = 0;
26 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { 28 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) {
27 intptr_t socket = Socket::CreateConnect(host, port); 29 intptr_t socket = Socket::CreateConnect(host, port);
28 if (socket >= 0) { 30 if (socket >= 0) {
29 DartUtils::SetIntegerField(socket_obj, DartUtils::kIdFieldName, socket); 31 Socket::SetSocketIdNativeField(socket_obj, socket);
30 Dart_SetReturnValue(args, Dart_True()); 32 Dart_SetReturnValue(args, Dart_True());
31 } else { 33 } else {
32 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 34 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
33 } 35 }
34 } else { 36 } else {
35 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 37 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
36 Dart_Handle err = DartUtils::NewDartOSError(&os_error); 38 Dart_Handle err = DartUtils::NewDartOSError(&os_error);
37 if (Dart_IsError(err)) Dart_PropagateError(err); 39 if (Dart_IsError(err)) Dart_PropagateError(err);
38 Dart_SetReturnValue(args, err); 40 Dart_SetReturnValue(args, err);
39 } 41 }
40 Dart_ExitScope(); 42 Dart_ExitScope();
41 } 43 }
42 44
43 45
44 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { 46 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
45 Dart_EnterScope(); 47 Dart_EnterScope();
46 int64_t socket = DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 48 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
47 DartUtils::kIdFieldName); 49 intptr_t socket = 0;
Søren Gjesse 2012/09/21 06:47:06 Why do you initialize to 0?
Mads Ager (google) 2012/09/21 08:18:25 Just to make sure that we have some initialization
50 Socket::GetSocketIdNativeField(socket_obj, &socket);
48 intptr_t available = Socket::Available(socket); 51 intptr_t available = Socket::Available(socket);
49 if (available >= 0) { 52 if (available >= 0) {
50 Dart_SetReturnValue(args, Dart_NewInteger(available)); 53 Dart_SetReturnValue(args, Dart_NewInteger(available));
51 } else { 54 } else {
52 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 55 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
53 } 56 }
54 Dart_ExitScope(); 57 Dart_ExitScope();
55 } 58 }
56 59
57 60
58 void FUNCTION_NAME(Socket_ReadList)(Dart_NativeArguments args) { 61 void FUNCTION_NAME(Socket_ReadList)(Dart_NativeArguments args) {
59 Dart_EnterScope(); 62 Dart_EnterScope();
60 intptr_t socket = 63 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
61 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 64 intptr_t socket = 0;
62 DartUtils::kIdFieldName); 65 Socket::GetSocketIdNativeField(socket_obj, &socket);
63 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 66 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
64 int64_t offset = 0; 67 int64_t offset = 0;
65 int64_t length = 0; 68 int64_t length = 0;
66 Dart_Handle offset_obj = Dart_GetNativeArgument(args, 2); 69 Dart_Handle offset_obj = Dart_GetNativeArgument(args, 2);
67 Dart_Handle length_obj = Dart_GetNativeArgument(args, 3); 70 Dart_Handle length_obj = Dart_GetNativeArgument(args, 3);
68 if (Dart_IsList(buffer_obj) && 71 if (Dart_IsList(buffer_obj) &&
69 DartUtils::GetInt64Value(offset_obj, &offset) && 72 DartUtils::GetInt64Value(offset_obj, &offset) &&
70 DartUtils::GetInt64Value(length_obj, &length)) { 73 DartUtils::GetInt64Value(length_obj, &length)) {
71 intptr_t buffer_len = 0; 74 intptr_t buffer_len = 0;
72 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); 75 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len);
(...skipping 26 matching lines...) Expand all
99 if (Dart_IsError(err)) Dart_PropagateError(err); 102 if (Dart_IsError(err)) Dart_PropagateError(err);
100 Dart_SetReturnValue(args, err); 103 Dart_SetReturnValue(args, err);
101 } 104 }
102 105
103 Dart_ExitScope(); 106 Dart_ExitScope();
104 } 107 }
105 108
106 109
107 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { 110 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
108 Dart_EnterScope(); 111 Dart_EnterScope();
109 intptr_t socket = 112 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
110 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 113 intptr_t socket = 0;
111 DartUtils::kIdFieldName); 114 Socket::GetSocketIdNativeField(socket_obj, &socket);
112 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 115 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
113 ASSERT(Dart_IsList(buffer_obj)); 116 ASSERT(Dart_IsList(buffer_obj));
114 intptr_t offset = 117 intptr_t offset =
115 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); 118 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
116 intptr_t length = 119 intptr_t length =
117 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 120 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
118 intptr_t buffer_len = 0; 121 intptr_t buffer_len = 0;
119 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); 122 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len);
120 if (Dart_IsError(result)) { 123 if (Dart_IsError(result)) {
121 Dart_PropagateError(result); 124 Dart_PropagateError(result);
(...skipping 30 matching lines...) Expand all
152 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written)); 155 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written));
153 } else { 156 } else {
154 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 157 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
155 } 158 }
156 Dart_ExitScope(); 159 Dart_ExitScope();
157 } 160 }
158 161
159 162
160 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { 163 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
161 Dart_EnterScope(); 164 Dart_EnterScope();
162 intptr_t socket = 165 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
163 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 166 intptr_t socket = 0;
164 DartUtils::kIdFieldName); 167 Socket::GetSocketIdNativeField(socket_obj, &socket);
165 OSError os_error; 168 OSError os_error;
166 intptr_t port = Socket::GetPort(socket); 169 intptr_t port = Socket::GetPort(socket);
167 if (port > 0) { 170 if (port > 0) {
168 Dart_SetReturnValue(args, Dart_NewInteger(port)); 171 Dart_SetReturnValue(args, Dart_NewInteger(port));
169 } else { 172 } else {
170 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 173 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
171 } 174 }
172 Dart_ExitScope(); 175 Dart_ExitScope();
173 } 176 }
174 177
175 178
176 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { 179 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
177 Dart_EnterScope(); 180 Dart_EnterScope();
178 intptr_t socket = 181 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
179 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 182 intptr_t socket = 0;
180 DartUtils::kIdFieldName); 183 Socket::GetSocketIdNativeField(socket_obj, &socket);
181 OSError os_error; 184 OSError os_error;
182 intptr_t port = 0; 185 intptr_t port = 0;
183 char host[INET_ADDRSTRLEN]; 186 char host[INET_ADDRSTRLEN];
184 if (Socket::GetRemotePeer(socket, host, &port)) { 187 if (Socket::GetRemotePeer(socket, host, &port)) {
185 Dart_Handle list = Dart_NewList(2); 188 Dart_Handle list = Dart_NewList(2);
186 Dart_ListSetAt(list, 0, Dart_NewString(host)); 189 Dart_ListSetAt(list, 0, Dart_NewString(host));
187 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); 190 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
188 Dart_SetReturnValue(args, list); 191 Dart_SetReturnValue(args, list);
189 } else { 192 } else {
190 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 193 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
191 } 194 }
192 Dart_ExitScope(); 195 Dart_ExitScope();
193 } 196 }
194 197
195 198
196 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { 199 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
197 Dart_EnterScope(); 200 Dart_EnterScope();
198 intptr_t socket = 201 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
199 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 202 intptr_t socket = 0;
200 DartUtils::kIdFieldName); 203 Socket::GetSocketIdNativeField(socket_obj, &socket);
201 OSError os_error; 204 OSError os_error;
202 Socket::GetError(socket, &os_error); 205 Socket::GetError(socket, &os_error);
203 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 206 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
204 Dart_ExitScope(); 207 Dart_ExitScope();
205 } 208 }
206 209
207 210
208 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { 211 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
209 Dart_EnterScope(); 212 Dart_EnterScope();
210 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 213 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
211 intptr_t num = 214 intptr_t num =
212 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 215 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
213 ASSERT(num == 0 || num == 1 || num == 2); 216 ASSERT(num == 0 || num == 1 || num == 2);
214 intptr_t socket = Socket::GetStdioHandle(num); 217 intptr_t socket = Socket::GetStdioHandle(num);
215 DartUtils::SetIntegerField( 218 Socket::SetSocketIdNativeField(socket_obj, socket);
216 socket_obj, DartUtils::kIdFieldName, socket);
217 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 219 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
218 Dart_ExitScope(); 220 Dart_ExitScope();
219 } 221 }
220 222
221 223
222 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { 224 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
223 Dart_EnterScope(); 225 Dart_EnterScope();
224 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 226 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
225 Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); 227 Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1);
226 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); 228 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2);
227 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); 229 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3);
228 int64_t port = 0; 230 int64_t port = 0;
229 int64_t backlog = 0; 231 int64_t backlog = 0;
230 if (Dart_IsString(bind_address_obj) && 232 if (Dart_IsString(bind_address_obj) &&
231 DartUtils::GetInt64Value(port_obj, &port) && 233 DartUtils::GetInt64Value(port_obj, &port) &&
232 DartUtils::GetInt64Value(backlog_obj, &backlog)) { 234 DartUtils::GetInt64Value(backlog_obj, &backlog)) {
233 const char* bind_address = DartUtils::GetStringValue(bind_address_obj); 235 const char* bind_address = DartUtils::GetStringValue(bind_address_obj);
234 intptr_t socket = 236 intptr_t socket =
235 ServerSocket::CreateBindListen(bind_address, port, backlog); 237 ServerSocket::CreateBindListen(bind_address, port, backlog);
236 if (socket >= 0) { 238 if (socket >= 0) {
237 DartUtils::SetIntegerField( 239 Socket::SetSocketIdNativeField(socket_obj, socket);
238 socket_obj, DartUtils::kIdFieldName, socket);
239 Dart_SetReturnValue(args, Dart_True()); 240 Dart_SetReturnValue(args, Dart_True());
240 } else { 241 } else {
241 if (socket == -5) { 242 if (socket == -5) {
242 OSError os_error(-1, "Invalid host", OSError::kUnknown); 243 OSError os_error(-1, "Invalid host", OSError::kUnknown);
243 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 244 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
244 } else { 245 } else {
245 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 246 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
246 } 247 }
247 } 248 }
248 } else { 249 } else {
249 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 250 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
250 Dart_Handle err = DartUtils::NewDartOSError(&os_error); 251 Dart_Handle err = DartUtils::NewDartOSError(&os_error);
251 if (Dart_IsError(err)) Dart_PropagateError(err); 252 if (Dart_IsError(err)) Dart_PropagateError(err);
252 Dart_SetReturnValue(args, err); 253 Dart_SetReturnValue(args, err);
253 } 254 }
254 Dart_ExitScope(); 255 Dart_ExitScope();
255 } 256 }
256 257
257 258
258 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { 259 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
259 Dart_EnterScope(); 260 Dart_EnterScope();
260 intptr_t socket = 261 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
261 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 262 intptr_t socket = 0;
262 DartUtils::kIdFieldName); 263 Socket::GetSocketIdNativeField(socket_obj, &socket);
263 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 1); 264 Dart_Handle result_socket_obj = Dart_GetNativeArgument(args, 1);
264 intptr_t new_socket = ServerSocket::Accept(socket); 265 intptr_t new_socket = ServerSocket::Accept(socket);
265 if (new_socket >= 0) { 266 if (new_socket >= 0) {
266 DartUtils::SetIntegerField( 267 Socket::SetSocketIdNativeField(result_socket_obj, new_socket);
267 socket_obj, DartUtils::kIdFieldName, new_socket);
268 Dart_SetReturnValue(args, Dart_True()); 268 Dart_SetReturnValue(args, Dart_True());
269 } else if (new_socket == ServerSocket::kTemporaryFailure) { 269 } else if (new_socket == ServerSocket::kTemporaryFailure) {
270 Dart_SetReturnValue(args, Dart_False()); 270 Dart_SetReturnValue(args, Dart_False());
271 } else { 271 } else {
272 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 272 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
273 } 273 }
274 Dart_ExitScope(); 274 Dart_ExitScope();
275 } 275 }
276 276
277 277
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 Dart_EnterScope(); 346 Dart_EnterScope();
347 Dart_SetReturnValue(args, Dart_Null()); 347 Dart_SetReturnValue(args, Dart_Null());
348 Dart_Port service_port = Socket::GetServicePort(); 348 Dart_Port service_port = Socket::GetServicePort();
349 if (service_port != ILLEGAL_PORT) { 349 if (service_port != ILLEGAL_PORT) {
350 // Return a send port for the service port. 350 // Return a send port for the service port.
351 Dart_Handle send_port = Dart_NewSendPort(service_port); 351 Dart_Handle send_port = Dart_NewSendPort(service_port);
352 Dart_SetReturnValue(args, send_port); 352 Dart_SetReturnValue(args, send_port);
353 } 353 }
354 Dart_ExitScope(); 354 Dart_ExitScope();
355 } 355 }
356
357
358 Dart_Handle Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
359 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
360 }
361
362
363 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) {
364 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id);
365 }
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_impl.dart » ('j') | runtime/bin/socket_impl.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698