@@ -48,7 +48,7 @@ MsgElement::Ptr BufferUdp::readFromSocket(boost::asio::ip::tcp::socket& socket,
4848
4949 // If there's something in the buffer already, get it and return.
5050 // This can happen when the previous read of socket read multiple elements.
51- MsgElement::Ptr msgElem = _safeRetrieve ();
51+ MsgElement::Ptr msgElem = _safeRetrieve (" 1readFromSocket&&& " + note );
5252 if (msgElem != nullptr ) {
5353 return msgElem;
5454 }
@@ -69,7 +69,7 @@ MsgElement::Ptr BufferUdp::readFromSocket(boost::asio::ip::tcp::socket& socket,
6969
7070 // / Try to retrieve an element (there's no guarantee that an entire element got read in a single read.
7171 // Store original cursor positions so they can be restored if the read fails.
72- msgElem = _safeRetrieve ();
72+ msgElem = _safeRetrieve (" 2readFromSocket&&& " + note );
7373 if (msgElem != nullptr ) {
7474 return msgElem;
7575 }
@@ -117,10 +117,11 @@ void BufferUdp::advanceReadCursor(size_t len) {
117117}
118118
119119
120- std::shared_ptr<MsgElement> BufferUdp::_safeRetrieve () {
120+ std::shared_ptr<MsgElement> BufferUdp::_safeRetrieve (std::string const & note ) { // &&& delete note, maybe
121121 auto wCursorOriginal = _wCursor;
122122 auto rCursorOriginal = _rCursor;
123- MsgElement::Ptr msgElem = MsgElement::retrieve (*this );
123+ // throwOnMissing=false since missing data is possible with TCP.
124+ MsgElement::Ptr msgElem = MsgElement::retrieve (*this , note + " _safeRetrieve &&&" , false );
124125 if (msgElem != nullptr ) {
125126 return msgElem;
126127 } else {
@@ -133,7 +134,20 @@ std::shared_ptr<MsgElement> BufferUdp::_safeRetrieve() {
133134
134135bool BufferUdp::isRetrieveSafe (size_t len) const {
135136 auto newLen = (_rCursor + len);
136- return (newLen <= _end && newLen <= _wCursor);
137+ // &&&return (newLen <= _end && newLen <= _wCursor);
138+ bool res = (newLen <= _end && newLen <= _wCursor); // &&&
139+ if (!res) { // &&&
140+ LOGS (_log, LOG_LVL_WARN, " &&& BufferUdp::isRetrieveSafe not safe len=" << len <<
141+ " rCursor=" << (void *)_rCursor <<
142+ " newLen=" << (void *)newLen <<
143+ " wCursor=" << (void *)_wCursor <<
144+ " _end=" << (void *)_end <<
145+ " (newLen<=end)=" << (newLen <= _end) <<
146+ " (newLen<=_wCursor)=" << (newLen <= _wCursor) <<
147+ " res=" << res);
148+ LOGS (_log, LOG_LVL_WARN, " &&& BufferUdp::isRetrieveSafe " << dumpStr (false ));
149+ }
150+ return res;
137151}
138152
139153
@@ -143,6 +157,7 @@ bool BufferUdp::retrieve(void* out, size_t len) {
143157 _rCursor += len;
144158 return true ;
145159 }
160+ LOGS (_log, LOG_LVL_WARN, " &&& BufferUdp::retrieve not safe len=" << len);
146161 return false ;
147162}
148163
0 commit comments