<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Jaromir,<br>
<br>
Yesterday I found some time to finally integrate your great fixes to
#terminate & friends. While doing this, I turned many of your
examples into tests. Then I did this one, based on your
non-local-return examples:<br>
<br>
test1ATerminate<br>
"Terminate suspended process.<br>
Test all nested unwind blocks are correctly unwound; <br>
all unwind blocks halfway through their execution should be
completed."<br>
<br>
| p a |<br>
a _ Array new: 4 withAll: false.<br>
p := [<br>
self aux1A: a<br>
] newProcess.<br>
p resume.<br>
Processor yield.<br>
"make sure p is suspended and none of the unwind blocks has
finished yet"<br>
self assert: p isSuspended.<br>
a noneSatisfy: [ :b | b ].<br>
"now terminate the process and make sure all unwind blocks have
finished"<br>
p terminate.<br>
self assert: p isTerminated.<br>
self assert: a first & a third.<br>
self deny: a second | a fourth.<br>
<br>
aux1A: anArray<br>
[<br>
self aux1Ainner: anArray.<br>
] ensure: [<br>
anArray at: 3 put: true].<br>
anArray at: 4 put: true<br>
<br>
aux1Ainner: anArray<br>
[ ] ensure: [<br>
[Processor activeProcess suspend] ensure: [<br>
^anArray at: 1 put: true].<br>
anArray at: 2 put: true]<br>
<br>
But this test fail. The 3rd entry doesn't get updated, even if it is
in an ensured block. I think this is a bug, and I wrote a fix.<br>
<br>
The attached zip file with all the relevant code. Please review my
tweak to #terminate, and its effect on this test. If you agree with
it, I'll integrate it all.<br>
<br>
Thanks,<br>
<br>
On 4/14/2021 5:37 AM, Jaromir Matas via Cuis-dev wrote:
<blockquote
cite="mid:BN7PR08MB3842F3849FF9C29E23161C46EE4E9@BN7PR08MB3842.namprd08.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)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]-->
<style><!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 5 4 2 2 2 2 2 4;}
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
h1
{mso-style-priority:9;
mso-style-link:"Heading 1 Char";
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:24.0pt;
font-family:"Calibri",sans-serif;
color:black;
font-weight:bold;}
h2
{mso-style-priority:9;
mso-style-link:"Heading 2 Char";
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:18.0pt;
font-family:"Calibri",sans-serif;
color:black;
font-weight:bold;}
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;
font-size:10.0pt;
font-family:"Courier New";
color:black;}
span.Heading1Char
{mso-style-name:"Heading 1 Char";
mso-style-priority:9;
mso-style-link:"Heading 1";
font-family:"Calibri",sans-serif;
color:black;
font-weight:bold;}
span.Heading2Char
{mso-style-name:"Heading 2 Char";
mso-style-priority:9;
mso-style-link:"Heading 2";
font-family:"Calibri",sans-serif;
color:black;
font-weight:bold;}
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;
font-family:"Calibri",sans-serif;}
@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, hi all,</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m enclosing an amended list of examples
with fixed #fork and ‘self error’ patterns so that you can use
them right away.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> - The notes for a few examples speak
of crashes in Cuis. I pushed some fixes a few days ago,
<o:p></o:p></p>
<p class="MsoNormal">> and now cmd-. works as expected. The
examples behave the same as in Squeak.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Yes, it’s perfect :) I removed the crash
notes from the example list.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">A little correction: I haven’t realized
Martin McClure was talking from a Visual Works position - they
have different semantics of #valueUninterruptably (at least in
8.3 from 2017, using a semaphore).</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The Squeak semantics of
#valueUninterruptably is “don’t let anything kill me” (using a
non-local return in the unwind block).</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>
<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" style="border: medium none; padding:
0in;"><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>Wednesday, April 14, 2021 0:20<br>
<b>To: </b><a moz-do-not-send="true"
href="mailto:juan@jvuletich.org">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>; <a
moz-do-not-send="true"
href="mailto:hernan.wilkinson@10pines.com">
Hernan Wilkinson</a><br>
<b>Subject: </b>Re: [Cuis-dev] Unwind mechanism during
termination is broken and inconsistent</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">><o:p> </o:p></p>
<p class="MsoNormal">> Hi Jaromir, hi all,<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal">> This is a most impressive work!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Many thanks for your encouragement - I'm
really glad you like it :)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal">> It made me remember this talk given by
Martin McClure in Smalltalks 2019:
<a class="moz-txt-link-freetext" href="https://www.youtube.com/watch?v=AvM5YrjK9AE">https://www.youtube.com/watch?v=AvM5YrjK9AE</a> . At minute 22:00,
Martin states the behavior he expects from #terminate, and
shows a test. I tried his test in Cuis, and sometimes (but not
always) it failed. Jaromir, with your code, Martin's test now
pass! In addition, I ran the existing Process tests, and none
is made to fail.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Very interesting: I haven't touched the
part for releasing critical sections (I thought it was an
independent part I wanted to revisit later) but I'm relieved
to hear it works properly with the proposed changes :)
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In the talk Martin McClure also mentioned
#valueUninterruptably. I've noticed Cuis doesn't implement it
but I think with the suggested #terminate it could be
implemented safely (fingers crossed).
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">BlockClosure >> valueUninterruptably<o:p></o:p></p>
<p class="MsoNormal"> ^ self ifCurtailed: [^ self]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">At the moment however, Squeak and Pharo
suffer a horrible damage to the image if you try:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> [ self error ]
valueUninterruptably<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">and later e.g.:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> Semaphore new
waitTimeoutMSecs: 50<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The worst part is the user won't notice
anything and a simple code will run as if nothing happened -
until an error or a crash happens. One of only a few ways to
see something's off is e.g. Squeak's `Processor activeProcess
= Project current uiProcess` which all of a sudden answers
false (!)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But that's just Squeak/Pharo; Cuis is not
affected as badly because it doesn't use the
`effectiveProcess` mechanism.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Martin McClure also mentioned
#valueUnpreemptively; funny thing is it doesn't work as
designed because there's a bug in Process>>#priority
which will leave the elevated process run at highest priority
until it reaches a suspension point instead of bumping the
priority back lower before returning from
#valueUnpreemptively. It's discussed in this thread:
<a class="moz-txt-link-freetext" href="http://forum.world.st/The-Inbox-Kernel-jar-1368-mcz-tp5126894p5126982.html">http://forum.world.st/The-Inbox-Kernel-jar-1368-mcz-tp5126894p5126982.html</a>
. The conclusion is a new primitive for #priority is needed.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal">> I also tried all your tests and
examples. They cover a really broad and exhaustive set of
scenarios! A few comments:<o:p></o:p></p>
<p class="MsoNormal">> - Many examples don't work in Cuis,
because we made #fork answer nil (and not the forked process).
The reason for this is explained in the comment in #fork. The
pattern is instead of "p := [stuff] fork." do "p := [stuff]
newProcess. p resume." With this change, all the examples work
as expected.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Oops, apologies, I noticed the fork pattern
(very reasonable), I modified my #fork to return the process
to avoid the need to modify all the examples I created for
Squeak :) Same for 'self error' unfortunately - for Cuis
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> self error <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">in the examples has to change to: <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> self error: 'unwind error'<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">sorry... <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> - The notes for a few examples speak
of crashes in Cuis. I pushed some fixes a few days ago, and
now cmd-. works as expected. The examples behave the same as
in Squeak. Please pull your repos.<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I will, thanks!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Additionally, this remark of you
(Jaromir) I don't understand:<o:p></o:p></p>
<p class="MsoNormal">> /////<o:p></o:p></p>
<p class="MsoNormal">> ad 1) The #isTerminated condition
`suspendedContext pc > suspendedContext startpc` is always
met after executing the first instruction of the bottom
context – generally not a sign of a terminated process.<o:p></o:p></p>
<p class="MsoNormal">> \\\\\\<o:p></o:p></p>
<p class="MsoNormal">> I don't see that condition neither in
Squeak (#19435) nor Cuis (#4567).<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My bad explaining; I was talking about
#isTerminated implementation in Cuis (and Pharo) using this
old condition - on the last line of:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Process >> isTerminated<o:p></o:p></p>
<p class="MsoNormal"> "Answer true if terminated,
i.e. can never be resumed again, because have nothing to run."<o:p></o:p></p>
<p class="MsoNormal"> self isRunning ifTrue: [^
false].<o:p></o:p></p>
<p class="MsoNormal"> ^suspendedContext isNil<o:p></o:p></p>
<p class="MsoNormal"> or: [
suspendedContext pc isNil<o:p></o:p></p>
<p class="MsoNormal">
or: ["If the suspendedContext is the bottomContext it is the
block in Process>>newProcess.<o:p></o:p></p>
<p class="MsoNormal">
If so, and the pc is greater than
the startpc, the bock has alrteady sent and returned<o:p></o:p></p>
<p class="MsoNormal">
from value and there is nothing
more to do."<o:p></o:p></p>
<p class="MsoNormal">
suspendedContext isBottomContext<o:p></o:p></p>
<p class="MsoNormal">
and: [<o:p></o:p></p>
<p class="MsoNormal">
suspendedContext pc > suspendedContext startpc]]]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Squeak improved this condition a while ago
but it's still insufficient :) It's discussed here:
<a class="moz-txt-link-freetext" href="http://forum.world.st/The-Inbox-Kernel-jar-1376-mcz-tp5127335p5127341.html">http://forum.world.st/The-Inbox-Kernel-jar-1376-mcz-tp5127335p5127341.html</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> In any case, I think this is a great
contribution, It perfectly fixes a lot of broken behavior, and
doesn't seem to bring problems. I'm all for integrating it.<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal">> Jaromir, do you intend to turn the
rest of your examples into tests? I think we should also do
that, so we integrate all your experiments and what you
learnt.<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I'd love to but I realized I don't know how
to build tests involving raising errors and pressing Abandon
on the Debugger :D If you could point me in the right
direction it'd save me a lot of trying :)
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks a lot for all your comments. I'm
happy you like the suggestion and would be delighted to see it
integrated.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Thanks!<o:p></o:p></p>
<p class="MsoNormal">><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Best regards,<o:p></o:p></p>
<p class="MsoNormal"><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>
<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@jvuletich.org">Juan Vuletich</a><br>
<b>Sent: </b>Tuesday, April 13, 2021 20:45<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:hernan.wilkinson@10pines.com">Hernan
Wilkinson</a>; <a moz-do-not-send="true"
href="mailto:mail@jaromir.net">
Jaromir Matas</a><br>
<b>Subject: </b>Re: [Cuis-dev] Unwind mechanism during
termination is broken and inconsistent<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-bottom: 12pt;"><span
style="color: black;">Hi Jaromir, hi all,<br>
<br>
This is a most impressive work!<br>
<br>
It made me remember this talk given by Martin McClure in
Smalltalks 2019: <a moz-do-not-send="true"
href="https://www.youtube.com/watch?v=AvM5YrjK9AE">
https://www.youtube.com/watch?v=AvM5YrjK9AE</a> . At
minute 22:00, Martin states the behavior he expects from
#terminate, and shows a test. I tried his test in Cuis, and
sometimes (but not always) it failed. Jaromir, with your
code, Martin's test now pass! In addition, I ran the
existing Process tests, and none is made to fail.<br>
<br>
I also tried all your tests and examples. They cover a
really broad and exhaustive set of scenarios! A few
comments:<br>
- Many examples don't work in Cuis, because we made #fork
answer nil (and not the forked process). The reason for this
is explained in the comment in #fork. The pattern is instead
of "p := [stuff] fork." do "p := [stuff] newProcess. p
resume." With this change, all the examples work as
expected.<br>
- The notes for a few examples speak of crashes in Cuis. I
pushed some fixes a few days ago, and now cmd-. works as
expected. The examples behave the same as in Squeak. Please
pull your repos.<br>
<br>
Additionally, this remark of you (Jaromir) I don't
understand:<br>
/////<br>
ad 1) The #isTerminated condition `suspendedContext pc >
suspendedContext startpc` is always met after executing the
first instruction of the bottom context – generally not a
sign of a terminated process.<br>
\\\\\\<br>
I don't see that condition neither in Squeak (#19435) nor
Cuis (#4567).<br>
<br>
In any case, I think this is a great contribution, It
perfectly fixes a lot of broken behavior, and doesn't seem
to bring problems. I'm all for integrating it.<br>
<br>
Jaromir, do you intend to turn the rest of your examples
into tests? I think we should also do that, so we integrate
all your experiments and what you learnt.<br>
<br>
Thanks!<o:p></o:p></span></p>
<pre>-- </pre>
<pre>Juan Vuletich</pre>
<pre><a moz-do-not-send="true" href="http://www.cuis-smalltalk.org">www.cuis-smalltalk.org</a></pre>
<pre><a moz-do-not-send="true" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a></pre>
<pre><a moz-do-not-send="true" href="https://github.com/jvuletich">https://github.com/jvuletich</a></pre>
<pre><a moz-do-not-send="true" href="https://www.linkedin.com/in/juan-vuletich-75611b3">https://www.linkedin.com/in/juan-vuletich-75611b3</a></pre>
<pre>@JuanVuletich</pre>
<p class="MsoNormal"><span style="color: black;"><br>
<br>
On 4/13/2021 6:02 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 Hernan, hi
all,<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
a slightly improved version of #terminate along with a few
semantic tests covering basic nested unwind scenarios
(terminating an active, suspended, blocked and ready
processes in nested unwind blocks). More tests can be
based on examples in the enclosed collection - for
scenarios involving non-local returns and errors during
termination and especially their combinations. A few
examples explore resiliency of the code exposed to
pathologic situations (nested termination or errors).<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;">Thanks again
for your time. I look forward to your response.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">best,<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>
<div style="border-right: medium none; border-width: 1pt
medium medium; border-style: solid none none; padding: 3pt
0in 0in; border-color: rgb(225, 225, 225)
-moz-use-text-color -moz-use-text-color;">
<p class="MsoNormal"><b><span style="color: black;">From: </span></b><span
style="color: black;"><a moz-do-not-send="true"
href="mailto:cuis-dev@lists.cuis.st">Jaromir Matas via
Cuis-dev</a><br>
<b>Sent: </b>Sunday, April 11, 2021 10:51<br>
<b>To: </b><a moz-do-not-send="true"
href="mailto:hernan.wilkinson@10pines.com">Hernan
Wilkinson</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] Unwind mechanism during
termination is broken and inconsistent<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">Hi Hernan,<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;">Thank you
very much for your immediate response.<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;">> Hi
Jaromir,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> thank
you for sharing this with us! It looks very interesting.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> As you
can imagine a change of this magnitude and impact has to
be analyzed in detail and tested rigorously, and that will
take time.
<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;">Oh
absolutely, I'm aware of that and wouldn't expect anything
less :)<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;">> It
would help us deeply if there are tests that reproduce the
errors, do you have them?
<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;">Yes, I have a
set of Squeak tests I'm planning to extend and make
presentable ASAP. I'll "translate" them to Cuis too.<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;">> If not,
could you write them? I know it is a difficult problem to
test but if we could have automated tests for this it
would help a lot.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> Also,
it would help to know how you tested 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;">That's
important: I tested solely for 'correct' semantics in a
series of simple scenarios I'll send you.<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;">> For
example, have you tried in stress conditions?
<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;">Nope, I'm not
that experienced unfortunately :)<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;">> for
example with an app that uses many processes (ie. seaside
or any web framework). Please, do not take this question
as disrespectful, but again,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> it is a
change with a big impact and we need to be sure it will
keep the current behavior (but the bugs of course) and it
will not introduce new bugs.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> I'm
also wondering if there could be systems that are
implemented as these bugs you mention were "features" ...<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;">That's an
interesting question. I realized the sooner bugs this deep
in the system are fixed the less chance someone learns to
'live' with them, crippling their code, or even uses them
as 'features'. I just hope it's not the case. How would we
know? Well... actually here's one: while testing it on
Pharo I found two tests that sort of 'legitimize' or use
the Unwind error (bug) to achieve certain behavior... (if
I interpret the tests correctly).<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;">Thanks again
for your questions!<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;">Jaromir<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;">> Thanks!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;">> Hernan.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
<div style="border-right: medium none; border-width: 1pt
medium medium; border-style: solid none none; padding: 3pt
0in 0in; border-color: rgb(225, 225, 225)
-moz-use-text-color -moz-use-text-color;">
<p class="MsoNormal"><b><span style="color: black;">From: </span></b><span
style="color: black;"><a moz-do-not-send="true"
href="mailto:hernan.wilkinson@10pines.com">Hernan
Wilkinson</a><br>
<b>Sent: </b>Sunday, April 11, 2021 1:47<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] Unwind mechanism during
termination is broken and inconsistent<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="color: black;">Hi Jaromir,<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="color: black;"> thank
you for sharing this with us! It looks very
interesting.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> As you
can imagine a change of this magnitude and impact has
to be analyzed in detail and tested rigorously, and
that will take time. (Sadly Juan and me are really
busy at this time so it will even take more time :-) )<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> It would
help us deeply if there are tests that reproduce the
errors, do you have them? If not, could you write
them? I know it is a difficult problem to test but if
we could have automated tests for this it would help a
lot. <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> Also, it
would help to know how you tested it. For example,
have you tried in stress conditions? for example with
an app that uses many processes (ie. seaside or any
web framework). Please, do not take this question as
disrespectful, but again, it is a change with a big
impact and we need to be sure it will keep the current
behavior (but the bugs of course) and it will not
introduce new bugs.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> I'm also
wondering if there could be systems that are
implemented as these bugs you mention were "features"
...<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> Thanks!<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> Hernan.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span style="color: black;">On Sat,
Apr 10, 2021 at 4:20 PM Jaromir Matas via Cuis-dev
<<a moz-do-not-send="true"
href="mailto:cuis-dev@lists.cuis.st">cuis-dev@lists.cuis.st</a>>
wrote:<o:p></o:p></span></p>
</div>
<blockquote style="border-width: medium medium medium 1pt;
border-style: none none none solid; border-color:
-moz-use-text-color -moz-use-text-color
-moz-use-text-color windowtext; padding: 0in 0in 0in 6pt;
margin: 5pt 0in 5pt 4.8pt;">
<div>
<div>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Hi All,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">I'd like to present to you a
rewrite of #terminate and #isTerminated that fixes
a few bugs and inconsistencies in process
termination. I hoped it might interest you.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">I'm a Smalltalk enthusiast
with education background in math/CS. I've been
experimenting with processes in Squeak lately and
discovered a few bugs (or at least
inconsistencies) in process termination and would
like to offer and discuss a solution for Cuis.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">The bugs are not unique to
Cuis; Squeak/Pharo inherited them too and to a
degree even Visual Works and VA are affected. The
proposal presented here doesn't copy any VW or VA
solution but rather implements a different
approach :)<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Before boring you to death
I'll list the bugs:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">1. #isTerminated falsely
reports almost any bottom context as terminated<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">2. an active process
termination bug causes an image freeze
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">3. a <i>
nested</i> unwind bug: ensure blocks may get
skipped during unwind<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">4. a failure to complete
<i>nested</i> unwind blocks halfway thru execution
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">5. a failure to correctly
execute a non-local return or an error in an
unwind block
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">6. inconsistent semantics of
protected blocks unwind during active vs.
suspended process termination<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">The current implementation
of #terminate uses three different approaches to
terminate a process:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">- the active process is
terminated via a 'standard' unwind algorithm used
in context #unwindTo: or #resume:,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">- a suspended process
termination attempts completing unwind blocks
halfway through their execution first using
#runUntilErrorOrReturnFrom:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">- and after that the
termination continues unwinding the remaining
unwind blocks using the simulation algorithm of
#popTo:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">This approach
<i>looks</i> inconsistent and indeed leads to
inconsistencies, undesirable behavior and an
instability mentioned above.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">The Idea: In my view the
easiest and most consistent solution is to simply
extend the existing mechanism for completing
halfway-through unwind blocks and let it deal with
<b>all</b> unwind blocks. To make this approach
applicable to terminating the active process, we
suspend it first and then terminate it as a
suspended process.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">A commented code is
enclosed.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">I know it's pretty difficult
to get a feedback on an ancient code; I'll be all
the more grateful for your inputs.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Best regards,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Jaromir<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">PS:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Note the change in
newProcess - `Processor activeProcess terminate`
is replaced by `Processor activeProcess suspend`
because there's no need for `terminate` at the
bottom context ("terminate = unwind + suspend")
and because it would lead to an infinite loop
combined with my proposed changes to #terminate.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">PPS:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">More on the bugs:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">ad 1) The #isTerminated
condition `suspendedContext pc >
suspendedContext startpc` is always met after
executing the first instruction of the bottom
context – generally not a sign of a terminated
process.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">ad 2) Explained in [1].
Concerns e.g. examples like
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> [ [ Processor
activeProcess terminate ] ensure: [ Processor
activeProcess terminate ] ] fork.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">ad 3-4) Explained in detail
in [2].<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">One example to illustrate
the bug:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">| p |<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">p := [<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> [<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> [
] ensure: [<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">
[ ] ensure: [<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">
Processor activeProcess suspend.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">
Transcript show: 'x1'].
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">
Transcript show: 'x2']<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> ] ensure: [<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">
Transcript show: 'x3']<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">] newProcess.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">p resume.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">Processor yield.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">p terminate<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">===> x1<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">The unwind procedure prints
just x1 and skips not only x2 but x3 as well !
You'd like to see them all.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">ad 5) This happens in cases
like (better save your image before trying this):<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> [self error:
'e1'] ensure: [^2] "discovered by Christoph
Thiede"<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">and<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> [self error:
'e1'] ensure: [self error: 'e2']<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">These are generally the
types of situations causing the Unwind errors. The
root cause is that the unwinding is done via
simulation (#popTo) rather than 'directly'; the
problem is during the simulated execution of
unwind blocks a non-local return forwards the
execution into a wrong stack - resulting in the
Unwind errors.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">ad 6) I just prefer a
unified approach... unless I somehow overlooked a
reason for two different approaches (I hope not).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">[1] <a
moz-do-not-send="true"
href="http://forum.world.st/A-bug-in-active-process-termination-crashing-image-td5128186.html"
target="_blank">
http://forum.world.st/A-bug-in-active-process-termination-crashing-image-td5128186.html</a><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">[2] <a
moz-do-not-send="true"
href="http://forum.world.st/Another-bug-in-Process-gt-gt-terminate-in-unwinding-contexts-td5128171.html#a5128178"
target="_blank">
http://forum.world.st/Another-bug-in-Process-gt-gt-terminate-in-unwinding-contexts-td5128171.html#a5128178</a><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;"> <o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" style="margin-left: 1.2in;"><span
style="color: black;">-- <br>
Cuis-dev mailing list<br>
<a moz-do-not-send="true"
href="mailto:Cuis-dev@lists.cuis.st" target="_blank">Cuis-dev@lists.cuis.st</a><br>
<a moz-do-not-send="true"
href="https://lists.cuis.st/mailman/listinfo/cuis-dev"
target="_blank">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><o:p></o:p></span></p>
</blockquote>
</div>
<p class="MsoNormal"><span style="color: black;"><br
clear="all">
<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="color: black;"> <o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="color: black;">-- <o:p></o:p></span></p>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><a
moz-do-not-send="true"
href="https://10pines.com/"
target="_blank"><span
style="font-size: 13.5pt;
font-family:
"Helvetica",sans-serif;
text-decoration: none;"><img
moz-do-not-send="true"
style="width: 1.125in; height:
0.35in;" id="_x0000_i1025"
src="https://10pines.github.io/email-signature/10pines-firma@2x.png"
border="0" height="34" width="108"></span></a><span
style="color: black;"><o:p></o:p></span></p>
<h1 style="margin: 0in;"><span
style="font-size: 10.5pt;">Hernán
Wilkinson</span><o:p></o:p></h1>
<h2 style="margin-bottom: 12pt;"><span
style="font-size: 10.5pt; color:
rgb(100, 100, 100);">Software
Developer, Teacher & Coach</span><o:p></o:p></h2>
<p style="margin: 0in;"><span
style="font-size: 9pt;">Alem 896,
Floor 6, Buenos Aires, Argentina</span></p>
<p style="margin: 0in;"><span
style="font-size: 9pt;">+54 11 6091
3125</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p style="margin: 0in;"><span style="font-size: 9pt; color:
rgb(100, 100, 100);">@HernanWilkinson</span></p>
</blockquote>
<p class="MsoNormal" style="margin-right: 0.5in; margin-bottom:
5pt; margin-left: 0.5in;">
<span style="color: black;"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black;"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</blockquote>
<br>
<br>
<pre class="moz-signature" cols="72">--
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis-smalltalk.org">www.cuis-smalltalk.org</a>
<a class="moz-txt-link-freetext" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a>
<a class="moz-txt-link-freetext" href="https://github.com/jvuletich">https://github.com/jvuletich</a>
<a class="moz-txt-link-freetext" href="https://www.linkedin.com/in/juan-vuletich-75611b3">https://www.linkedin.com/in/juan-vuletich-75611b3</a>
@JuanVuletich</pre>
</body>
</html>