]> git.lyx.org Git - features.git/commitdiff
New attempt to fix Pavel's crash, this modifies r40205 and r40207.
authorRichard Heck <rgheck@comcast.net>
Sun, 20 Nov 2011 18:49:05 +0000 (18:49 +0000)
committerRichard Heck <rgheck@comcast.net>
Sun, 20 Nov 2011 18:49:05 +0000 (18:49 +0000)
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/trunk@40227 a592a061-630c-0410-9148-cb99ea01b6c8

src/Buffer.cpp
src/Buffer.h

index 0badaae88cc076e72d4a67cde71c5fbdb3c5923d..8abdcc8632106ce6fef8eb20fdf3a76b83556d22 100644 (file)
@@ -139,11 +139,11 @@ void showPrintError(string const & name)
        Alert::error(_("Print document failed"), str);
 }
 
-/// a list of Buffers we cloned
-set<Buffer *> cloned_buffer_list;
+} // namespace anon
 
 
-} // namespace anon
+// A storehouse for the cloned buffers.
+list<CloneList> cloned_buffers;
 
 
 class Buffer::Impl
@@ -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<Buffer *>(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<Buffer *>(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;
index bf2a9ead6baf380f954f6f4575e2d8ad4abeb2a0..0c15c0e2d262271b0cf47d0266c342a4b430edea 100644 (file)
@@ -79,6 +79,8 @@ class PreviewLoader;
 
 class Buffer;
 typedef std::list<Buffer *> ListOfBuffers;
+/// a list of Buffers we cloned
+typedef std::set<Buffer *> CloneList;
 
 
 /** The buffer object.
@@ -230,7 +232,7 @@ private:
        ///
        typedef std::map<Buffer const *, Buffer *> 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