diff options
author | Mathias Stearn <mathias@10gen.com> | 2013-04-03 16:50:46 -0400 |
---|---|---|
committer | Eric Milkie <milkie@10gen.com> | 2013-04-03 21:55:46 -0400 |
commit | ee21ceb8d40329db2da65216b634c8f6f05628ab (patch) | |
tree | ec2eb2e6a3463444b5a16541eb7ef16830ff1945 | |
parent | 9a846d86881cc2a0b3a0ceca14a0248fc3c11e2b (diff) | |
download | mongo-ee21ceb8d40329db2da65216b634c8f6f05628ab.tar.gz |
SERVER-9230: fix issue causing persistent v8 objects not to be tracked
-rw-r--r-- | src/mongo/scripting/engine_v8.h | 16 |
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; }; /** |