void write(const void* ptr, const size_t sz);
void read(void* ptr, const size_t sz);
- void reserve(size_t size)
- {
- produce = size;
- }
+ void reserve(size_t size);
void reset()
{
{
MessageHeader header;
device.read(&header, sizeof(header));
- device.read(buffer.begin(), header.length);
buffer.reserve(header.length);
+ device.read(buffer.begin(), header.length);
int fds[header.ancillary];
#include <cstring>
#include <algorithm>
+#include <iostream>
+#include <fstream>
+#include <klay/audit/logger.h>
#include <klay/rmi/message-composer.h>
namespace rmi {
void MessageComposer::write(const void* ptr, const size_t sz)
{
size_t bytes = sz;
+ size_t new_capacity = capacity;
+
+ // If write exeeds capacity, increase capacity
+ while( ((produce + bytes) > new_capacity) && new_capacity) {
+ new_capacity += new_capacity;
+ }
+ if ( new_capacity > capacity ) {
+ // If we increased capacity, alloc new buffer
+ char *new_buffer = new char[new_capacity];
+ std::copy(buffer, buffer + produce, new_buffer);
+
+ delete [] buffer;
+ buffer = new_buffer;
+ capacity = new_capacity;
+ }
if ((produce + bytes) > capacity) {
bytes = capacity - produce;
}
-
::memcpy(reinterpret_cast<char *>(buffer + produce), ptr, bytes);
produce += bytes;
}
}
}
+void MessageComposer::reserve(size_t size)
+{
+ if ( size > capacity ) {
+ char *new_buffer = new char[size];
+ std::copy(buffer, buffer + produce, new_buffer);
+
+ delete [] buffer;
+ buffer = new_buffer;
+ capacity = size;
+ }
+ produce = size;
+}
+
} // namespae rmi