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:
parent
265a8231c8
commit
9db06ec8e7
@ -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>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user