mirror of
https://github.com/vcmi/vcmi.git
synced 2025-04-17 11:56:46 +02:00
Connection buffered read cpack.
This commit is contained in:
parent
cb13064a62
commit
c271f9187f
@ -162,17 +162,17 @@ void CConnection::flushBuffers()
|
|||||||
|
|
||||||
int CConnection::write(const void * data, unsigned size)
|
int CConnection::write(const void * data, unsigned size)
|
||||||
{
|
{
|
||||||
if(enableBufferedWrite)
|
|
||||||
{
|
|
||||||
std::ostream ostream(&writeBuffer);
|
|
||||||
|
|
||||||
ostream.write(static_cast<const char *>(data), size);
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if(enableBufferedWrite)
|
||||||
|
{
|
||||||
|
std::ostream ostream(&writeBuffer);
|
||||||
|
|
||||||
|
ostream.write(static_cast<const char *>(data), size);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
ret = static_cast<int>(asio::write(*socket,asio::const_buffers_1(asio::const_buffer(data,size))));
|
ret = static_cast<int>(asio::write(*socket,asio::const_buffers_1(asio::const_buffer(data,size))));
|
||||||
return ret;
|
return ret;
|
||||||
@ -189,6 +189,24 @@ int CConnection::read(void * data, unsigned size)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if(enableBufferedRead)
|
||||||
|
{
|
||||||
|
auto available = readBuffer.size();
|
||||||
|
|
||||||
|
while(available < size)
|
||||||
|
{
|
||||||
|
auto bytesRead = socket->read_some(readBuffer.prepare(1024));
|
||||||
|
readBuffer.commit(bytesRead);
|
||||||
|
available = readBuffer.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::istream istream(&readBuffer);
|
||||||
|
|
||||||
|
istream.read(static_cast<char *>(data), size);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
int ret = static_cast<int>(asio::read(*socket,asio::mutable_buffers_1(asio::mutable_buffer(data,size))));
|
int ret = static_cast<int>(asio::read(*socket,asio::mutable_buffers_1(asio::mutable_buffer(data,size))));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -243,6 +261,8 @@ void CConnection::reportState(vstd::CLoggerBase * out)
|
|||||||
|
|
||||||
CPack * CConnection::retrievePack()
|
CPack * CConnection::retrievePack()
|
||||||
{
|
{
|
||||||
|
enableBufferedRead = true;
|
||||||
|
|
||||||
CPack * pack = nullptr;
|
CPack * pack = nullptr;
|
||||||
boost::unique_lock<boost::mutex> lock(*mutexRead);
|
boost::unique_lock<boost::mutex> lock(*mutexRead);
|
||||||
iser & pack;
|
iser & pack;
|
||||||
@ -255,6 +275,9 @@ CPack * CConnection::retrievePack()
|
|||||||
{
|
{
|
||||||
pack->c = this->shared_from_this();
|
pack->c = this->shared_from_this();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enableBufferedRead = false;
|
||||||
|
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,8 @@ namespace boost
|
|||||||
{
|
{
|
||||||
namespace asio
|
namespace asio
|
||||||
{
|
{
|
||||||
|
class streambuf;
|
||||||
|
|
||||||
namespace ip
|
namespace ip
|
||||||
{
|
{
|
||||||
class tcp;
|
class tcp;
|
||||||
@ -70,6 +72,9 @@ class DLL_LINKAGE CConnection
|
|||||||
bool enableBufferedWrite;
|
bool enableBufferedWrite;
|
||||||
boost::asio::streambuf writeBuffer;
|
boost::asio::streambuf writeBuffer;
|
||||||
|
|
||||||
|
bool enableBufferedRead;
|
||||||
|
boost::asio::streambuf readBuffer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BinaryDeserializer iser;
|
BinaryDeserializer iser;
|
||||||
BinarySerializer oser;
|
BinarySerializer oser;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user