return m_BufferSize - m_Offset;
}
-const void *FIFO::Peek(void) const
+const void *FIFO::GetReadBuffer(void) const
{
return m_Buffer + m_Offset;
}
return count;
}
-size_t FIFO::Write(const void *buffer, size_t count)
+void *FIFO::GetWriteBuffer(size_t count)
{
char *new_buffer;
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;
}
class FIFO : public Object
{
private:
- static const size_t BlockSize = 16 * 1024;
char *m_Buffer;
size_t m_BufferSize;
size_t m_Offset;
void Optimize(void);
public:
+ static const size_t BlockSize = 16 * 1024;
+
typedef shared_ptr<FIFO> RefType;
typedef weak_ptr<FIFO> WeakRefType;
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);
};
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)
return 0;
}
- m_RecvQueue->Write(buffer, rc);
+ m_RecvQueue->Write(NULL, rc);
read_total += rc;
/* make sure we don't starve other sockets */
{
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();
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)
JsonRpcServer::RefType ts = new_object<JsonRpcServer>();
ts->MakeSocket();
- ts->Bind(9999);
+ ts->Bind(7777);
ts->Listen();
ConnectionManager::RefType cm = new_object<ConnectionManager>();