Skip to content

Commit be2bb84

Browse files
authored
Merge pull request #8 from akyrtzi/out-of-date-notifications
[IndexDatastore] For the out-of-date trigger notifications report all the out-of-date files without any coalescing
2 parents bbe9a1c + 327d89e commit be2bb84

File tree

3 files changed

+42
-17
lines changed

3 files changed

+42
-17
lines changed

include/IndexStoreDB/Index/IndexSystemDelegate.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace index {
2727
class OutOfDateTriggerHint {
2828
public:
2929
virtual ~OutOfDateTriggerHint() {}
30+
virtual std::string originalFileTrigger() = 0;
3031
virtual std::string description() = 0;
3132

3233
private:
@@ -44,6 +45,7 @@ class DependentFileOutOfDateTriggerHint : public OutOfDateTriggerHint {
4445
return std::make_shared<DependentFileOutOfDateTriggerHint>(filePath);
4546
}
4647

48+
virtual std::string originalFileTrigger() override;
4749
virtual std::string description() override;
4850
};
4951

@@ -59,6 +61,7 @@ class DependentUnitOutOfDateTriggerHint : public OutOfDateTriggerHint {
5961
return std::make_shared<DependentUnitOutOfDateTriggerHint>(unitName, std::move(depHint));
6062
}
6163

64+
virtual std::string originalFileTrigger() override;
6265
virtual std::string description() override;
6366
};
6467

lib/Index/IndexDatastore.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,23 @@ class IndexDatastoreImpl {
155155
};
156156

157157
class UnitMonitor {
158+
struct OutOfDateTrigger {
159+
OutOfDateTriggerHintRef hint;
160+
sys::TimeValue outOfDateModTime;
161+
162+
std::string getTriggerFilePath() const {
163+
return hint->originalFileTrigger();
164+
}
165+
};
166+
158167
std::weak_ptr<StoreUnitRepo> UnitRepo;
159168
IDCode UnitCode;
160169
std::string UnitName;
161170
sys::TimeValue ModTime;
162171

163172
mutable llvm::sys::Mutex StateMtx;
164-
Optional<sys::TimeValue> OutOfDateModTime;
165-
OutOfDateTriggerHintRef OutOfDateHint;
173+
/// Map of out-of-date file path to its associated info.
174+
StringMap<OutOfDateTrigger> OutOfDateTriggers;
166175

167176
public:
168177
UnitMonitor(std::shared_ptr<StoreUnitRepo> unitRepo);
@@ -178,8 +187,7 @@ class UnitMonitor {
178187
StringRef getUnitName() const { return UnitName; }
179188
sys::TimeValue getModTime() const { return ModTime; }
180189

181-
Optional<sys::TimeValue> getOutOfDateModTime() const;
182-
OutOfDateTriggerHintRef getOutOfDateHint() const { return OutOfDateHint; }
190+
std::vector<OutOfDateTrigger> getOutOfDateTriggers() const;
183191

184192
void checkForOutOfDate(sys::TimeValue outOfDateModTime, StringRef filePath, bool synchronous=false);
185193
void markOutOfDate(sys::TimeValue outOfDateModTime, OutOfDateTriggerHintRef hint, bool synchronous=false);
@@ -584,12 +592,11 @@ void UnitMonitor::initialize(IDCode unitCode,
584592
this->ModTime = modTime;
585593
for (IDCode unitDepCode : userUnitDepends) {
586594
if (auto depMonitor = unitRepo->getUnitMonitor(unitDepCode)) {
587-
if (auto optDepOutOfDateTime = depMonitor->getOutOfDateModTime()) {
588-
if (optDepOutOfDateTime.getValue() > modTime) {
589-
markOutOfDate(optDepOutOfDateTime.getValue(),
595+
for (const auto &trigger : depMonitor->getOutOfDateTriggers()) {
596+
if (trigger.outOfDateModTime > modTime) {
597+
markOutOfDate(trigger.outOfDateModTime,
590598
DependentUnitOutOfDateTriggerHint::create(depMonitor->getUnitName(),
591-
depMonitor->getOutOfDateHint()));
592-
return;
599+
trigger.hint));
593600
}
594601
}
595602
}
@@ -609,26 +616,33 @@ void UnitMonitor::initialize(IDCode unitCode,
609616

610617
UnitMonitor::~UnitMonitor() {}
611618

612-
Optional<sys::TimeValue> UnitMonitor::getOutOfDateModTime() const {
619+
std::vector<UnitMonitor::OutOfDateTrigger> UnitMonitor::getOutOfDateTriggers() const {
613620
sys::ScopedLock L(StateMtx);
614-
return OutOfDateModTime;
621+
std::vector<OutOfDateTrigger> triggers;
622+
for (const auto &entry : OutOfDateTriggers) {
623+
triggers.push_back(entry.getValue());
624+
}
625+
return triggers;
615626
}
616627

617628
void UnitMonitor::checkForOutOfDate(sys::TimeValue outOfDateModTime, StringRef filePath, bool synchronous) {
618629
sys::ScopedLock L(StateMtx);
619-
if (OutOfDateModTime.hasValue())
620-
return; // already marked as out-of-date.
630+
auto findIt = OutOfDateTriggers.find(filePath);
631+
if (findIt != OutOfDateTriggers.end() && findIt->getValue().outOfDateModTime >= outOfDateModTime) {
632+
return; // already marked as out-of-date related to this trigger file.
633+
}
621634
if (ModTime < outOfDateModTime)
622635
markOutOfDate(outOfDateModTime, DependentFileOutOfDateTriggerHint::create(filePath), synchronous);
623636
}
624637

625638
void UnitMonitor::markOutOfDate(sys::TimeValue outOfDateModTime, OutOfDateTriggerHintRef hint, bool synchronous) {
626639
{
627640
sys::ScopedLock L(StateMtx);
628-
if (OutOfDateModTime.hasValue())
629-
return; // already marked as out-of-date.
630-
this->OutOfDateModTime = outOfDateModTime;
631-
this->OutOfDateHint = hint;
641+
OutOfDateTrigger trigger{ hint, outOfDateModTime};
642+
auto &entry = OutOfDateTriggers[trigger.getTriggerFilePath()];
643+
if (entry.outOfDateModTime >= outOfDateModTime)
644+
return; // already marked as out-of-date related to this trigger file.
645+
entry = trigger;
632646
}
633647
if (auto localUnitRepo = UnitRepo.lock())
634648
localUnitRepo->onUnitOutOfDate(UnitCode, UnitName, outOfDateModTime, hint, synchronous);

lib/Index/IndexSystem.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,18 @@ bool IndexSystemImpl::foreachFileIncludedByFile(StringRef SourcePath,
525525

526526
void OutOfDateTriggerHint::_anchor() {}
527527

528+
std::string DependentFileOutOfDateTriggerHint::originalFileTrigger() {
529+
return FilePath;
530+
}
531+
528532
std::string DependentFileOutOfDateTriggerHint::description() {
529533
return FilePath;
530534
}
531535

536+
std::string DependentUnitOutOfDateTriggerHint::originalFileTrigger() {
537+
return DepHint->originalFileTrigger();
538+
}
539+
532540
std::string DependentUnitOutOfDateTriggerHint::description() {
533541
std::string desc;
534542
llvm::raw_string_ostream OS(desc);

0 commit comments

Comments
 (0)