crypto: fix excessive buffer allocation
authorFedor Indutny <fedor.indutny@gmail.com>
Tue, 11 Jun 2013 10:49:03 +0000 (12:49 +0200)
committerFedor Indutny <fedor.indutny@gmail.com>
Fri, 14 Jun 2013 15:10:04 +0000 (17:10 +0200)
Allocate buffer only if the next one isn't free.

src/node_crypto_bio.cc
src/node_crypto_bio.h

index 64d9efa..389d281 100644 (file)
@@ -303,11 +303,7 @@ void NodeBIO::Write(const char* data, size_t size) {
 
     // Go to next buffer if there still are some bytes to write
     if (left != 0) {
-      if (write_head_->write_pos_ == kBufferLength) {
-        Buffer* next = new Buffer();
-        next->next_ = write_head_->next_;
-        write_head_->next_ = next;
-      }
+      TryAllocateForWrite();
       write_head_ = write_head_->next_;
     }
   }
@@ -315,6 +311,18 @@ void NodeBIO::Write(const char* data, size_t size) {
 }
 
 
+void NodeBIO::TryAllocateForWrite() {
+  // If write head is full, next buffer is either read head or not empty.
+  if (write_head_->write_pos_ == kBufferLength &&
+      (write_head_->next_ == read_head_ ||
+       write_head_->next_->write_pos_ != 0)) {
+    Buffer* next = new Buffer();
+    next->next_ = write_head_->next_;
+    write_head_->next_ = next;
+  }
+}
+
+
 void NodeBIO::Reset() {
   while (read_head_->read_pos_ != read_head_->write_pos_) {
     assert(read_head_->write_pos_ > read_head_->read_pos_);
index e565b7f..c2fd6a0 100644 (file)
@@ -59,6 +59,9 @@ class NodeBIO {
 
   ~NodeBIO();
 
+  // Allocate new buffer for write if needed
+  void TryAllocateForWrite();
+
   // Read `len` bytes maximum into `out`, return actual number of read bytes
   size_t Read(char* out, size_t size);