Resizing buffer implementation added. 62/117362/1
authorPawel Wrobel <p.wrobel@samsung.com>
Fri, 3 Mar 2017 13:44:06 +0000 (14:44 +0100)
committerJaemin Ryu <jm77.ryu@samsung.com>
Mon, 6 Mar 2017 00:50:55 +0000 (09:50 +0900)
Buffer resize has been added when writing more then 4096 data.
Also Message::decode has been changed to allow proper deserialization.

Change-Id: Ic3bd6a711e7b8cc817b365dd055298828e049972

include/klay/rmi/message-composer.h
include/klay/rmi/message.h
src/rmi/message-composer.cpp

index 1a5cdcf2d1860f0880f4b1a128c86fe1bc0bc42f..b5279b20dde49b249b299437da55220a39f5e729 100644 (file)
@@ -35,10 +35,7 @@ public:
        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()
        {
index 7016cde3225aaa7637e46597509f8dd214bd07a7..3d366713a755fb20fcd864b5914ef26b11f4c24a 100644 (file)
@@ -220,8 +220,8 @@ void Message::decode(const T& device)
 {
        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];
 
index 82d16c6613e08ed3e9fd4b029c138233c3489006..92f345672e9169fef335ad80d39c41a0ebde2b66 100644 (file)
 
 #include <cstring>
 #include <algorithm>
+#include <iostream>
+#include <fstream>
 
+#include <klay/audit/logger.h>
 #include <klay/rmi/message-composer.h>
 
 namespace rmi {
@@ -106,10 +109,24 @@ MessageComposer& MessageComposer::operator=(MessageComposer&& rhs)
 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;
 }
@@ -130,4 +147,17 @@ void MessageComposer::read(void* ptr, const size_t sz)
        }
 }
 
+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