[Pkg-javascript-commits] [node-leveldown] 338/492: batch memory leak, not disposing of String->Slice

Andrew Kelley andrewrk-guest at moszumanska.debian.org
Sun Jul 6 17:14:15 UTC 2014


This is an automated email from the git hooks/post-receive script.

andrewrk-guest pushed a commit to annotated tag rocksdb-0.10.1
in repository node-leveldown.

commit e300d6ff9569de39d9227f0bda2b923b0b7d68fc
Author: Rod Vagg <rod at vagg.org>
Date:   Fri May 17 12:21:17 2013 +1000

    batch memory leak, not disposing of String->Slice
---
 src/batch.cc          | 26 +++++++++++++-------------
 src/batch.h           |  2 +-
 src/database.cc       | 29 +++++++++++++++--------------
 src/database.h        | 14 +++++++++++---
 src/database_async.cc |  2 +-
 src/database_async.h  |  4 ++--
 6 files changed, 43 insertions(+), 34 deletions(-)

diff --git a/src/batch.cc b/src/batch.cc
index 7e26fab..2b09454 100644
--- a/src/batch.cc
+++ b/src/batch.cc
@@ -13,7 +13,7 @@ Batch::Batch (leveldown::Database* database, bool sync) : database(database) {
   options = new leveldb::WriteOptions();
   options->sync = sync;
   batch = new leveldb::WriteBatch();
-  references = new std::vector< v8::Persistent<v8::Value> >;
+  references = new std::vector<Reference>;
   hasData = false;
 }
 
@@ -103,14 +103,14 @@ v8::Handle<v8::Value> Batch::Put (const v8::Arguments& args) {
   LD_STRING_OR_BUFFER_TO_SLICE(key, keyBuffer, key)
   LD_STRING_OR_BUFFER_TO_SLICE(value, valueBuffer, value)
 
-  if (node::Buffer::HasInstance(keyBuffer->ToObject()))
-    batch->references->push_back(v8::Persistent<v8::Value>::New(
-        LD_NODE_ISOLATE_PRE
-        keyBuffer));
-  if (node::Buffer::HasInstance(valueBuffer->ToObject()))
-    batch->references->push_back(v8::Persistent<v8::Value>::New(
-        LD_NODE_ISOLATE_PRE
-        valueBuffer));
+  batch->references->push_back(Reference(
+      v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE keyBuffer)
+    , key
+  ));
+  batch->references->push_back(Reference(
+      v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE valueBuffer)
+    , value
+  ));
 
   batch->batch->Put(key, value);
   if (!batch->hasData)
@@ -130,10 +130,10 @@ v8::Handle<v8::Value> Batch::Del (const v8::Arguments& args) {
   v8::Local<v8::Value> keyBuffer = args[0];
   LD_STRING_OR_BUFFER_TO_SLICE(key, keyBuffer, key)
 
-  if (node::Buffer::HasInstance(keyBuffer->ToObject()))
-    batch->references->push_back(v8::Persistent<v8::Value>::New(
-        LD_NODE_ISOLATE_PRE
-        keyBuffer));
+  batch->references->push_back(Reference(
+      v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE keyBuffer)
+    , key
+  ));
 
   batch->batch->Delete(key);
   if (!batch->hasData)
diff --git a/src/batch.h b/src/batch.h
index 54ab7dc..dc07ce4 100644
--- a/src/batch.h
+++ b/src/batch.h
@@ -26,7 +26,7 @@ private:
   leveldown::Database* database;
   leveldb::WriteOptions* options;
   leveldb::WriteBatch* batch;
-  std::vector< v8::Persistent<v8::Value> >* references;
+  std::vector<Reference>* references;
   bool hasData; // keep track of whether we're writing data or not
 
   static v8::Persistent<v8::Function> constructor;
diff --git a/src/database.cc b/src/database.cc
index 7d2f98d..4b4dde3 100644
--- a/src/database.cc
+++ b/src/database.cc
@@ -411,8 +411,7 @@ v8::Handle<v8::Value> Database::Batch (const v8::Arguments& args) {
 
   v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[0]);
 
-  std::vector< v8::Persistent<v8::Value> >* references =
-      new std::vector< v8::Persistent<v8::Value> >;
+  std::vector< Reference >* references = new std::vector< Reference >;
   leveldb::WriteBatch* batch = new leveldb::WriteBatch();
   bool hasData = false;
 
