Changeset b42454569f06…
Parent dbb7d7a6ea5f…
by
Changes to one file · Browse files at b42454569f06 Showing diff from parent dbb7d7a6ea5f Diff from another changeset...
@@ -31,71 +31,89 @@ static std::list<Dirstatecache::E> _cache;
Iter iter = _cache.begin();
-
for (;iter != _cache.end(); ++iter)
{
if (hgroot == iter->hgroot)
break;
}
- bool isnew = false;
+ Winstat stat;
+ std::string path = hgroot + "\\.hg\\dirstate";
+
+ unsigned tc = GetTickCount();
+ bool new_stat = false;
if (iter == _cache.end())
{
+ if (stat.lstat(path.c_str()) != 0)
+ {
+ TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") failed");
+ return 0;
+ }
+ TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") ok ");
+ new_stat = true;
+
if (_cache.size() >= 10)
{
- TDEBUG_TRACE("Dirstatecache::get: dropping " << _cache.back().hgroot);
+ TDEBUG_TRACE("Dirstatecache::get: dropping "
+ << _cache.back().hgroot);
delete _cache.back().dstate;
_cache.back().dstate = 0;
_cache.pop_back();
}
+
E e;
e.hgroot = hgroot;
_cache.push_front(e);
iter = _cache.begin();
- isnew = true;
+ iter->tickcount = tc;
}
- unsigned tc = GetTickCount();
-
- std::string path = hgroot + "\\.hg\\dirstate";
-
- Winstat stat;
-
- bool stat_done = false;
-
- if (isnew || (tc - iter->tickcount) > 500)
+ if (!new_stat && tc - iter->tickcount > 500)
{
if (0 != stat.lstat(path.c_str()))
{
TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") failed");
+ TDEBUG_TRACE("Dirstatecache::get: dropping " << iter->hgroot);
+ delete iter->dstate;
+ iter->dstate = 0;
+ _cache.erase(iter);
return 0;
}
iter->tickcount = tc;
- stat_done = true;
TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") ok ");
+ new_stat = true;
}
- if ( stat_done &&
- (iter->dstate_mtime != stat.mtime
- || iter->dstate_size != stat.size) )
+ if (iter->dstate)
{
- iter->dstate_mtime = stat.mtime;
- iter->dstate_size = stat.size;
- if (iter->dstate) {
- delete iter->dstate;
- iter->dstate = 0;
- TDEBUG_TRACE("Dirstatecache::get: refreshing " << hgroot);
- } else {
- TDEBUG_TRACE("Dirstatecache::get: reading " << hgroot);
+ if (!new_stat)
+ return iter->dstate;
+
+ if (iter->dstate_mtime == stat.mtime
+ && iter->dstate_size == stat.size)
+ {
+ return iter->dstate;
}
- unsigned tc0 = GetTickCount();
- iter->dstate = Dirstate::read(path).release();
- unsigned tc1 = GetTickCount();
- unsigned delta = tc1 - tc0;
- TDEBUG_TRACE("Dirstatecache::get: read done in " << delta << " ticks, "
- << _cache.size() << " repos in cache");
+
+ TDEBUG_TRACE("Dirstatecache::get: refreshing " << hgroot);
+ delete iter->dstate;
+ iter->dstate = 0;
+ }
+ else
+ {
+ TDEBUG_TRACE("Dirstatecache::get: reading " << hgroot);
}
+ unsigned tc0 = GetTickCount();
+ iter->dstate = Dirstate::read(path).release();
+ unsigned tc1 = GetTickCount();
+ unsigned delta = tc1 - tc0;
+ TDEBUG_TRACE("Dirstatecache::get: read done in " << delta << " ticks, "
+ << _cache.size() << " repos in cache");
+
+ iter->dstate_mtime = stat.mtime;
+ iter->dstate_size = stat.size;
+
return iter->dstate;
}
|
Loading...