Improved FIFO performance

This commit is contained in:
Gunnar Beutner 2012-03-28 19:50:55 +02:00
parent 265a8231c8
commit 9db06ec8e7
5 changed files with 26 additions and 11 deletions

View File

@ -69,7 +69,7 @@ size_t FIFO::GetSize(void) const
return m_BufferSize - m_Offset; return m_BufferSize - m_Offset;
} }
const void *FIFO::Peek(void) const const void *FIFO::GetReadBuffer(void) const
{ {
return m_Buffer + m_Offset; return m_Buffer + m_Offset;
} }
@ -88,7 +88,7 @@ size_t FIFO::Read(void *buffer, size_t count)
return count; return count;
} }
size_t FIFO::Write(const void *buffer, size_t count) void *FIFO::GetWriteBuffer(size_t count)
{ {
char *new_buffer; char *new_buffer;
@ -98,7 +98,18 @@ size_t FIFO::Write(const void *buffer, size_t count)
throw exception(/*"Out of memory."*/); throw exception(/*"Out of memory."*/);
m_Buffer = new_buffer; m_Buffer = new_buffer;
memcpy(new_buffer + m_BufferSize + m_Offset, buffer, count);
return new_buffer + m_Offset + m_BufferSize;
}
size_t FIFO::Write(const void *buffer, size_t count)
{
if (buffer != NULL) {
void *target_buffer = GetWriteBuffer(count);
memcpy(target_buffer, buffer, count);
}
m_BufferSize += count; m_BufferSize += count;
return count; return count;
} }

View File

@ -7,7 +7,6 @@ namespace icinga
class FIFO : public Object class FIFO : public Object
{ {
private: private:
static const size_t BlockSize = 16 * 1024;
char *m_Buffer; char *m_Buffer;
size_t m_BufferSize; size_t m_BufferSize;
size_t m_Offset; size_t m_Offset;
@ -16,6 +15,8 @@ private:
void Optimize(void); void Optimize(void);
public: public:
static const size_t BlockSize = 16 * 1024;
typedef shared_ptr<FIFO> RefType; typedef shared_ptr<FIFO> RefType;
typedef weak_ptr<FIFO> WeakRefType; typedef weak_ptr<FIFO> WeakRefType;
@ -24,7 +25,9 @@ public:
size_t GetSize(void) const; size_t GetSize(void) const;
const void *Peek(void) const; const void *GetReadBuffer(void) const;
void *GetWriteBuffer(size_t count);
size_t Read(void *buffer, size_t count); size_t Read(void *buffer, size_t count);
size_t Write(const void *buffer, size_t count); size_t Write(const void *buffer, size_t count);
}; };

View File

@ -31,13 +31,14 @@ FIFO::RefType TCPClient::GetRecvQueue(void)
int TCPClient::ReadableEventHandler(EventArgs::RefType ea) int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
{ {
char buffer[4096];
int read_total, rc; int read_total, rc;
read_total = 0; read_total = 0;
while (true) { while (true) {
rc = recv(GetFD(), buffer, sizeof(buffer), 0); static const size_t BufferSize = FIFO::BlockSize / 2;
char *buffer = (char *)m_RecvQueue->GetWriteBuffer(BufferSize);
rc = recv(GetFD(), buffer, BufferSize, 0);
#ifdef _WIN32 #ifdef _WIN32
if (rc < 0 && WSAGetLastError() == WSAEWOULDBLOCK) if (rc < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
@ -51,7 +52,7 @@ int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
return 0; return 0;
} }
m_RecvQueue->Write(buffer, rc); m_RecvQueue->Write(NULL, rc);
read_total += rc; read_total += rc;
/* make sure we don't starve other sockets */ /* make sure we don't starve other sockets */
@ -70,7 +71,7 @@ int TCPClient::WritableEventHandler(EventArgs::RefType ea)
{ {
int rc; int rc;
rc = send(GetFD(), (const char *)m_SendQueue->Peek(), m_SendQueue->GetSize(), 0); rc = send(GetFD(), (const char *)m_SendQueue->GetReadBuffer(), m_SendQueue->GetSize(), 0);
if (rc <= 0) { if (rc <= 0) {
Close(); Close();

View File

@ -19,7 +19,7 @@ Netstring::~Netstring(void)
Netstring::RefType Netstring::ReadFromFIFO(FIFO::RefType fifo) Netstring::RefType Netstring::ReadFromFIFO(FIFO::RefType fifo)
{ {
size_t buffer_length = fifo->GetSize(); size_t buffer_length = fifo->GetSize();
const char *buffer = (const char *)fifo->Peek(); const char *buffer = (const char *)fifo->GetReadBuffer();
/* minimum netstring length is 3 */ /* minimum netstring length is 3 */
if (buffer_length < 3) if (buffer_length < 3)

View File

@ -36,7 +36,7 @@ public:
JsonRpcServer::RefType ts = new_object<JsonRpcServer>(); JsonRpcServer::RefType ts = new_object<JsonRpcServer>();
ts->MakeSocket(); ts->MakeSocket();
ts->Bind(9999); ts->Bind(7777);
ts->Listen(); ts->Listen();
ConnectionManager::RefType cm = new_object<ConnectionManager>(); ConnectionManager::RefType cm = new_object<ConnectionManager>();