1
0
mirror of https://github.com/Icinga/icinga2.git synced 2025-04-07 20:25:08 +02:00

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

@ -69,7 +69,7 @@ size_t FIFO::GetSize(void) const
return m_BufferSize - m_Offset;
}
const void *FIFO::Peek(void) const
const void *FIFO::GetReadBuffer(void) const
{
return m_Buffer + m_Offset;
}
@ -88,7 +88,7 @@ size_t FIFO::Read(void *buffer, size_t count)
return count;
}
size_t FIFO::Write(const void *buffer, size_t count)
void *FIFO::GetWriteBuffer(size_t count)
{
char *new_buffer;
@ -98,7 +98,18 @@ size_t FIFO::Write(const void *buffer, size_t count)
throw exception(/*"Out of memory."*/);
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;
return count;
}

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

@ -31,13 +31,14 @@ FIFO::RefType TCPClient::GetRecvQueue(void)
int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
{
char buffer[4096];
int read_total, rc;
read_total = 0;
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
if (rc < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
@ -51,7 +52,7 @@ int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
return 0;
}
m_RecvQueue->Write(buffer, rc);
m_RecvQueue->Write(NULL, rc);
read_total += rc;
/* make sure we don't starve other sockets */
@ -70,7 +71,7 @@ int TCPClient::WritableEventHandler(EventArgs::RefType ea)
{
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) {
Close();

@ -19,7 +19,7 @@ Netstring::~Netstring(void)
Netstring::RefType Netstring::ReadFromFIFO(FIFO::RefType fifo)
{
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 */
if (buffer_length < 3)

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