I decided to address something about Cells I recently decided was Not Good:
The echo of a cell (something conceived to permit side-effects outside the model dataflow) is permitted to kick off top-level (if you will) dataflow by setting some c-variable-mediated other slot.
Fine. But echos run immediately after a new value has been assumed by a cell, before propagation to other cells. So what we had was echo-initiated top-level dataflow running to completion before the dataflow being echoed really got very far off the ground. And, yes, some very tricky misbehavior resulted, and I think is responsible for a lot of nasty code in Cells.
Anyway, tonight I hacked a quick single-threading of such things:
(defun (setf md-slot-value) .....<snip>
...unchanged testing for cyclicity....
(let ((absorbed-value (c-absorb-value c new-value))) ;; dicey: decide absorbed-value now or just before setf? ;; ...but we need a value to return even if actual setf will be deferred. ;; (count-it :md-slot-value-setf slot-spec) (if *df-entry* (progn (nconc *df-entry* (list (cons c (cons absorbed-value *cause*)))) absorbed-value) (let ((*df-entry* (list nil))) (c-slot-value-absorb c absorbed-value) (loop for (c-deferred . (deferred-value . echoing-asker)) in (cdr *df-entry*) do (let ((*cause* echoing-asker)) ;; sketchy (c-slot-value-absorb c-deferred deferred-value))) absorbed-value))))))
(defun c-slot-value-absorb (c absorbed-value) (with-dataflow-management (c) (md-slot-value-assume (c-model c) (c-slot-spec c) absorbed-value)))
"absorb"? "assume"? gotta work on that. The light panel still works, but tracing shows not a lot of very challenging cases. RoboCup was the worst stress test Cells has gotten, stumping it easily even after seven years of refinement. I may dust off TeamKenny to see what I can see. I prefer real-world stressors to artifices.
Actually, what I should do is disable all the "m/cmdead" testing, which I believe arose to handle problems caused only by overlapping dataflow steps: some echo would cause some instance (the active player task) to leave the model (supplanted or completed), but already in the call stack was code that was going to be operating on those instances in some way shape or form. So in a mad dash before ILC 2003 I ended up sprinkling "dead" tests about thirty times around the system. My hope is that this new patch will clear the dataflow propagation stack before the echo zaps the instance.
More to come, I guess.
kt