@@ -433,10 +432,11 @@ v8::Handle<v8::Value> Database::Batch (const v8::Arguments& args) {
       batch->Delete(key);
       if (!hasData)
         hasData = true;
-      if (node::Buffer::HasInstance(keyBuffer->ToObject()))
-        references->push_back(v8::Persistent<v8::Value>::New(
-            LD_NODE_ISOLATE_PRE
-            keyBuffer));
+
+      references->push_back(Reference(
+          v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE keyBuffer)
+        , key
+      ));
     } else if (obj->Get(str_type)->StrictEquals(str_put)) {
       v8::Local<v8::Value> valueBuffer = obj->Get(str_value);
       LD_CB_ERR_IF_NULL_OR_UNDEFINED(valueBuffer, value)
@@ -447,14 +447,15 @@ v8::Handle<v8::Value> Database::Batch (const v8::Arguments& args) {
       batch->Put(key, value);
       if (!hasData)
         hasData = true;
-      if (node::Buffer::HasInstance(keyBuffer->ToObject()))
-        references->push_back(v8::Persistent<v8::Value>::New(
-            LD_NODE_ISOLATE_PRE
-            keyBuffer));
-      if (node::Buffer::HasInstance(valueBuffer->ToObject()))
-        references->push_back(v8::Persistent<v8::Value>::New(
-            LD_NODE_ISOLATE_PRE
-            valueBuffer));
+
+      references->push_back(Reference(
+          v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE keyBuffer)
+        , key
+      ));
+      references->push_back(Reference(
+          v8::Persistent<v8::Value>::New(LD_NODE_ISOLATE_PRE valueBuffer)
+        , value
+      ));
     }
   }
 
diff --git a/src/database.h b/src/database.h
index 25e8019..5a5a32a 100644
--- a/src/database.h
+++ b/src/database.h
@@ -32,11 +32,19 @@ struct AsyncDescriptor;
 
 v8::Handle<v8::Value> LevelDOWN (const v8::Arguments& args);
 
-static inline void ClearReferences (std::vector< v8::Persistent<v8::Value> >* references) {
-  for (std::vector< v8::Persistent<v8::Value> >::iterator it = references->begin()
+struct Reference {
+  v8::Persistent<v8::Value> ptr;
+  leveldb::Slice slice;
+  Reference(v8::Persistent<v8::Value> ptr, leveldb::Slice slice) :
+      ptr(ptr)
+    , slice(slice) { };
+};
+
+static inline void ClearReferences (std::vector<Reference>* references) {
+  for (std::vector<Reference>::iterator it = references->begin()
       ; it != references->end()
       ; ) {
-    it->Dispose(LD_NODE_ISOLATE);
+    DisposeStringOrBufferFromSlice(it->ptr, it->slice);
     it = references->erase(it);
   }
   delete references;
diff --git a/src/database_async.cc b/src/database_async.cc
index a6e6ad9..ef24498 100644
--- a/src/database_async.cc
+++ b/src/database_async.cc
@@ -181,7 +181,7 @@ BatchWorker::BatchWorker (
     Database* database
   , v8::Persistent<v8::Function> callback
   , leveldb::WriteBatch* batch
-  , std::vector< v8::Persistent<v8::Value> >* references
+  , std::vector<Reference>* references
   , bool sync
 ) : AsyncWorker(database, callback)
   , batch(batch)
diff --git a/src/database_async.h b/src/database_async.h
index 8ca9fdd..80dafff 100644
--- a/src/database_async.h
+++ b/src/database_async.h
@@ -131,7 +131,7 @@ public:
       Database* database
     , v8::Persistent<v8::Function> callback
     , leveldb::WriteBatch* batch
-    , std::vector< v8::Persistent<v8::Value> >* references
+    , std::vector<Reference>* references
     , bool sync
   );
 
@@ -141,7 +141,7 @@ public:
 private:
   leveldb::WriteOptions* options;
   leveldb::WriteBatch* batch;
-  std::vector< v8::Persistent<v8::Value> >* references;
+  std::vector<Reference>* references;
 };
 
 class ApproximateSizeWorker : public AsyncWorker {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-leveldown.git



More information about the Pkg-javascript-commits mailing list