On Mon, Oct 22, 2012 at 2:17 AM, Clément Bera <clement.bera@inria.fr> wrote:
Hello,
I don't understand something on BlockClosure>>ensure:. Why does it use 'self valueNoContextSwitch' and not 'self value' ? In which case is there an issue ?
Prior to my closure implementation BlockContext>>value[:value:*] was not a context switch point. So to preserve the threading semantics of ensure: we implemented ensure: in terms of BlockClosure>>valueNoContextSwitch, which is not a context-switch point, as opposed to BlockClosure>>value[:value:*]. The context switch points in the VM are non-primitive sends (or failing primitives, i.e. full method activation), backward branches, the Process primitives suspend, resume, signal and wait (and CrtiticalSection/Mutex enter and exit) and block evaluation.
Thank you for any answers
BlockClosure>>ensure: is implemented this way :
ensure: aBlock "Evaluate a termination block after evaluating the receiver, regardless of whether the receiver's evaluation completes. N.B. This method is *not* implemented as a primitive. Primitive 198 always fails. The VM uses prim 198 in a context's method as the mark for an ensure:/ifCurtailed: activation."
| complete returnValue | <primitive: 198> returnValue := *self valueNoContextSwitch*. complete ifNil:[ complete := true. aBlock value. ]. ^ returnValue
-- best, Eliot