Chromium Code Reviews| Index: runtime/bin/socket.cc |
| diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
| index e2e16778c3fb6179976d06a4e5ef4a384fbd1b0f..f9d2243dfd4fd127b21c94b4550a943e2481105f 100644 |
| --- a/runtime/bin/socket.cc |
| +++ b/runtime/bin/socket.cc |
| @@ -365,18 +365,24 @@ void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { |
| Socket* socket = |
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| - // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can |
| - // handle 64k datagrams. |
| - IsolateData* isolate_data = |
| - reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
| - if (isolate_data->udp_receive_buffer == NULL) { |
| - isolate_data->udp_receive_buffer = |
| - reinterpret_cast<uint8_t*>(malloc(65536)); |
| + intptr_t available = SocketBase::Available(socket->fd()); |
|
zra
2017/08/25 20:33:31
const
siva
2017/08/25 22:07:28
Done.
|
| + if (available < 0) { |
| + Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| + return; |
| + } |
| + |
| + // Allocate a buffer of the exact size into which data can be read. |
| + uint8_t* data_buffer = NULL; |
| + Dart_Handle data = IOBuffer::Allocate(available, &data_buffer); |
| + if (Dart_IsError(data)) { |
| + Dart_PropagateError(data); |
| } |
| + ASSERT(data_buffer != NULL); |
| + |
| + // Read data into the buffer. |
| RawAddr addr; |
| - intptr_t bytes_read = |
| - SocketBase::RecvFrom(socket->fd(), isolate_data->udp_receive_buffer, |
| - 65536, &addr, SocketBase::kAsync); |
| + intptr_t bytes_read = SocketBase::RecvFrom( |
|
zra
2017/08/25 20:33:31
const
siva
2017/08/25 22:07:28
Done.
|
| + socket->fd(), data_buffer, available, &addr, SocketBase::kAsync); |
| if (bytes_read == 0) { |
| Dart_SetReturnValue(args, Dart_Null()); |
|
zra
2017/08/25 20:33:31
It looks like SocketBase:Available() can return 0.
siva
2017/08/25 22:07:27
Added a 0 check above.
|
| return; |
| @@ -386,15 +392,6 @@ void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| return; |
| } |
| - // Datagram data read. Copy into buffer of the exact size, |
| - ASSERT(bytes_read > 0); |
| - uint8_t* data_buffer = NULL; |
| - Dart_Handle data = IOBuffer::Allocate(bytes_read, &data_buffer); |
| - if (Dart_IsError(data)) { |
| - Dart_PropagateError(data); |
| - } |
| - ASSERT(data_buffer != NULL); |
| - memmove(data_buffer, isolate_data->udp_receive_buffer, bytes_read); |
| // Get the port and clear it in the sockaddr structure. |
| int port = SocketAddress::GetAddrPort(addr); |