From bd826dae676b0f837de93c403dd1440c4c543f80 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Sun, 20 Nov 2011 18:56:36 +0000 Subject: [PATCH] New attempt to fix Pavel's crash, this modifies r40206. The global list of cloned buffers was a bad idea. We don't have multiple export threads, but we can have multiple autosave threads. So now we keep more than one of these lists at the same time, and each cloned buffer has a pointer to the relevant list. Note that this would make multiple export possible, if we wanted to do that at some time. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@40229 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Buffer.cpp | 34 +++++++++++++++++----------------- src/Buffer.h | 4 +++- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index d01ff7bce8..3767a8eb35 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -140,11 +140,11 @@ void showPrintError(string const & name) Alert::error(_("Print document failed"), str); } -/// a list of Buffers we cloned -set cloned_buffer_list; +} // namespace anon -} // namespace anon +// A storehouse for the cloned buffers. +list cloned_buffers; class Buffer::Impl @@ -298,6 +298,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; @@ -333,8 +335,8 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, read_only(readonly_), filename(file), file_fully_loaded(false), toc_backend(owner), macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0), undo_(*owner), bibinfo_cache_valid_(false), - bibfile_cache_valid_(false), cloned_buffer_(cloned_buffer), - doing_export(false), parent_buffer(0) + bibfile_cache_valid_(false), cloned_buffer_(cloned_buffer), + clone_list_(0), doing_export(false), parent_buffer(0) { if (!cloned_buffer_) { temppath = createBufferTmpDir(); @@ -393,13 +395,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? @@ -442,25 +444,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; - // record the list of cloned buffers - cloned_buffer_list.clear(); - 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()) @@ -468,6 +466,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 @@ -481,7 +481,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 it = bufmap.find(child); LASSERT(it != bufmap.end(), continue); Buffer * child_clone = it->second; diff --git a/src/Buffer.h b/src/Buffer.h index 01d842b446..50c02b4dc6 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -75,6 +75,8 @@ class FileNameList; class Buffer; typedef std::list ListOfBuffers; +/// a list of Buffers we cloned +typedef std::set CloneList; /** The buffer object. @@ -214,7 +216,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 -- 2.39.5