summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2013-04-03 16:50:46 -0400
committerEric Milkie <milkie@10gen.com>2013-04-03 21:55:46 -0400
commitee21ceb8d40329db2da65216b634c8f6f05628ab (patch)
treeec2eb2e6a3463444b5a16541eb7ef16830ff1945
parent9a846d86881cc2a0b3a0ceca14a0248fc3c11e2b (diff)
downloadmongo-ee21ceb8d40329db2da65216b634c8f6f05628ab.tar.gz
SERVER-9230: fix issue causing persistent v8 objects not to be tracked
-rw-r--r--src/mongo/scripting/engine_v8.h16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/mongo/scripting/engine_v8.h b/src/mongo/scripting/engine_v8.h
index faf570c18a6..5106d771250 100644
--- a/src/mongo/scripting/engine_v8.h
+++ b/src/mongo/scripting/engine_v8.h
@@ -63,17 +63,18 @@ namespace mongo {
*/
void track(v8::Persistent<v8::Value> instanceHandle, _ObjType* instance) {
TrackedPtr* collectionHandle = new TrackedPtr(instance, this);
+ _container.insert(collectionHandle);
instanceHandle.MakeWeak(collectionHandle, deleteOnCollect);
}
/**
- * Free any remaining objects which are being tracked. Invoked when
- * the V8Scope is destructed.
+ * Free any remaining objects and their TrackedPtrs. Invoked when the
+ * V8Scope is destructed.
*/
~ObjTracker() {
if (!_container.empty())
LOG(1) << "freeing " << _container.size() << " uncollected "
<< typeid(_ObjType).name() << " objects" << endl;
- typename set<_ObjType*>::iterator it = _container.begin();
+ typename set<TrackedPtr*>::iterator it = _container.begin();
while (it != _container.end()) {
delete *it;
_container.erase(it++);
@@ -90,7 +91,7 @@ namespace mongo {
TrackedPtr(_ObjType* instance, ObjTracker<_ObjType>* tracker) :
_objPtr(instance),
_tracker(tracker) { }
- _ObjType* _objPtr;
+ scoped_ptr<_ObjType> _objPtr;
ObjTracker<_ObjType>* _tracker;
};
@@ -102,14 +103,13 @@ namespace mongo {
*/
static void deleteOnCollect(v8::Persistent<v8::Value> instanceHandle, void* rawData) {
TrackedPtr* trackedPtr = static_cast<TrackedPtr*>(rawData);
- trackedPtr->_tracker->_container.erase(trackedPtr->_objPtr);
- delete trackedPtr->_objPtr;
+ trackedPtr->_tracker->_container.erase(trackedPtr);
delete trackedPtr;
instanceHandle.Dispose();
}
- // container for all instances of the tracked _ObjType
- set<_ObjType*> _container;
+ // container for all TrackedPtrs created by this ObjTracker instance
+ set<TrackedPtr*> _container;
};
/**