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
This commit is contained in:
Richard Heck 2011-12-21 15:08:26 +00:00
parent c59c8ad9f0
commit c9dab05dc9
4 changed files with 29 additions and 12 deletions

View File

@ -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<Buffer *>(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_;

View File

@ -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<Buffer const *, Buffer *> 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

View File

@ -1558,7 +1558,7 @@ void GuiView::autoSave()
#if (QT_VERSION >= 0x040400)
GuiViewPrivate::busyBuffers.insert(buffer);
QFuture<docstring> 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<docstring> f = QtConcurrent::run(
asyncFunc,
used_buffer,
used_buffer->clone(),
used_buffer->cloneFromMaster(),
format);
setPreviewFuture(f);
last_export_format = used_buffer->params().bufferFormat();

View File

@ -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