<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Hi Jaromir,<br>
    <br>
    On 1/20/2023 5:08 PM, Jaromir Matas via Cuis-dev wrote:
    <blockquote
cite="mid:PH7PR12MB7987DAB9C52AD004077FB648EEC59@PH7PR12MB7987.namprd12.prod.outlook.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <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;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing
        {mso-style-priority:1;
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";
        color:black;}
.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>
      <div class="WordSection1">
        <p class="MsoNormal">Hi Juan,<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Apologies for my previous message sent
          prematurely.<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Process Browser is checking termination
          status of all processes very often and hence occasionally the
          procedure gets preempted and breaks as you noted in
          #isDeadOrAtEnd comment. The same happens in my #isDone (just
          open an image and a Process Browser and wait – sooner or later
          a debugger pops up with an MNU error inside #isDone. So, the
          idea is to rewrite #isDone to eliminate message sends at
          critical points:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">isDone<o:p></o:p></p>
        <p class="MsoNormal">                "Answer if the receiver has
          no unexecuted code left."<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">                ^pc<o:p></o:p></p>
        <p class="MsoNormal">                                ifNil: [
          true ]<o:p></o:p></p>
        <p class="MsoNormal">                                ifNotNil: [
          :aPC | (self atEnd: aPC) and: [<o:p></o:p></p>
        <p class="MsoNormal">                                               
          sender<o:p></o:p></p>
        <p class="MsoNormal">                                                               
          ifNil: [ true ]<o:p></o:p></p>
        <p class="MsoNormal">                                                               
          ifNotNil: [ :ctx | ctx isDone]]]<o:p></o:p></p>
        <p class="MsoNormal"><span style="color: rgb(143, 170, 220);"><o:p> </o:p></span></p>
        <p class="MsoNormal">It’s similar to your #isDeadOrAtEnd.</p>
      </div>
    </blockquote>
    <br>
    Thanks a lot. This is now at GitHub.<br>
    <br>
    <blockquote
cite="mid:PH7PR12MB7987DAB9C52AD004077FB648EEC59@PH7PR12MB7987.namprd12.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal"><o:p> <br>
          </o:p></p>
        <p class="MsoNormal">Question: in #isDeadOrAtEnd you have a
          block [ :aPC | self atEnd: pc ]. I wonder if you by any chance
          meant [ :aPC | self atEnd: aPC ], i.e. to use block’s argument
          rather than the instance variable? Or maybe it doesn’t make
          any difference, I’m just not sure now.<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    It doesn't make any difference in behavior, AFAIK. WRT style, I'm
    not really sure which is better. Just looked at the bytecodes of
    both options. [ :aPC | self atEnd: aPC ] generates shorter code. I
    think that makes it better.<br>
    <br>
    Thanks!<br>
    <br>
    <blockquote
