<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Calibri Light";
        panose-1:2 15 3 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing
        {mso-style-priority:1;
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi Juan,</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I very much like your simplifying the code opening a debugger :)</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I'm still just skimming the surface of the UI implementation but I'd like to ask a few questions:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(1) why is there Object >> #runningWorld </p>
<p class="MsoNormal">- wouldn't sending `UISupervisor runningWorld` instead of `true runningWorld` be sufficient e.g. in Debugger >> #openWindowLabel:usePreDebugWindow:preDebugMessage:?</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(2) Why not define UISupervisor >> runningWorld via #animatedUIOf: to avoid code duplicity?</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">UISupervisor >> runningWorld</p>
<p class="MsoNormal">                "</p>
<p class="MsoNormal">                UISupervisor runningWorld</p>
<p class="MsoNormal">                [ UISupervisor runningWorld print ] fork</p>
<p class="MsoNormal">                "</p>
<p class="MsoNormal">                ^self animatedUIOf: Processor activeProcess</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(3) I understand your intention when you lowered the former UI process's priority in #spawnNewMorphicProcessFor: by one; I believe it was in response to this example:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[1/0] fork.</p>
<p class="MsoNormal">5 seconds asDelay wait.</p>
<p class="MsoNormal">self error: 'error'</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I've been wondering whether it's still relevant after your most recent changes - and unfortunately it seems that it is: changing the former UI process's priority back to the active priority will cause redraw glitches (e.g. Transcript background
 color in Dark mode won't display properly). </p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">However, there seems to be a very similar redraw blip *despite* the lower priority tweak when running e.g.</p>
<p class="MsoNormal">[1/0] fork.</p>
<p class="MsoNormal">[1/0] fork</p>
<p class="MsoNormal">... the Transcript window won't get redrawn correctly in the Dark mode: it won't change its background color properly. It puzzles me why the Transcript window is the only one affected.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What I'm trying to figure out is: if the computation carried out by this former UI process involves references to Processor activePriority the priority-lowering tweak may change the semantics of a computation involving forking processes
 at different relative priorities (in other words changing the priority of the process in the middle of the computation by an *unrelated* "outsider" process feels dangerous); just a theoretical idea though, unfortunately I don't have any practical example or
 any further suggestion; I'll return to this later after some more educating myself :)</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">About the processPreemptionYields flag:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> I think it would be important to understand why would someone want #processPreemptionYields = false. Their reasons for requesting a process to never yield to others of same priority (even if some higher process wakes up in between) may
 also mean they don't want new UI processes to be started so lightly.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here's Eliot's explanation why he chose #processPreemptionYields = false over the previous functionality: https://forum.world.st/about-signal-tp5109735p5109862.html</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My understanding is he simply thinks #processPreemptionYields = true produces an inconsistent/erroneous behavior in the sense that unless a process *explicitly* yields control it should stay in control (unless preempted by a higher priority
 process in which case it should get back control once the higher priority process gives up control, i.e. stay at the front of the run queue).
</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In case of Squeak (which is on #processPreemptionYields = false) each world cycle does contain an explicit yield anyway so opening each debugger in a new UI doesn't seem to clash with this stricter cooperative-within-priorities scheduling
 approach imho :)</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">A while ago I asked Marcel about the preemption modes and the answer was (roughly) that #processPreemptionYields = false offers more predictability (understandably) plus something about thread-safe-ness of Morphic structures (which is still
 way beyond my skills level).</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Is there a reason why you'd prefer #processPreemptionYields = true or is it just for historic reasons? ("why fix something that works" type of situation? :) )</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks again very much for discussing these issues!</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Best regards,</p>
<p class="MsoNormal">Jaromir</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNoSpacing"><span lang="CS">--</span></p>
<p class="MsoNoSpacing"><strong><span style="font-family:"Calibri Light",sans-serif;color:#333333;font-weight:normal">Jaromír Matas</span></strong><span style="font-family:"Calibri Light",sans-serif;color:#555555"><o:p></o:p></span></p>
<p class="MsoNoSpacing"><span style="font-family:"Calibri Light",sans-serif;color:#2E75B6">mail@jaromir.net</span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Juan Vuletich <juan@cuis.st><br>
<b>Sent:</b> Thursday, August 4, 2022 2:46:17 PM<br>
<b>To:</b> Discussion of Cuis Smalltalk <cuis-dev@lists.cuis.st><br>
<b>Cc:</b> Jaromir Matas <mail@jaromir.net><br>
<b>Subject:</b> Re: [Cuis-dev] FW: FW: FW: Freezing UI - can't interrupt via Alt+.</font>
<div> </div>
</div>
<div style="background-color:#ffffff">Hi Jaromir,<br>
<br>
On 8/2/2022 7:05 PM, Jaromir Matas via Cuis-dev wrote:
<blockquote type="cite">
<meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
<style>
<!--
@font-face
        {font-family:"Cambria Math"}
