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

Side by Side Diff: webrtc/base/socketadapters.cc

Issue 1944683002: Read recv timestamps from socket (posix only). (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Disable ipv6 test on Linux due to bot issues. Created 4 years, 7 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
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 18 matching lines...) Expand all
29 #include "webrtc/base/bytebuffer.h" 29 #include "webrtc/base/bytebuffer.h"
30 #include "webrtc/base/common.h" 30 #include "webrtc/base/common.h"
31 #include "webrtc/base/httpcommon.h" 31 #include "webrtc/base/httpcommon.h"
32 #include "webrtc/base/logging.h" 32 #include "webrtc/base/logging.h"
33 #include "webrtc/base/socketadapters.h" 33 #include "webrtc/base/socketadapters.h"
34 #include "webrtc/base/stringencode.h" 34 #include "webrtc/base/stringencode.h"
35 #include "webrtc/base/stringutils.h" 35 #include "webrtc/base/stringutils.h"
36 36
37 #if defined(WEBRTC_WIN) 37 #if defined(WEBRTC_WIN)
38 #include "webrtc/base/sec_buffer.h" 38 #include "webrtc/base/sec_buffer.h"
39 #endif // WEBRTC_WIN 39 #endif // WEBRTC_WIN
40 40
41 namespace rtc { 41 namespace rtc {
42 42
43 BufferedReadAdapter::BufferedReadAdapter(AsyncSocket* socket, size_t size) 43 BufferedReadAdapter::BufferedReadAdapter(AsyncSocket* socket, size_t size)
44 : AsyncSocketAdapter(socket), buffer_size_(size), 44 : AsyncSocketAdapter(socket), buffer_size_(size),
45 data_len_(0), buffering_(false) { 45 data_len_(0), buffering_(false) {
46 buffer_ = new char[buffer_size_]; 46 buffer_ = new char[buffer_size_];
47 } 47 }
48 48
49 BufferedReadAdapter::~BufferedReadAdapter() { 49 BufferedReadAdapter::~BufferedReadAdapter() {
50 delete [] buffer_; 50 delete [] buffer_;
51 } 51 }
52 52
53 int BufferedReadAdapter::Send(const void *pv, size_t cb) { 53 int BufferedReadAdapter::Send(const void *pv, size_t cb) {
54 if (buffering_) { 54 if (buffering_) {
55 // TODO: Spoof error better; Signal Writeable 55 // TODO: Spoof error better; Signal Writeable
56 socket_->SetError(EWOULDBLOCK); 56 socket_->SetError(EWOULDBLOCK);
57 return -1; 57 return -1;
58 } 58 }
59 return AsyncSocketAdapter::Send(pv, cb); 59 return AsyncSocketAdapter::Send(pv, cb);
60 } 60 }
61 61
62 int BufferedReadAdapter::Recv(void *pv, size_t cb) { 62 int BufferedReadAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) {
63 if (buffering_) { 63 if (buffering_) {
64 socket_->SetError(EWOULDBLOCK); 64 socket_->SetError(EWOULDBLOCK);
65 return -1; 65 return -1;
66 } 66 }
67 67
68 size_t read = 0; 68 size_t read = 0;
69 69
70 if (data_len_) { 70 if (data_len_) {
71 read = std::min(cb, data_len_); 71 read = std::min(cb, data_len_);
72 memcpy(pv, buffer_, read); 72 memcpy(pv, buffer_, read);
73 data_len_ -= read; 73 data_len_ -= read;
74 if (data_len_ > 0) { 74 if (data_len_ > 0) {
75 memmove(buffer_, buffer_ + read, data_len_); 75 memmove(buffer_, buffer_ + read, data_len_);
76 } 76 }
77 pv = static_cast<char *>(pv) + read; 77 pv = static_cast<char *>(pv) + read;
78 cb -= read; 78 cb -= read;
79 } 79 }
80 80
81 // FIX: If cb == 0, we won't generate another read event 81 // FIX: If cb == 0, we won't generate another read event
82 82
83 int res = AsyncSocketAdapter::Recv(pv, cb); 83 int res = AsyncSocketAdapter::Recv(pv, cb, timestamp);
84 if (res >= 0) { 84 if (res >= 0) {
85 // Read from socket and possibly buffer; return combined length 85 // Read from socket and possibly buffer; return combined length
86 return res + static_cast<int>(read); 86 return res + static_cast<int>(read);
87 } 87 }
88 88
89 if (read > 0) { 89 if (read > 0) {
90 // Failed to read from socket, but still read something from buffer 90 // Failed to read from socket, but still read something from buffer
91 return static_cast<int>(read); 91 return static_cast<int>(read);
92 } 92 }
93 93
(...skipping 12 matching lines...) Expand all
106 AsyncSocketAdapter::OnReadEvent(socket); 106 AsyncSocketAdapter::OnReadEvent(socket);
107 return; 107 return;
108 } 108 }
109 109
110 if (data_len_ >= buffer_size_) { 110 if (data_len_ >= buffer_size_) {
111 LOG(INFO) << "Input buffer overflow"; 111 LOG(INFO) << "Input buffer overflow";
112 ASSERT(false); 112 ASSERT(false);
113 data_len_ = 0; 113 data_len_ = 0;
114 } 114 }
115 115
116 int len = socket_->Recv(buffer_ + data_len_, buffer_size_ - data_len_); 116 int len =
117 socket_->Recv(buffer_ + data_len_, buffer_size_ - data_len_, nullptr);
117 if (len < 0) { 118 if (len < 0) {
118 // TODO: Do something better like forwarding the error to the user. 119 // TODO: Do something better like forwarding the error to the user.
119 LOG_ERR(INFO) << "Recv"; 120 LOG_ERR(INFO) << "Recv";
120 return; 121 return;
121 } 122 }
122 123
123 data_len_ += len; 124 data_len_ += len;
124 125
125 ProcessInput(buffer_, &data_len_); 126 ProcessInput(buffer_, &data_len_);
126 } 127 }
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 868 }
868 869
869 int LoggingSocketAdapter::SendTo(const void *pv, size_t cb, 870 int LoggingSocketAdapter::SendTo(const void *pv, size_t cb,
870 const SocketAddress& addr) { 871 const SocketAddress& addr) {
871 int res = AsyncSocketAdapter::SendTo(pv, cb, addr); 872 int res = AsyncSocketAdapter::SendTo(pv, cb, addr);
872 if (res > 0) 873 if (res > 0)
873 LogMultiline(level_, label_.c_str(), false, pv, res, hex_mode_, &lms_); 874 LogMultiline(level_, label_.c_str(), false, pv, res, hex_mode_, &lms_);
874 return res; 875 return res;
875 } 876 }
876 877
877 int LoggingSocketAdapter::Recv(void *pv, size_t cb) { 878 int LoggingSocketAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) {
878 int res = AsyncSocketAdapter::Recv(pv, cb); 879 int res = AsyncSocketAdapter::Recv(pv, cb, timestamp);
879 if (res > 0) 880 if (res > 0)
880 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); 881 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_);
881 return res; 882 return res;
882 } 883 }
883 884
884 int LoggingSocketAdapter::RecvFrom(void *pv, size_t cb, SocketAddress *paddr) { 885 int LoggingSocketAdapter::RecvFrom(void* pv,
885 int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr); 886 size_t cb,
887 SocketAddress* paddr,
888 int64_t* timestamp) {
889 int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp);
886 if (res > 0) 890 if (res > 0)
887 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); 891 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_);
888 return res; 892 return res;
889 } 893 }
890 894
891 int LoggingSocketAdapter::Close() { 895 int LoggingSocketAdapter::Close() {
892 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); 896 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_);
893 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); 897 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_);
894 LOG_V(level_) << label_ << " Closed locally"; 898 LOG_V(level_) << label_ << " Closed locally";
895 return socket_->Close(); 899 return socket_->Close();
896 } 900 }
897 901
898 void LoggingSocketAdapter::OnConnectEvent(AsyncSocket * socket) { 902 void LoggingSocketAdapter::OnConnectEvent(AsyncSocket * socket) {
899 LOG_V(level_) << label_ << " Connected"; 903 LOG_V(level_) << label_ << " Connected";
900 AsyncSocketAdapter::OnConnectEvent(socket); 904 AsyncSocketAdapter::OnConnectEvent(socket);
901 } 905 }
902 906
903 void LoggingSocketAdapter::OnCloseEvent(AsyncSocket * socket, int err) { 907 void LoggingSocketAdapter::OnCloseEvent(AsyncSocket * socket, int err) {
904 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); 908 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_);
905 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); 909 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_);
906 LOG_V(level_) << label_ << " Closed with error: " << err; 910 LOG_V(level_) << label_ << " Closed with error: " << err;
907 AsyncSocketAdapter::OnCloseEvent(socket, err); 911 AsyncSocketAdapter::OnCloseEvent(socket, err);
908 } 912 }
909 913
910 /////////////////////////////////////////////////////////////////////////////// 914 ///////////////////////////////////////////////////////////////////////////////
911 915
912 } // namespace rtc 916 } // namespace rtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698