mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +00:00
don't check dependencies until newMetric is called
Before, we checked them during addMetric, and that left us vulnerable link-order errors. With this patch, we wait until someone actually asks for an instance of a metric, and then we check all metrics' dependencies. That way, since the Ride Summary always creates at least one metric, we'll still check the dependencies of them all. We just do it a little later in the program's execution than before.
This commit is contained in:
@@ -114,11 +114,21 @@ class RideMetricFactory {
|
||||
QVector<QString> metricNames;
|
||||
QHash<QString,RideMetric*> metrics;
|
||||
QHash<QString,QVector<QString>*> dependencyMap;
|
||||
bool dependenciesChecked;
|
||||
|
||||
RideMetricFactory() {}
|
||||
RideMetricFactory() : dependenciesChecked(false) {}
|
||||
RideMetricFactory(const RideMetricFactory &other);
|
||||
RideMetricFactory &operator=(const RideMetricFactory &other);
|
||||
|
||||
void checkDependencies() const {
|
||||
if (dependenciesChecked) return;
|
||||
foreach(const QString &dependee, dependencyMap.keys()) {
|
||||
foreach(const QString &dependency, *dependencyMap[dependee])
|
||||
assert(metrics.contains(dependency));
|
||||
}
|
||||
const_cast<RideMetricFactory*>(this)->dependenciesChecked = true;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static RideMetricFactory &instance() {
|
||||
@@ -137,6 +147,7 @@ class RideMetricFactory {
|
||||
|
||||
RideMetric *newMetric(const QString &symbol) const {
|
||||
assert(metrics.contains(symbol));
|
||||
checkDependencies();
|
||||
return metrics.value(symbol)->clone();
|
||||
}
|
||||
|
||||
@@ -147,11 +158,10 @@ class RideMetricFactory {
|
||||
metricNames.append(metric.symbol());
|
||||
if (deps) {
|
||||
QVector<QString> *copy = new QVector<QString>;
|
||||
for (int i = 0; i < deps->size(); ++i) {
|
||||
assert(metrics.contains((*deps)[i]));
|
||||
for (int i = 0; i < deps->size(); ++i)
|
||||
copy->append((*deps)[i]);
|
||||
}
|
||||
dependencyMap.insert(metric.symbol(), copy);
|
||||
dependenciesChecked = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user