From: Richard Heck Date: Wed, 21 Dec 2011 15:08:26 +0000 (+0000) Subject: Backport fix for #7923: Don't clone all the children on autosave. X-Git-Tag: 2.0.3~105 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=c9dab05dc9753bccee2a044291c536389526af68;p=features.git Backport fix for #7923: Don't clone all the children on autosave. We split Buffer::clone() into various routines that know whether to clone the children. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@40536 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 7a08680807..cf2646caff 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -459,13 +459,13 @@ Buffer::~Buffer() } -Buffer * Buffer::clone() const +Buffer * Buffer::cloneFromMaster() const { BufferMap bufmap; cloned_buffers.push_back(new CloneList()); CloneList * clones = cloned_buffers.back(); - masterBuffer()->clone(bufmap, clones); + masterBuffer()->cloneWithChildren(bufmap, clones); // make sure we got cloned BufferMap::const_iterator bit = bufmap.find(this); @@ -476,7 +476,7 @@ Buffer * Buffer::clone() const } -void Buffer::clone(BufferMap & bufmap, CloneList * clones) const +void Buffer::cloneWithChildren(BufferMap & bufmap, CloneList * clones) const { // have we already been cloned? if (bufmap.find(this) != bufmap.end()) @@ -499,10 +499,10 @@ void Buffer::clone(BufferMap & bufmap, CloneList * clones) const dit.setBuffer(buffer_clone); Buffer * child = const_cast(it->second.second); - child->clone(bufmap, clones); - BufferMap::iterator it = bufmap.find(child); - LASSERT(it != bufmap.end(), continue); - Buffer * child_clone = it->second; + child->cloneWithChildren(bufmap, clones); + BufferMap::iterator const bit = bufmap.find(child); + LASSERT(bit != bufmap.end(), continue); + Buffer * child_clone = bit->second; Inset * inset = dit.nextInset(); LASSERT(inset && inset->lyxCode() == INCLUDE_CODE, continue); @@ -517,6 +517,18 @@ void Buffer::clone(BufferMap & bufmap, CloneList * clones) const } +Buffer * Buffer::cloneBufferOnly() const { + cloned_buffers.push_back(new CloneList()); + CloneList * clones = cloned_buffers.back(); + Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this); + clones->insert(buffer_clone); + buffer_clone->d->clone_list_ = clones; + // we won't be cloning the children + buffer_clone->d->children_positions.clear(); + return buffer_clone; +} + + bool Buffer::isClone() const { return d->cloned_buffer_; diff --git a/src/Buffer.h b/src/Buffer.h index d230ec158e..a0ac56b1b5 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -152,8 +152,11 @@ public: /// Destructor ~Buffer(); - /// - Buffer * clone() const; + /// Clones the entire structure of which this Buffer is part, starting + /// with the master and cloning all the children, too. + Buffer * cloneFromMaster() const; + /// Just clones this single Buffer. For autosave. + Buffer * cloneBufferOnly() const; /// bool isClone() const; @@ -216,7 +219,7 @@ private: /// typedef std::map BufferMap; /// - void clone(BufferMap &, CloneList *) const; + void cloneWithChildren(BufferMap &, CloneList *) const; /// save timestamp and checksum of the given file. void saveCheckSum() const; /// read a new file diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 81354f1949..58b71c41cd 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1558,7 +1558,7 @@ void GuiView::autoSave() #if (QT_VERSION >= 0x040400) GuiViewPrivate::busyBuffers.insert(buffer); QFuture f = QtConcurrent::run(GuiViewPrivate::autosaveAndDestroy, - buffer, buffer->clone()); + buffer, buffer->cloneBufferOnly()); d.autosave_watcher_.setFuture(f); #else buffer->autoSave(); @@ -3057,7 +3057,7 @@ bool GuiView::GuiViewPrivate::asyncBufferProcessing( QFuture f = QtConcurrent::run( asyncFunc, used_buffer, - used_buffer->clone(), + used_buffer->cloneFromMaster(), format); setPreviewFuture(f); last_export_format = used_buffer->params().bufferFormat(); diff --git a/status.20x b/status.20x index aed1009ea0..8969def0c6 100644 --- a/status.20x +++ b/status.20x @@ -32,6 +32,8 @@ What's new - New layout and template file for articles in the Journal of the Acoustical Society of America (JASA). +- Speed up autosave a bit by not cloning child documents (bug 7923). + * TEX2LYX IMPROVEMENTS