<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Windows uses SuspendThread.<br>I'll double check.<br><br><br>Cooperative suspend would NOT involve sending a "signal" to threads, in the Posix sense.<br>Nor would it use SuspendThread.<br><br><br>The model for cooperative suspend has been described by Tony and goes something like this:<br><br>There is a list of threads maintained by the m3 runtime.<br>  Not by enumerating OS threads.<br>The thread structure contains in it perhaps a boolean or enum as to suspend requested, suspending, suspended, resuming, running, etc.<br><br><br>When a thread wants to collect garbage, it either walks the thread list and sets all the booleans/enums to "suspend requested", or, more likely, it sets one global boolean.<br><br>Now, there are three likely methods to set the global boolean.<br> 1 - it is a global writable variable <br> 2 - it is a global writable function pointer <br> 3 - it is a page with protection <br><br><br>Code frequently polls this global boolean, in one of the following fashions<br> 1 - read and test the value of the variable <br> 2 - call the function pointer <br> 3 - read the page (just a byte or a word) ignoring the contents <br> 4 - call a function to do any of the above, esp #1 <br><br><br>#3 is probably fastest but my least favorite. It has lingering portability problems and is slowest when it comes time to actually suspend -- catch the exception and for purposes of debugging, you really don't want a design that raises exceptions like that.<br><br><br>When does the polling occur?<br>The polling is generated by the compiler.<br>It is done at function entry and/or exit and at branches or at least backward branches or at least branches that are continuing loops or such or at the starts of loops or somesuch.<br><br><br>I believe Java uses cooperative suspend and I think it uses the page protection mechanism.<br>It isn't portable e.g. to systems without an MMU.<br>Though of course you could abstract it out.<br><br><br>I'm glossing over details, but you know all the code we have for signals and semaphores? It goes away.<br>Our portability then would drive one more significant notch toward that of "hello world".<br><br>In my mine, we have about two pieces to do to gain "hello world" level of portability<br>  - cooperative suspend, not easy  <br>  - jmpbuf size removal, should be easy  <br><br>and some small matters<br>  - endianness, particularly in the libary <br>  - word size <br><br><br><br> - Jay<br><br><br><div><hr id="stopSpelling">From: dragisha@m3w.org<br>Date: Sat, 18 Jan 2014 09:24:11 +0100<br>To: m3devel@elegosoft.com<br>Subject: [M3devel] Cooperative suspend?<br><br>Jay,<div><br></div><div>What exactly do you mean? Isn't it cooperative already? Thread stopping the world informs others about its intent, and they suspend themselves on a semaphore. Windows implementation of threading does forced suspend?</div><div><br></div><div>dd<br><div>
<span class="ecxApple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:Candara;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><span class="ecxApple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:Helvetica;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="word-wrap:break-word;"><span class="ecxApple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:Helvetica;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="word-wrap:break-word;">--</div></span></div></span><span class="ecxApple-style-span" style="font-family:Helvetica;">Dragiša Durić</span><span class="ecxApple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:Helvetica;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="word-wrap:break-word;"><span class="ecxApple-style-span" style="border-collapse:separate;color:rgb(0, 0, 0);font-family:Helvetica;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><div style="word-wrap:break-word;"><div><a href="mailto:dragisha@m3w.org">dragisha@m3w.org</a></div><div><br></div></div></span></div></span></span><br class="ecxApple-interchange-newline">
</div>
<br></div></div>                                        </div></body>
</html>