mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-28 08:04:14 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
|
@ -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>();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user