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
Alert::error(_("Print document failed"), str);
}
Alert::error(_("Print document failed"), str);
}
-/// a list of Buffers we cloned
-set<Buffer *> cloned_buffer_list;
+// A storehouse for the cloned buffers.
+list<CloneList> cloned_buffers;
/// 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_;
/// 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;
/// are we in the process of exporting this buffer?
mutable bool doing_export;
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),
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_) {
doing_export(false), parent_buffer(0)
{
if (!cloned_buffer_) {
if (isClone()) {
// this is in case of recursive includes: we won't try to delete
// ourselves as a child.
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);
// 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?
delete child;
}
// FIXME Do we really need to do this right before we delete d?
Buffer * Buffer::clone() const
{
BufferMap bufmap;
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;
// 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);
-
-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())
{
// have we already been cloned?
if (bufmap.find(this) != bufmap.end())
Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this);
bufmap[this] = buffer_clone;
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
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
dit.setBuffer(buffer_clone);
Buffer * child = const_cast<Buffer *>(it->second.second);
dit.setBuffer(buffer_clone);
Buffer * child = const_cast<Buffer *>(it->second.second);
+ child->clone(bufmap, clones);
BufferMap::iterator const bit = bufmap.find(child);
LASSERT(bit != bufmap.end(), continue);
Buffer * child_clone = bit->second;
BufferMap::iterator const bit = bufmap.find(child);
LASSERT(bit != bufmap.end(), continue);
Buffer * child_clone = bit->second;
class Buffer;
typedef std::list<Buffer *> ListOfBuffers;
class Buffer;
typedef std::list<Buffer *> ListOfBuffers;
+/// a list of Buffers we cloned
+typedef std::set<Buffer *> CloneList;
///
typedef std::map<Buffer const *, Buffer *> BufferMap;
///
///
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
/// save timestamp and checksum of the given file.
void saveCheckSum() const;
/// read a new file