[Pkg-javascript-commits] [node-leveldown] 434/492: fix batch() memory leaks & don't persist inputs

Andrew Kelley andrewrk-guest at moszumanska.debian.org
Sun Jul 6 17:14:26 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 9d1977ce56dadf5bbc4551d909bfb8a36b65533a
Author: Rod Vagg <rod at vagg.org>
Date:   Tue Nov 12 21:21:52 2013 +1100

    fix batch() memory leaks & don't persist inputs
---
 src/batch.cc          | 12 +++++-------
 src/batch.h           |  1 -
 src/database.cc       |  9 +++------
 src/database_async.cc |  6 +++---
 src/database_async.h  |  2 --
 src/leveldown.h       |  2 +-
 6 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/src/batch.cc b/src/batch.cc
index 080ef14..7a9236a 100644
--- a/src/batch.cc
+++ b/src/batch.cc
@@ -15,13 +15,11 @@ Batch::Batch (leveldown::Database* database, bool sync) : database(database) {
   options = new leveldb::WriteOptions();
   options->sync = sync;
   batch = new leveldb::WriteBatch();
-  references = new std::vector<Reference *>;
   hasData = false;
   written = false;
 }
 
 Batch::~Batch () {
-  ClearReferences(references);
   delete options;
   delete batch;
 }
@@ -100,13 +98,13 @@ NAN_METHOD(Batch::Put) {
   LD_STRING_OR_BUFFER_TO_SLICE(key, keyBuffer, key)
   LD_STRING_OR_BUFFER_TO_SLICE(value, valueBuffer, value)
 
-  //batch->references->push_back(new Reference(keyBuffer, key));
-  //batch->references->push_back(new Reference(valueBuffer, value));
-
   batch->batch->Put(key, value);
   if (!batch->hasData)
     batch->hasData = true;
 
+  DisposeStringOrBufferFromSlice(keyBuffer, key);
+  DisposeStringOrBufferFromSlice(valueBuffer, value);
+
   NanReturnValue(args.Holder());
 }
 
@@ -125,12 +123,12 @@ NAN_METHOD(Batch::Del) {
   v8::Local<v8::Value> keyBuffer = args[0];
   LD_STRING_OR_BUFFER_TO_SLICE(key, keyBuffer, key)
 
-  //batch->references->push_back(new Reference(keyBuffer, key));
-
   batch->batch->Delete(key);
   if (!batch->hasData)
     batch->hasData = true;
 
+  DisposeStringOrBufferFromSlice(keyBuffer, key);
+
   NanReturnValue(args.Holder());
 }
 
diff --git a/src/batch.h b/src/batch.h
index 7716d88..c72d790 100644
--- a/src/batch.h
+++ b/src/batch.h
@@ -26,7 +26,6 @@ private:
   leveldown::Database* database;
   leveldb::WriteOptions* options;
   leveldb::WriteBatch* batch;
-  std::vector<Reference *>* references;
   bool hasData; // keep track of whether we're writing data or not
   bool written;
 
diff --git a/src/database.cc b/src/database.cc
index a1eab72..9d64b2b 100644
--- a/src/database.cc
+++ b/src/database.cc
@@ -391,7 +391,6 @@ NAN_METHOD(Database::Batch) {
 
   v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[0]);
 
-  std::vector< Reference *>* references = new std::vector< Reference *>;
   leveldb::WriteBatch* batch = new leveldb::WriteBatch();
   bool hasData = false;
 
@@ -413,7 +412,7 @@ NAN_METHOD(Database::Batch) {
       if (!hasData)
         hasData = true;
 
-      //references->push_back(new Reference(keyBuffer, key));
+      DisposeStringOrBufferFromSlice(keyBuffer, key);
     } else if (obj->Get(NanSymbol("type"))->StrictEquals(NanSymbol("put"))) {
       v8::Local<v8::Value> valueBuffer = obj->Get(NanSymbol("value"));
       LD_CB_ERR_IF_NULL_OR_UNDEFINED(valueBuffer, value)
@@ -425,8 +424,8 @@ NAN_METHOD(Database::Batch) {
       if (!hasData)
         hasData = true;
 
-      //references->push_back(new Reference(keyBuffer, key));
-      //references->push_back(new Reference(valueBuffer, value));
+      DisposeStringOrBufferFromSlice(keyBuffer, key);
+      DisposeStringOrBufferFromSlice(valueBuffer, value);
     }
   }
 
@@ -436,11 +435,9 @@ NAN_METHOD(Database::Batch) {
         database
       , new NanCallback(callback)
       , batch
-      , references
       , sync
     ));
   } else {
-    ClearReferences(references);
     LD_RUN_CALLBACK(callback, 0, NULL);
   }
 
diff --git a/src/database_async.cc b/src/database_async.cc
index 91b70fa..27aa982 100644
--- a/src/database_async.cc
+++ b/src/database_async.cc
@@ -6,6 +6,8 @@
 #include <node.h>
 #include <node_buffer.h>
 
+#include "leveldb/write_batch.h"
+
 #include "database.h"
 #include "leveldown.h"
 #include "async.h"
@@ -201,18 +203,16 @@ BatchWorker::BatchWorker (
     Database *database
   , NanCallback *callback
   , leveldb::WriteBatch* batch
-  , std::vector<Reference *>* references
   , bool sync
 ) : AsyncWorker(database, callback)
   , batch(batch)
-  , references(references)
 {
   options = new leveldb::WriteOptions();
   options->sync = sync;
 };
 
 BatchWorker::~BatchWorker () {
-  ClearReferences(references);
+  delete batch;
   delete options;
 }
 
diff --git a/src/database_async.h b/src/database_async.h
index 909e7e6..5209de3 100644
--- a/src/database_async.h
+++ b/src/database_async.h
@@ -129,7 +129,6 @@ public:
       Database *database
     , NanCallback *callback
     , leveldb::WriteBatch* batch
-    , std::vector<Reference *>* references
     , bool sync
   );
 
@@ -139,7 +138,6 @@ public:
 private:
   leveldb::WriteOptions* options;
   leveldb::WriteBatch* batch;
-  std::vector<Reference *>* references;
 };
 
 class ApproximateSizeWorker : public AsyncWorker {
diff --git a/src/leveldown.h b/src/leveldown.h
index 3d82795..2223094 100644
--- a/src/leveldown.h
+++ b/src/leveldown.h
@@ -29,7 +29,7 @@ static inline void DisposeStringOrBufferFromSlice(
 }
 
 static inline void DisposeStringOrBufferFromSlice(
-        v8::Local<v8::Object> handle
+        v8::Local<v8::Value> handle
       , leveldb::Slice slice) {
 
   if (!node::Buffer::HasInstance(handle))

-- 
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