@font-face
        {font-family:Calibri}
@font-face
        {font-family:"Calibri Light"}
p.x_MsoNormal, li.x_MsoNormal, div.x_MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
a:link, span.x_MsoHyperlink
        {color:blue;
        text-decoration:underline}
pre
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black}
p.x_MsoNoSpacing, li.x_MsoNoSpacing, div.x_MsoNoSpacing
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif}
span.x_HTMLPreformattedChar
        {font-family:"Courier New";
        color:black}
.x_MsoChpDefault
        {}
@page WordSection1
        {margin:1.0in 1.0in 1.0in 1.0in}
div.x_WordSection1
        {}
-->
</style>
<div class="x_WordSection1">
<p class="x_MsoNormal">Hi Juan,</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">I'd like to share my analysis regarding the dependence of the solution presented in my previous message on the choice of the preemption mode (i.e. whether preempting a process involves an implicit yield like in Cuis/Pharo or without the
 yield like in Squeak, indicated by #processPreemptionYields value true or false, which is in fact Eliot's improvement over the Blue book applied in Squeak currently).</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">I wrote:</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">> [...] the preemption mode is critical in this case so I'll have to figure out how to make this work for Squeak :D Or better yet how to make it independent of the processPreemptionYields setting.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Now I think the behavior *is* supposed to be different for different preemption modes, so there's nothing different to do for Squeak. Compare the following examples:</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">[1/0] fork.</p>
<p class="x_MsoNormal">Processor yield.</p>
<p class="x_MsoNormal">[ 10000 factorial ] repeat</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">[1/0] fork.</p>
<p class="x_MsoNormal">[ 10000 factorial. Processor yield ] repeat</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">In the first example the UI places the [1/0] process in the run queue and continues to execute the #yield which allows the [1/0] process run, encounter the error, open a new UI, place it in the run queue behind the former UI and suspend
 itself. Then the former UI resumes again and keeps computing factorials in the repeat cycle.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Now comes the crucial point: in Squeak with processPreemptionYields = false the former UI keeps computing factorials and never lets the new UI take over (even when interrupted) and hence no debugger opens, while in Cuis where processPreemptionYields
 = true the former UI computing the factorials is interrupted from time to time by a higher priority process (time watcher?) which causes the former UI do implicit yield and move to the end of the run queue which allows the new UI do one cycle, open a debugger
 and just keep the UI responsive.</p>
</div>
</blockquote>
<br>
Exactly.<br>
<br>
<blockquote type="cite">
<div class="x_WordSection1">
<p class="x_MsoNormal">In my opinion both behaviors are correct and should be expected based on the choice of the preemption mode.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">In the second example the #yield inside the repeat loop does explicitly more or less what the implicit yield does when processPreemptionYields = true so the resulting behavior is the same regardless of the preemption mode.</p>
</div>
</blockquote>
<br>
Right. In my (just sent) answer to the previous email I also said that if the user set #processPreemptionYields = false, they should have their reasons.<br>
<br>
<blockquote type="cite">
<div class="x_WordSection1">
<p class="x_MsoNormal">One more point: when you wrap both examples in fork, i.e. when you run the examples in a non-UI process the behavior is identical as when they run in the UI; I guess this is important.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">[ [1/0] fork.</p>
<p class="x_MsoNormal">Processor yield.</p>
<p class="x_MsoNormal">[ 10000 factorial] repeat] fork</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">[ [1/0] fork.</p>
<p class="x_MsoNormal">[ 10000 factorial. Processor yield] repeat] fork</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Thanks for your time; I'm sure nothing of it is news for you but at least for me looking at it from the UI angle has been an interesting and sometimes surprising exercise :)</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Thanks again,</p>
<p class="x_MsoNormal">Jaromir</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNoSpacing">--</p>
<p class="x_MsoNoSpacing"><strong><span style="font-family:"Calibri Light",sans-serif; color:rgb(51,51,51); font-weight:normal">Jaromír Matas</span></strong><span style="font-family:"Calibri Light",sans-serif; color:rgb(85,85,85)"></span></p>
<p class="x_MsoNoSpacing"><span style=""><a class="x_moz-txt-link-abbreviated" href="mailto:mail@jaromir.net">mail@jaromir.net</a></span></p>
<br>
</div>
</blockquote>
<br>
The truth is that "in theory" there was nothing new, i.e. I already knew the specification for the behaviors. But "in practice", many of these examples were surprising to me, and they took quite a bit of thought to understand them, and to see that they were
 actually following the specification. And then, the important part: To decide if the observed (and now understood) behavior is what we want, or if what we expected before running the example is what should happen. This triggers the hard work, the new insights,
 and the better code.<br>
<br>
Thank you!<br>
<br>
<pre class="x_moz-signature" cols="72">-- 
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich</pre>
</div>
</body>
</html>