Fix some bugs in the bibinfo caching mechanism. Comments to follow.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@35112 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2010-08-10 14:12:48 +00:00
parent 0ac2636d28
commit 2203d7aa0a
3 changed files with 57 additions and 46 deletions

View File

@ -255,9 +255,9 @@ public:
/// A cache for bibliography info
mutable BiblioInfo bibinfo_;
/// whether the bibinfo cache is valid
bool bibinfo_cache_valid_;
mutable bool bibinfo_cache_valid_;
/// whether the bibfile cache is valid
bool bibfile_cache_valid_;
mutable bool bibfile_cache_valid_;
/// Cache of timestamps of .bib files
map<FileName, time_t> bibfile_status_;
@ -1698,6 +1698,7 @@ void Buffer::getLabelList(vector<docstring> & list) const
void Buffer::updateBibfilesCache(UpdateScope scope) const
{
// FIXME This is probably unnecssary, given where we call this.
// If this is a child document, use the parent's cache instead.
Buffer const * const pbuf = d->parent();
if (pbuf && scope != UpdateChildOnly) {
@ -1714,47 +1715,53 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
bibfiles.begin(),
bibfiles.end());
// the bibinfo cache is now invalid
d->bibinfo_cache_valid_ = false;
} else if (it->lyxCode() == INCLUDE_CODE) {
InsetInclude & inset =
static_cast<InsetInclude &>(*it);
Buffer const * const incbuf = inset.getChildBuffer();
if (!incbuf)
continue;
incbuf->updateBibfilesCache(UpdateChildOnly);
support::FileNameList const & bibfiles =
incbuf->getBibfilesCache(UpdateChildOnly);
if (!bibfiles.empty()) {
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
bibfiles.begin(),
bibfiles.end());
// the bibinfo cache is now invalid
d->bibinfo_cache_valid_ = false;
}
}
}
d->bibfile_cache_valid_ = true;
}
void Buffer::invalidateBibinfoCache()
{
d->bibinfo_cache_valid_ = false;
}
void Buffer::invalidateBibfileCache()
void Buffer::invalidateBibinfoCache() const
{
d->bibinfo_cache_valid_ = false;
// also invalidate the cache for the parent buffer
Buffer const * const pbuf = d->parent();
if (pbuf)
pbuf->invalidateBibinfoCache();
}
void Buffer::invalidateBibfileCache() const
{
d->bibfile_cache_valid_ = false;
invalidateBibinfoCache();
d->bibinfo_cache_valid_ = false;
// also invalidate the cache for the parent buffer
Buffer const * const pbuf = d->parent();
if (pbuf)
pbuf->invalidateBibfileCache();
}
support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const
{
// If this is a child document, use the parent's cache instead.
Buffer const * const pbuf = d->parent();
if (pbuf && scope != UpdateChildOnly)
// FIXME This is probably unnecessary, given where we call this.
// If this is a child document, use the master's cache instead.
Buffer const * const pbuf = masterBuffer();
if (pbuf != this && scope != UpdateChildOnly)
return pbuf->getBibfilesCache();
if (!d->bibfile_cache_valid_)
@ -1766,28 +1773,28 @@ support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const
BiblioInfo const & Buffer::masterBibInfo() const
{
// if this is a child document and the parent is already loaded
// use the parent's list instead [ale990412]
Buffer const * const tmp = masterBuffer();
LASSERT(tmp, /**/);
if (tmp != this)
return tmp->masterBibInfo();
return localBibInfo();
}
BiblioInfo const & Buffer::localBibInfo() const
{
return d->bibinfo_;
}
void Buffer::checkBibInfoCache() const
{
support::FileNameList const & bibfilesCache = getBibfilesCache();
// use the master's cache
Buffer const * const tmp = masterBuffer();
if (tmp != this) {
tmp->checkBibInfoCache();
return;
}
// this will also reload the cache if it is invalid
support::FileNameList const & bibfiles_cache = getBibfilesCache();
// compare the cached timestamps with the actual ones.
support::FileNameList::const_iterator ei = bibfilesCache.begin();
support::FileNameList::const_iterator en = bibfilesCache.end();
support::FileNameList::const_iterator ei = bibfiles_cache.begin();
support::FileNameList::const_iterator en = bibfiles_cache.end();
for (; ei != en; ++ ei) {
time_t lastw = ei->lastModified();
time_t prevw = d->bibfile_status_[*ei];
@ -1797,17 +1804,22 @@ void Buffer::checkBibInfoCache() const
}
}
// FIXME Don't do this here, but instead gather them as we go through
// updateBuffer().
// if not valid, then reload the info
if (!d->bibinfo_cache_valid_) {
d->bibinfo_.clear();
for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
it->fillWithBibKeys(d->bibinfo_, it);
fillWithBibKeys(d->bibinfo_);
d->bibinfo_cache_valid_ = true;
}
}
void Buffer::fillWithBibKeys(BiblioInfo & keys) const
{
for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
it->fillWithBibKeys(keys, it);
}
bool Buffer::isDepClean(string const & name) const
{
DepClean::const_iterator const it = d->dep_clean.find(name);
@ -3705,7 +3717,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
DocumentClass const & textclass = master->params().documentClass();
// do this only if we are the top-level Buffer
if (scope != UpdateMaster || master == this)
if (master == this)
checkBibInfoCache();
// keep the buffers to be children in this set. If the call from the

View File

@ -346,19 +346,20 @@ public:
/// we do not have to read the file over and over.
/// Calling this method invalidates the cache and so requires a
/// re-read.
void invalidateBibinfoCache();
void invalidateBibinfoCache() const;
/// This invalidates the cache of files we need to check.
void invalidateBibfileCache();
void invalidateBibfileCache() const;
/// Updates the cached bibliography information.
/// Note that you MUST call this method to update the cache. It will
/// not happen otherwise. (Currently, it is called at the start of
/// updateBuffer() and from GuiCitation.)
/// Note that this operates on the master document.
void checkBibInfoCache() const;
/// \return the bibliography information for this buffer's master,
/// or just for it, if it isn't a child.
BiblioInfo const & masterBibInfo() const;
/// \return the bibliography information for this buffer ONLY.
BiblioInfo const & localBibInfo() const;
///
void fillWithBibKeys(BiblioInfo & keys) const;
///
void getLabelList(std::vector<docstring> &) const;

View File

@ -835,12 +835,10 @@ void InsetInclude::validate(LaTeXFeatures & features) const
void InsetInclude::fillWithBibKeys(BiblioInfo & keys,
InsetIterator const & /*di*/) const
{
if (loadIfNeeded()) {
string const included_file = includedFileName(buffer(), params()).absFileName();
Buffer * tmp = theBufferList().getBuffer(FileName(included_file));
BiblioInfo const & newkeys = tmp->localBibInfo();
keys.mergeBiblioInfo(newkeys);
}
Buffer * child = loadIfNeeded();
if (!child)
return;
child->fillWithBibKeys(keys);
}