@@ -155,14 +155,23 @@ class IndexDatastoreImpl {
155
155
};
156
156
157
157
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
+
158
167
std::weak_ptr<StoreUnitRepo> UnitRepo;
159
168
IDCode UnitCode;
160
169
std::string UnitName;
161
170
sys::TimeValue ModTime;
162
171
163
172
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 ;
166
175
167
176
public:
168
177
UnitMonitor (std::shared_ptr<StoreUnitRepo> unitRepo);
@@ -178,8 +187,7 @@ class UnitMonitor {
178
187
StringRef getUnitName () const { return UnitName; }
179
188
sys::TimeValue getModTime () const { return ModTime; }
180
189
181
- Optional<sys::TimeValue> getOutOfDateModTime () const ;
182
- OutOfDateTriggerHintRef getOutOfDateHint () const { return OutOfDateHint; }
190
+ std::vector<OutOfDateTrigger> getOutOfDateTriggers () const ;
183
191
184
192
void checkForOutOfDate (sys::TimeValue outOfDateModTime, StringRef filePath, bool synchronous=false );
185
193
void markOutOfDate (sys::TimeValue outOfDateModTime, OutOfDateTriggerHintRef hint, bool synchronous=false );
@@ -584,12 +592,11 @@ void UnitMonitor::initialize(IDCode unitCode,
584
592
this ->ModTime = modTime;
585
593
for (IDCode unitDepCode : userUnitDepends) {
586
594
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 ,
590
598
DependentUnitOutOfDateTriggerHint::create (depMonitor->getUnitName (),
591
- depMonitor->getOutOfDateHint ()));
592
- return ;
599
+ trigger.hint ));
593
600
}
594
601
}
595
602
}
@@ -609,26 +616,33 @@ void UnitMonitor::initialize(IDCode unitCode,
609
616
610
617
UnitMonitor::~UnitMonitor () {}
611
618
612
- Optional<sys::TimeValue > UnitMonitor::getOutOfDateModTime () const {
619
+ std::vector<UnitMonitor::OutOfDateTrigger > UnitMonitor::getOutOfDateTriggers () const {
613
620
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;
615
626
}
616
627
617
628
void UnitMonitor::checkForOutOfDate (sys::TimeValue outOfDateModTime, StringRef filePath, bool synchronous) {
618
629
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
+ }
621
634
if (ModTime < outOfDateModTime)
622
635
markOutOfDate (outOfDateModTime, DependentFileOutOfDateTriggerHint::create (filePath), synchronous);
623
636
}
624
637
625
638
void UnitMonitor::markOutOfDate (sys::TimeValue outOfDateModTime, OutOfDateTriggerHintRef hint, bool synchronous) {
626
639
{
627
640
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;
632
646
}
633
647
if (auto localUnitRepo = UnitRepo.lock ())
634
648
localUnitRepo->onUnitOutOfDate (UnitCode, UnitName, outOfDateModTime, hint, synchronous);
0 commit comments