diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 0badaae88c..8abdcc8632 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -139,13 +139,13 @@ void showPrintError(string const & name) Alert::error(_("Print document failed"), str); } -/// a list of Buffers we cloned -set cloned_buffer_list; - - } // namespace anon +// A storehouse for the cloned buffers. +list cloned_buffers; + + class Buffer::Impl { public: @@ -305,6 +305,8 @@ public: /// If non zero, this buffer is a clone of existing buffer \p cloned_buffer_ /// This one is useful for preview detached in a thread. Buffer const * cloned_buffer_; + /// + CloneList * clone_list_; /// are we in the process of exporting this buffer? mutable bool doing_export; @@ -341,7 +343,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, toc_backend(owner), macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0), undo_(*owner), bibinfo_cache_valid_(false), bibfile_cache_valid_(false), cite_labels_valid_(false), - preview_loader_(0), cloned_buffer_(cloned_buffer), + preview_loader_(0), cloned_buffer_(cloned_buffer), clone_list_(0), doing_export(false), parent_buffer(0) { if (!cloned_buffer_) { @@ -402,13 +404,13 @@ Buffer::~Buffer() if (isClone()) { // this is in case of recursive includes: we won't try to delete // ourselves as a child. - cloned_buffer_list.erase(this); + d->clone_list_->erase(this); // loop over children Impl::BufferPositionMap::iterator it = d->children_positions.begin(); Impl::BufferPositionMap::iterator end = d->children_positions.end(); for (; it != end; ++it) { Buffer * child = const_cast(it->first); - if (cloned_buffer_list.erase(child)) + if (d->clone_list_->erase(child)) delete child; } // FIXME Do we really need to do this right before we delete d? @@ -451,28 +453,21 @@ Buffer::~Buffer() Buffer * Buffer::clone() const { BufferMap bufmap; - masterBuffer()->clone(bufmap); + cloned_buffers.push_back(CloneList()); + CloneList * clones = &cloned_buffers.back(); + + masterBuffer()->clone(bufmap, clones); // make sure we got cloned BufferMap::const_iterator bit = bufmap.find(this); LASSERT(bit != bufmap.end(), return 0); Buffer * cloned_buffer = bit->second; - // this should be empty. if not, then either we have left - // some buffer undeleted, or else we are trying to export - // two buffers at once. either way is a problem. - LASSERT(cloned_buffer_list.empty(), return 0); - // record the list of cloned buffers in the cloned master - BufferMap::iterator it = bufmap.begin(); - BufferMap::iterator en = bufmap.end(); - for (; it != en; ++it) - cloned_buffer_list.insert(it->second); - return cloned_buffer; } -void Buffer::clone(BufferMap & bufmap) const +void Buffer::clone(BufferMap & bufmap, CloneList * clones) const { // have we already been cloned? if (bufmap.find(this) != bufmap.end()) @@ -480,6 +475,8 @@ void Buffer::clone(BufferMap & bufmap) const Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this); bufmap[this] = buffer_clone; + clones->insert(buffer_clone); + buffer_clone->d->clone_list_ = clones; buffer_clone->d->macro_lock = true; buffer_clone->d->children_positions.clear(); // FIXME (Abdel 09/01/2010): this is too complicated. The whole children_positions and @@ -493,7 +490,7 @@ void Buffer::clone(BufferMap & bufmap) const dit.setBuffer(buffer_clone); Buffer * child = const_cast(it->second.second); - child->clone(bufmap); + child->clone(bufmap, clones); BufferMap::iterator const bit = bufmap.find(child); LASSERT(bit != bufmap.end(), continue); Buffer * child_clone = bit->second; diff --git a/src/Buffer.h b/src/Buffer.h index bf2a9ead6b..0c15c0e2d2 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -79,6 +79,8 @@ class PreviewLoader; class Buffer; typedef std::list ListOfBuffers; +/// a list of Buffers we cloned +typedef std::set CloneList; /** The buffer object. @@ -230,7 +232,7 @@ private: /// typedef std::map BufferMap; /// - void clone(BufferMap &) const; + void clone(BufferMap &, CloneList *) const; /// save timestamp and checksum of the given file. void saveCheckSum() const; /// read a new file