Don't use std::function in sockets.

This commit is contained in:
Bartosz Taudul 2020-04-13 14:14:36 +02:00
parent a2187565d1
commit e4ec666479
2 changed files with 33 additions and 25 deletions

View File

@ -221,33 +221,26 @@ int Socket::Recv( void* _buf, int len, int timeout )
}
}
bool Socket::Read( void* _buf, int len, int timeout, std::function<bool()> exitCb )
bool Socket::ReadImpl( char*& buf, int& len, int timeout )
{
auto buf = (char*)_buf;
while( len > 0 )
const auto sz = RecvBuffered( buf, len, timeout );
switch( sz )
{
if( exitCb() ) return false;
const auto sz = RecvBuffered( buf, len, timeout );
switch( sz )
{
case 0:
return false;
case -1:
case 0:
return false;
case -1:
#ifdef _WIN32
{
auto err = WSAGetLastError();
if( err == WSAECONNABORTED || err == WSAECONNRESET ) return false;
}
#endif
break;
default:
len -= sz;
buf += sz;
break;
}
{
auto err = WSAGetLastError();
if( err == WSAECONNABORTED || err == WSAECONNRESET ) return false;
}
#endif
break;
default:
len -= sz;
buf += sz;
break;
}
return true;
}

View File

@ -1,7 +1,9 @@
#ifndef __TRACYSOCKET_HPP__
#define __TRACYSOCKET_HPP__
#include <functional>
#include <stdint.h>
#include "TracyForceInline.hpp"
struct sockaddr;
@ -25,7 +27,18 @@ public:
int Send( const void* buf, int len );
int GetSendBufSize();
bool Read( void* buf, int len, int timeout, std::function<bool()> exitCb );
template<typename ShouldExit>
bool Read( void* buf, int len, int timeout, ShouldExit exitCb )
{
auto cbuf = (char*)buf;
while( len > 0 )
{
if( exitCb() ) return false;
if( !ReadImpl( cbuf, len, timeout ) ) return false;
}
return true;
}
bool ReadRaw( void* buf, int len, int timeout );
bool HasData();
bool IsValid() const;
@ -39,6 +52,8 @@ private:
int RecvBuffered( void* buf, int len, int timeout );
int Recv( void* buf, int len, int timeout );
bool ReadImpl( char*& buf, int& len, int timeout );
char* m_buf;
char* m_bufPtr;
int m_sock;