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

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 83ffd7dac561a71b03f11cdf6d0c9c71d657875e
Author: Rod Vagg <rod at vagg.org>
Date:   Fri May 17 11:51:07 2013 +1000

    memory leak, not disposing of String->Slice char*
---
 src/batch.cc          |  8 +-------
 src/database_async.cc |  8 ++++----
 src/leveldown.h       | 12 ++++++++++++
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/batch.cc b/src/batch.cc
index 4777446..7e26fab 100644
--- a/src/batch.cc
+++ b/src/batch.cc
@@ -18,13 +18,7 @@ Batch::Batch (leveldown::Database* database, bool sync) : database(database) {
 }
 
 Batch::~Batch () {
-  for (std::vector< v8::Persistent<v8::Value> >::iterator it = references->begin()
-      ; it != references->end()
-      ; ) {
-    it->Dispose(LD_NODE_ISOLATE);
-    it = references->erase(it);
-  }
-  delete references;
+  ClearReferences(references);
   delete options;
   delete batch;
 }
diff --git a/src/database_async.cc b/src/database_async.cc
index 44a3f98..a6e6ad9 100644
--- a/src/database_async.cc
+++ b/src/database_async.cc
@@ -85,7 +85,7 @@ IOWorker::~IOWorker () {}
 
 void IOWorker::WorkComplete () {
   AsyncWorker::WorkComplete();
-  keyPtr.Dispose(LD_NODE_ISOLATE);
+  DisposeStringOrBufferFromSlice(keyPtr, key);
 }
 
 /** READ WORKER **/
@@ -172,7 +172,7 @@ void WriteWorker::Execute () {
 
 void WriteWorker::WorkComplete () {
   IOWorker::WorkComplete();
-  valuePtr.Dispose(LD_NODE_ISOLATE);
+  DisposeStringOrBufferFromSlice(valuePtr, value);
 }
 
 /** BATCH WORKER **/
@@ -223,8 +223,8 @@ void ApproximateSizeWorker::Execute () {
 
 void ApproximateSizeWorker::WorkComplete() {
   AsyncWorker::WorkComplete();
-  startPtr.Dispose(LD_NODE_ISOLATE);
-  endPtr.Dispose(LD_NODE_ISOLATE);
+  DisposeStringOrBufferFromSlice(startPtr, range.start);
+  DisposeStringOrBufferFromSlice(endPtr, range.limit);
 }
 
 void ApproximateSizeWorker::HandleOKCallback () {
diff --git a/src/leveldown.h b/src/leveldown.h
index 49fd2fe..67d0c80 100644
--- a/src/leveldown.h
+++ b/src/leveldown.h
@@ -7,6 +7,7 @@
 
 #include <node.h>
 #include <node_buffer.h>
+#include <leveldb/slice.h>
 
 static inline char* FromV8String(v8::Local<v8::Value> from) {
   size_t sz_;
@@ -79,6 +80,17 @@ static inline uint32_t UInt32OptionValue(
     LD_RETURN_CALLBACK_OR_ERROR(callback, #name " cannot be `null` or `undefined`") \
   }
 
+// NOTE: this MUST be called on objects created by
+// LD_STRING_OR_BUFFER_TO_SLICE
+static inline void DisposeStringOrBufferFromSlice(v8::Persistent<v8::Value> ptr
+      , leveldb::Slice slice) {
+
+  if (!node::Buffer::HasInstance(ptr))
+    delete slice.data();
+  ptr.Dispose(LD_NODE_ISOLATE);
+}
+
+// NOTE: must call DisposeStringOrBufferFromSlice() on objects created here
 #define LD_STRING_OR_BUFFER_TO_SLICE(to, from, name)                           \
   size_t to ## Sz_;                                                            \
   char* to ## Ch_;                                                             \

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