cite="mid:PH7PR12MB7987DAB9C52AD004077FB648EEC59@PH7PR12MB7987.namprd12.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal">I hope this time it’s ok.<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Best,<o:p></o:p></p>
        <p class="MsoNormal">Jaromir<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div style="border-right: medium none; border-width: 1pt medium
          medium; border-style: solid none none; border-color: rgb(225,
          225, 225) -moz-use-text-color -moz-use-text-color; padding:
          3pt 0in 0in;">
          <p class="MsoNormal"><b>From: </b><a moz-do-not-send="true"
              href="mailto:cuis-dev@lists.cuis.st">Jaromir Matas via
              Cuis-dev</a><br>
            <b>Sent: </b>Thursday, January 19, 2023 12:25<br>
            <b>To: </b><a moz-do-not-send="true"
              href="mailto:juan@cuis.st">Juan Vuletich</a>; <a
              moz-do-not-send="true"
              href="mailto:cuis-dev@lists.cuis.st">
              Discussion of Cuis Smalltalk</a><br>
            <b>Cc: </b><a moz-do-not-send="true"
              href="mailto:mail@jaromir.net">Jaromir Matas</a><br>
            <b>Subject: </b>Re: [Cuis-dev] Follow-up: #terminate and
            #suspend update<o:p></o:p></p>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Hi Juan,<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I’ve observed the debugger to pop up all of
          a sudden a few times when working with the Process Browser.
          The root cause seems to be my #isDone method:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">isDone<o:p></o:p></p>
        <p class="MsoNormal">                "Answer if the receiver has
          no unexecuted code left."<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">                self isDead ifTrue:
          [^true].<o:p></o:p></p>
        <p class="MsoNormal">                self isBottomContext
          ifTrue: [^self atEnd].<o:p></o:p></p>
        <p class="MsoNormal">                self atEnd ifTrue: [^self
          sender isDone].<o:p></o:p></p>
        <p class="MsoNormal">                ^false<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">The second line checks if the sender
          variable is nil and hence the third line assumes the sender is
          not nil – however it may still be nil if the method
          computation is preempted and the higher priority process being
          checked terminates in the meantime.<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Here’s my improved version (also enclosed):<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">isDone<o:p></o:p></p>
        <p class="MsoNormal">                "Answer if the receiver has
          no unexecuted code left."<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">                ^sender ifNil: [self
          isDeadOrAtEnd] ifNotNil: [:ctx | ctx isDone]<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I think this should work as expected
          because ifNil:ifNotNil: is inlined (not a send).<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">PS: as a side-effect the ProcessorTest
          suite now works fine consistently; before, some of the tests
          failed occasionally (on my Win10/Intel machine).<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Best,<o:p></o:p></p>
        <p class="MsoNormal">Jaromir<o:p></o:p></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: 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);"><o:p></o:p></span></p>
        <p class="MsoNoSpacing"><span style="font-family: "Calibri
            Light",sans-serif; color: rgb(46, 117, 182);"><a class="moz-txt-link-abbreviated" href="mailto:mail@jaromir.net">mail@jaromir.net</a><o:p></o:p></span></p>
        <p class="MsoNormal"><span style="color: rgb(143, 170, 220);"><o:p> </o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div style="border-right: medium none; border-width: 1pt medium
          medium; border-style: solid none none; border-color: rgb(225,
          225, 225) -moz-use-text-color -moz-use-text-color; padding:
          3pt 0in 0in;">
          <p class="MsoNormal"><b>From: </b><a moz-do-not-send="true"
              href="mailto:juan@cuis.st">Juan Vuletich</a><br>
            <b>Sent: </b>Tuesday, September 6, 2022 16:25<br>
            <b>To: </b><a moz-do-not-send="true"
              href="mailto:cuis-dev@lists.cuis.st">Discussion of Cuis
              Smalltalk</a><br>
            <b>Cc: </b><a moz-do-not-send="true"
              href="mailto:mail@jaromir.net">Jaromir Matas</a><br>
            <b>Subject: </b>Re: [Cuis-dev] #terminate and #suspend
            update<o:p></o:p></p>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><span style="color: black;">Hi Jaromir,<br>
            <br>
            On 8/27/2022 7:12 AM, Jaromir Matas via Cuis-dev wrote: <o:p></o:p></span></p>
        <blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
          <p class="MsoNormal"><span style="color: black;">Hi Juan,<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">> There is
              one problem left. #isTerminated will always answer false
              if #suspend primitive failed and old primitive 88 fallback
              method is called. I just pushed to github update #5458 to
              address this. Please check it carefully. Maybe you prefer
              a different solution, I'll be happy to review and
              integrate it.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">Oops, I
              forgot to mention the backward compatibility consideration
              but you caught it :) (meaning: to be able to run new
              images with older VMs, not only older images with the new
              VM). Squeak decided to maintain only its ability to run
              older images with the new VM - so no change in
              #isTerminated in Squeak; however I agree with you that
              "fixing" #isTerminated is worth the effort provided the
              fix is pretty easy.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">I'm enclosing
              my original suggestion for #isTerminated; I think the
              semantics is very similar to your version (checking
              whether the remaining context chain has anything useful
              left) except one thing: Your version allows a process with
              its suspended context's pc = nil to be considered not
              terminated. My understanding was: if a process's suspended
              context's pc is nil, it implies the process would be
              considered terminated. Is this right or would you define
              'being terminated' differently?<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">Check this
              example:<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">ctx _ []
              asContextWithSender: [] asContext.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p _ Process
              forContext: ctx priority: 40.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">ctx pc: nil.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p
              isTerminated.  "answers false in your version and true in
              mine"<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">I already
              noticed a while ago my previous version of #isTerminated
              failed to catch pc = nil in a process's suspended context
              and evaluate the process as 'terminated'. I wonder now
              what definition of 'terminated' state is actually 'the
              right one'.<o:p></o:p></span></p>
        </blockquote>
        <p class="MsoNormal" style="margin-bottom: 12pt;"><span
            style="color: black;"><br>
            I had assumed there would always be sender frames. I believe
            my code worked correctly unless there were no sender frames
            of the frame with pc=nil. In any case, your version is more
            robust and nicer code. I just integrated it. Thanks!<o:p></o:p></span></p>
        <blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
          <p class="MsoNormal"><span style="color: black;">Another
              question: in the example above - how do you look at the
              bytecodes of ctx? In Squeak the Explorer shows the
              bytecodes right away but in Cuis I have to open an extra
              inspector for 'method' and look at 'allBytecodes', right?
              <o:p></o:p></span></p>
        </blockquote>
        <p class="MsoNormal" style="margin-bottom: 12pt;"><span
            style="color: black;"><br>
            Yes. You are right. The explorer could be improved, to
            behave like Squeak's in this case. If you happen to have a
            couple of hours to hack this, it would be useful.<o:p></o:p></span></p>
        <blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
          <p class="MsoNormal"><span style="color: black;">In Squeak the
              process p answers true to #isTerminated even without
              nilling its pc, which is expected because each of the two
              contexts consists only of a single instruction, a return.
              But in Cuis I'm not sure how come the answer is false; I
              suspect I've got confused by the different implementation
              of Context / ContextPart in Squeak/Cuis.  Here's what I
              mean:<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">ctx _ []
              asContextWithSender: [] asContext.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p _ Process
              forContext: ctx priority: 40.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p
              isTerminated.  "answers false in Cuis and true in Squeak
              because ctx atEnd differs"<o:p></o:p></span></p>
        </blockquote>
        <p class="MsoNormal" style="margin-bottom: 12pt;"><span
            style="color: black;"><br>
            Just tried the example above, and it answers false in Squeak
            6.0 alpha 21576 on my Intel Mac. Maybe this has changed
            recently? Perhaps it needs fixing in both environments.<o:p></o:p></span></p>
        <blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
          <p class="MsoNormal"><span style="color: black;">... while
              this works the same in both:<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">ctx _ [1]
              asContextWithSender: [] asContext.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p _ Process
              forContext: ctx priority: 40.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">p
              isTerminated.  "answers false in both Cuis and Squeak
              because ctx is not atEnd"<o:p></o:p></span></p>
        </blockquote>
        <p class="MsoNormal" style="margin-bottom: 12pt;"><span
            style="color: black;"><br>
            Yes it does.<o:p></o:p></span></p>
        <blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
          <p class="MsoNormal"><span style="color: black;">Thank you for
              your advice.<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">Best regards,<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;">Jaromir<o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
          <p class="MsoNoSpacing"><span style="color: black;" lang="CS">--</span><span
              style="color: black;"><o:p></o:p></span></p>
          <p class="MsoNoSpacing"><strong><span style="font-family:
                "Calibri Light",sans-serif; font-weight:
                normal;">Jaromír Matas</span></strong><span
              style="color: black;"><o:p></o:p></span></p>
          <p class="MsoNoSpacing"><span style="color: black;"><a
                moz-do-not-send="true" href="mailto:mail@jaromir.net">mail@jaromir.net</a><o:p></o:p></span></p>
          <p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
        </blockquote>
        <p class="MsoNormal" style="margin-bottom: 12pt;"><span
            style="color: black;"><br>
            Thanks,<o:p></o:p></span></p>
        <pre>-- </pre>
        <pre>Juan Vuletich</pre>
        <pre>cuis.st</pre>
        <pre>github.com/jvuletich</pre>
        <pre>researchgate.net/profile/Juan-Vuletich</pre>
        <pre>independent.academia.edu/JuanVuletich</pre>
        <pre>patents.justia.com/inventor/juan-manuel-vuletich</pre>
        <pre>linkedin.com/in/juan-vuletich-75611b3</pre>
        <pre>twitter.com/JuanVuletich</pre>
        <p class="MsoNormal"><span style="font-size: 10pt; font-family:
            "Courier New"; color: black;"><o:p> </o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
    </blockquote>
    <br>
    <br>
    <pre class="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>
  </body>
</html>