suppressCycleWarning

This commit is contained in:
Tony Garnock-Jones 2023-12-03 23:05:49 +01:00
parent 4903bc5149
commit 2f34cfa588
2 changed files with 21 additions and 1 deletions

View File

@ -10,6 +10,7 @@ import * as MapSet from './mapset.js';
export interface ObservingGraph<ObjectId> {
recordObservation(objectId: ObjectId): void;
recordDamage(objectId: ObjectId): void;
suppressCycleWarning(objectId: ObjectId): void;
}
export class Graph<SubjectId, ObjectId> implements ObservingGraph<ObjectId> {
@ -17,6 +18,7 @@ export class Graph<SubjectId, ObjectId> implements ObservingGraph<ObjectId> {
readonly edgesReverse: FlexMap<SubjectId, FlexSet<ObjectId>>;
damagedNodes: FlexSet<ObjectId>;
currentSubjectId: SubjectId | undefined;
cyclicWarningSuppressed: FlexSet<ObjectId> | undefined;
constructor(
public readonly subjectIdCanonicalizer: Canonicalizer<SubjectId>,
@ -65,13 +67,26 @@ export class Graph<SubjectId, ObjectId> implements ObservingGraph<ObjectId> {
return Array.from(subjects);
}
suppressCycleWarning(objectId: ObjectId): void {
if (this.cyclicWarningSuppressed === void 0) {
this.cyclicWarningSuppressed = new FlexSet(this.objectIdCanonicalizer);
}
this.cyclicWarningSuppressed.add(objectId);
}
repairDamage(repairNode: (subjectId: SubjectId) => void) {
let repairedThisRound = new FlexSet(this.objectIdCanonicalizer);
let suppressed = new FlexSet(this.objectIdCanonicalizer);
while (true) {
if (this.cyclicWarningSuppressed !== void 0) {
suppressed = suppressed.union(this.cyclicWarningSuppressed);
this.cyclicWarningSuppressed = void 0;
}
let workSet = this.damagedNodes;
this.damagedNodes = new FlexSet(this.objectIdCanonicalizer);
const alreadyDamaged = workSet.intersect(repairedThisRound);
const alreadyDamaged = workSet.intersect(repairedThisRound).subtract(suppressed);
if (alreadyDamaged.size > 0) {
console.warn('Cyclic dependencies involving', this.formatCycle(alreadyDamaged));
}
@ -105,6 +120,10 @@ export abstract class Cell {
this.__value = initial;
}
suppressCycleWarning() {
this.graph.suppressCycleWarning(this);
}
observe(): unknown {
this.graph.recordObservation(this);
return this.__value;

View File

@ -153,6 +153,7 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
field best: TransportState | null = null;
field rootPeer: Ref | null = null;
dataflow {
best.suppressCycleWarning();
best.value = null;
for (const c of candidates.value) {
best.value = c;