[PEAK] Re: trellis.Set.discard

Phillip J. Eby pje at telecommunity.com
Mon Nov 3 13:03:33 EST 2008


At 12:58 AM 11/1/2008 -0400, Phillip J. Eby wrote:
>At 05:27 AM 11/1/2008 +0200, Sergey Schetinin wrote:
>>Sorry to bother you if this was answered already, but that will only
>>fix the readonly issue, right?
>>
>>This one:
>>
>>class C(Component):
>>     x = attr()
>>     @maintain
>>     def rule(self):
>>         self.x = 10
>>
>>@atomically
>>def test():
>>     C().x = 1
>>
>>and the new discrete rules not resetting immediately after init are
>>still outstanding, correct?
>
>Correct.
>
>
>>Any decision on those?
>
>I suppose it might work to have new cells' _finish() methods called 
>at the end of a component creation "transaction".  That would fix 
>both problems, I think.  (Though I'm not sure it would work 
>correctly for new discretes with active readers, as a changed() call 
>occurs in that case, and would result in some of the newly scheduled 
>cells being recalculated.)
>
>I'll need to think about it some more when I go back to working on this.

Okay, I'm working on this now, so let's think about it.  ;-)

If we _finish() all cells at the end of this "pre-transaction", then 
cells set as part of initialization will become writable again, which 
is good.  Discrete cells (whether rule or value-based) will also 
reset their values, and mark themselves as changed.

By itself, that seems okay and correct.  Now let's consider what 
happens if the value was read by a cell within the 
pre-transaction.  I think we can establish that this is also safe.

Consider that during a pre-transaction, a new cell's value can only 
read be read by another new cell.  This is because by definition, the 
pre-transaction must occur within a single rule execution (or 
non-rule code), and thus only uninitialized rules may be run.  (A new 
cell's value can be set, however, by either the calling rule or by a new rule.)

 From this it follows that the only rules that can be re-run by 
resetting a new discrete cell after the pre-transaction, are rules 
which cannot yet have run in the overall transaction.  Thus, the cell 
value reset simply leads to the rule being scheduled to execute later 
within the current transaction -- thereby allowing it to correctly 
see the reset value.

Okay, I think this will work, then.  I do need to verify the current 
usage of _finish() does not do anything else that might conflict, and 
then make _finish part of the AbstractCell class (so that e.g. 
Constants don't have problems).




More information about the PEAK mailing list