Thanks Levente! Cheers, Alexandre On 3 Mar 2010, at 11:33, Levente Uzonyi wrote:
On Wed, 3 Mar 2010, Stéphane Ducasse wrote:
On Mar 2, 2010, at 10:33 PM, Levente Uzonyi wrote:
On Tue, 2 Mar 2010, Henrik Sperre Johansen wrote:
PS. For the not-so-faint-of-heart, open a Transcript and try evaluating: |proc| proc := [[Transcript show: 'Start!'. ] ensure: [Transcript show: 'Finish!' Processor yield.]] newProcess. proc resume. Processor yield. proc suspend. proc terminate. Why don't we get it printing? Forgot a . there, supposed to be
|proc| proc := [[Transcript show: 'Start!'. ] ensure: [Transcript show: 'Finish!'. Processor yield.]] newProcess. proc resume. Processor yield. proc suspend. proc terminate.
on my machine it prints: *Start!Start!Finish!
The problem occurs because Transcript >> #endEntry (sent from #show:) takes a while to execute, so the process (proc) prints 'Start!', but it gets terminated before execution reaches #resetContents (#reset in Squeak). So 'Start!' is still in the stream. Then our process executes the #ensure: block and it prints 'Start!' and 'Finish!' too.
Thanks for the explanation levente! But I'm still dizzy :) why Transcript show: 'Finish' would also print 'start' ?
Transcript is just a stream. #show: is just a combination of #nextPutAll: and #endEntry. #endEntry displays the contents of the stream and when that's done it removes everything from the stream with #resetContents. #resetContents is never executed, because the process is terminated before that. So the contents of the stream are kept and displayed again later.
Levente
There's worse problem with #ensure: and #terminate is that, a process executing an #ensure: block can be terminated. If you evaluate this code:
| process stage1 stage2 stage3 counter | stage1 := stage2 := stage3 := false. counter := 0. process := [ [ stage1 := true ] ensure: [ stage2 := true. 1000000 timesRepeat: [ counter := counter + 1 ]. stage3 := true ] ] newProcess. process resume. Processor yield. process suspend. process terminate. 1000 milliSeconds asDelay wait. { stage1. stage2. stage3. counter } explore
you will find that stage1 and stage2 is reached as expected, but stage3 is not and counter is less than 1000000. That's because the forked process started evaluating the #ensure: block, but it was terminated by our process.
Is this the expected behavior when sending #terminate to a process which is evaluating an #ensure: block?
Cheers, Balázs & Levente
*yay Henry* *
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
-- _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.