commit e8ffb0c97aa7c5a27dd3fcfc79a4ce13d8701762
Author: Richard Heck <[email protected]>
Date: Tue Jan 5 09:52:18 2016 -0500
Rewrite the BufferList::releaseChild method so that it only checks
whether a given child Buffer is also a child of some other parent.
Then do the releasing or resetting where this method is called.
There should be no change of behavior with this patch.
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index eac9821..115a542 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -517,8 +517,12 @@ Buffer::~Buffer()
Impl::BufferPositionMap::iterator end =
d->children_positions.end();
for (; it != end; ++it) {
Buffer * child = const_cast<Buffer *>(it->first);
- if (theBufferList().isLoaded(child))
- theBufferList().releaseChild(this, child);
+ if (theBufferList().isLoaded(child)) {
+ if (theBufferList().isOthersChild(this, child))
+ child->setParent(0);
+ else
+ theBufferList().release(child);
+ }
}
if (!isClean()) {
diff --git a/src/BufferList.cpp b/src/BufferList.cpp
index 68a1e80..ff99a09 100644
--- a/src/BufferList.cpp
+++ b/src/BufferList.cpp
@@ -267,6 +267,28 @@ bool BufferList::exists(FileName const & fname) const
}
+bool BufferList::isOthersChild(Buffer * parent, Buffer * child)
+{
+ LASSERT(parent, return false);
+ LASSERT(child, return false);
+ LASSERT(parent->isChild(child), return false);
+
+ // Does child document have a different parent?
+ Buffer const * parent_ = child->parent();
+ if (parent_ && parent_ != parent)
+ return true;
+
+ BufferStorage::iterator it = bstore.begin();
+ BufferStorage::iterator end = bstore.end();
+ for (; it != end; ++it) {
+ Buffer * buf = *it;
+ if (buf != parent && buf->isChild(child))
+ return true;
+ }
+ return false;
+}
+
+
namespace {
struct equivalent_to : public binary_function<FileName, FileName, bool>
@@ -364,31 +386,6 @@ int BufferList::bufferNum(FileName const & fname) const
}
-bool BufferList::releaseChild(Buffer * parent, Buffer * child)
-{
- LASSERT(parent, return false);
- LASSERT(child, return false);
- LASSERT(parent->isChild(child), return false);
-
- // Child document has a different parent, don't close it.
- Buffer const * parent_ = child->parent();
- if (parent_ && parent_ != parent)
- return false;
-
- BufferStorage::iterator it = bstore.begin();
- BufferStorage::iterator end = bstore.end();
- for (; it != end; ++it) {
- Buffer * buf = *it;
- if (buf != parent && buf->isChild(child)) {
- child->setParent(0);
- return false;
- }
- }
- release(child);
- return true;
-}
-
-
void BufferList::changed(bool update_metrics) const
{
BufferStorage::const_iterator it = bstore.begin();
diff --git a/src/BufferList.h b/src/BufferList.h
index 242eff0..690bf6a 100644
--- a/src/BufferList.h
+++ b/src/BufferList.h
@@ -55,13 +55,14 @@ public:
/// \return 0 if the Buffer creation is not possible for whatever
reason.
Buffer * newInternalBuffer(std::string const & s);
+ /// Is child a child of some Buffer other than parent?
+ /// NOTE: child must be a child of parent, and both must be non-null.
+ /// Otherwise we assert.
+ bool isOthersChild(Buffer * parent, Buffer * child);
+
/// delete a buffer
void release(Buffer * b);
- /// Release \p child if it really is a child and is not used elsewhere.
- /// \return true is the file was closed.
- bool releaseChild(Buffer * parent, Buffer * child);
-
/// Close all open buffers.
void closeAll();