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 ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. _______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project