<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body style="word-wrap:break-word"><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">I still like the idea of shared memory, but since without additional threading it can’t have write access inside the new process, I don’t think that it is a solution for a webserver.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">The main concern was just with developers using these universal exceptions deliberately, along with “inconsistent states” and memory leaks.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">So here’s a simple proposal:</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">func</span><span style="font-variant-ligatures:no-common-ligatures"> unsafeCatchFatalErrorWithMemoryLeak(</span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">_</span><span style="font-variant-ligatures:no-common-ligatures"> block: ()-&gt;</span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa">Void</span><span style="font-variant-ligatures:no-common-ligatures">) -&gt; </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa">FatalError</span><span style="font-variant-ligatures:no-common-ligatures">?</span></p></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">What it does is execute the block, and when the fatalError function is invoked (as is the case with logic errors), the fatalError checks some thread local for the existence of this handler and performs a goto. “unsafeCatchFatalErrorWithMemoryLeak” then returns a small object with the error message. The can only be one per-call stack, and it leaks deliberately leaks the entire stack from “fatalError” back down to “unsafeCatchFatalErrorWithMemoryLeak”, and that is one reason why it is labelled “unsafe” and “withMemoryLeak”.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">The idea is that this is a function expressly for “high availability” applications like web servers. The server will now have some leaked objects posing no immediate danger, and some inconsistencies, primarily or entirely inside the leaked objects (It is the developer’s responsibility how this is used).</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">The “high availability sytem” is then expected to stop accepting incoming socket connections, generate another instance of itself, handle any open connections, and exit.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">The interesting thing about this is that it is very easy to implement. Being an unsafe function, it is not part of the language as a catch block is, and doesn’t entirely preclude another solution in the future.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto"><br></div> <div id="bloop_sign_1490100414017754112" class="bloop_sign"></div> <br><p class="airmail_on">On March 14, 2017 at 8:22:11 PM, Elijah Johnson (<a href="mailto:ejrx7753@gmail.com">ejrx7753@gmail.com</a>) wrote:</p> <blockquote type="cite" class="clean_bq"><span><div style="word-wrap:break-word"><div></div><div>




<title></title>



<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
But - that would require a dedicated thread or a thread pool to run
function calls on. Definitely it lacks many of the advantages of
shared objects directly in the process. I would definitely prefer a
small memory leak or inconsistent state. The server could handle
existing requests and restart itself if it were really an issue. A
memory leak can be estimated and the server restarted after every
“x” times, while an inconsistent state is something that happens in
any shared server environment. The developers just don’t modify the
shared state until they have ready the final object, and their
array/dictionary put function call itself isn’t likely to be the
fail that happened.</div>
<br>
<div id="bloop_sign_1489536747265172992" class="bloop_sign"></div>
<br>
<p class="airmail_on">On March 14, 2017 at 7:29:28 PM, Elijah
Johnson (<a href="mailto:ejrx7753@gmail.com">ejrx7753@gmail.com</a>) wrote:</p>
<blockquote type="cite" class="clean_bq">
<div style="word-wrap:break-word">
<div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<span>Also the proxies would need to implement some protocol so
that they can be de-proxied when sent back to a shared method, and
the proxy object exposed to the user with a new declaration that
accepts only proxies. Like using MyClass -&gt; MyClassSharedProxy
for the proxy class and</span></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<span><br></span></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">class</span>
<span style="font-variant-ligatures:no-common-ligatures">MyClass
{</span></span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
</p>
<span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> 
  </span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">func</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> testReturnsObject(</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures">)
-&gt; </span><span style="font-family:Menlo;font-size:11px;color:rgb(79,129,135)">SomeClass<br>
</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> 
  </span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">func</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> call(a:</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">MyClass</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures">)
-&gt; </span><span style="font-family:Menlo;font-size:11px;color:rgb(79,129,135)">MyClass</span>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></p>
</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
would become</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">class</span>
<span style="font-variant-ligatures:no-common-ligatures">MyClassSharedProxy
: </span><span style="color:rgb(79,129,135)">MyClass</span>,<span style="color:rgb(79,129,135)"> </span><span style="color:rgb(79,129,135)">SharedProxyProtocol</span> {</p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
</p>
<span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> 
  </span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">func</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> testReturnsObject(</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures">)</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> -&gt; </span><span style="color:rgb(79,129,135);font-family:Menlo;font-size:11px">SomeClass</span><span style="color:rgb(79,129,135);font-family:Menlo;font-size:11px">SharedProxy<br>
</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> 
  </span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">func</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> call(a:</span><span style="color:rgb(79,129,135);font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures">MyClassSharedProxy</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures">)</span><span style="font-family:Menlo;font-size:11px;font-variant-ligatures:no-common-ligatures"> -&gt; </span><span style="color:rgb(79,129,135);font-family:Menlo;font-size:11px">MyClassSharedProxy</span>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures"><br></span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-family:Helvetica,Arial;font-size:13px">for
example.</span></p>
</div>
<br>
<div id="bloop_sign_1489533439340462848" class="bloop_sign"></div>
<br>
<p class="airmail_on">On March 14, 2017 at 7:15:08 PM, Elijah
Johnson (<a href="mailto:ejrx7753@gmail.com">ejrx7753@gmail.com</a>) wrote:</p>
<blockquote type="cite" class="clean_bq">
<div style="word-wrap:break-word">
<div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<span>Sounds like a good idea. I assume that Swift would need to
compile these proxies in advance to be sub-classes ie. binary
compatible objects that will forward calls and return proxies.
“Value” types can be copied as they normally are, or wrapped by the
user (along with “final” objects which could be wrapped manually or
made not-final). Then you’d just need a way to get your first proxy
object and a way to register the process’s object. Something
like</span></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<span><br></span></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span><span style="font-variant-ligatures:no-common-ligatures">   </span>
<span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">func</span>
<span style="font-variant-ligatures:no-common-ligatures">openSharedObject(pid:</span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa">String</span><span style="font-variant-ligatures:no-common-ligatures">)</span>
<span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">throws</span>
<span style="font-variant-ligatures:no-common-ligatures">-&gt;</span>
<span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">Any</span><span style="font-variant-ligatures:no-common-ligatures">?</span>
<span style="font-variant-ligatures:no-common-ligatures;color:#008400">//
cast to expected value</span></span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:#008400"><br>
</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures"> 
 </span> <span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">func</span>
<span style="font-variant-ligatures:no-common-ligatures">registerSharedProxyObject(object:</span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2">Any</span><span style="font-variant-ligatures:no-common-ligatures">)</span>
<span style="font-variant-ligatures:no-common-ligatures;color:#008400">//
for this process</span></p>
</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
I suppose the caller would have to be the one to compile these
proxy objects and locate them in its own module.</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
The advantage here is that it would be not too difficult for
existing servers to make use of this, as they are already written
as a single process in Swift and so they would just need to manage
and pre-fork processes instead of threads. Seems like it would also
have numerous uses in the systems programming domain.</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
Then one just needs, ideally, to get a stack trace and fatal error
message to the parent process if a child process crashes.</div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<br></div>
<br>
<div id="bloop_sign_1489530668879994880" class="bloop_sign"></div>
<br>
<p class="airmail_on">On March 14, 2017 at 12:18:37 AM, Brent
Royal-Gordon (<a href="mailto:brent@architechies.com">brent@architechies.com</a>)
wrote:</p>
<blockquote type="cite" class="clean_bq">
<div>
<div><span>&gt; On Mar 13, 2017, at 5:54 PM, Matthew Johnson
&lt;<a href="mailto:matthew@anandabits.com">matthew@anandabits.com</a>&gt; wrote:<br>
<br>
&gt;<br>
&gt; I suspect you&#39;re right about this for the most part but I
think we will want the ability for &quot;failable processes&quot; (or
whatever they&#39;re called) to have read-only access to shared state
that outlives them. What I can&#39;t imagine is allowing them write
access to state that is shared.<br>
<br>
The problem there is that shared data in Swift always has a retain
count, so we&#39;d need some way to track when code in one of these
&quot;mini-processes&quot; retains an external object so we can release it if
it crashes. Perhaps you&#39;d need to wrap a proxy type around shared
objects (or instances containing shared objects, like Array and
String) and the proxies would register themselves with the runtime
as needing emergency cleanup beyond unceremonious deallocation of
their &quot;mini-process&quot;&#39;s memory space. This is all doable; it just
needs to be designed and done.<br>
<br>
--<br>
Brent Royal-Gordon<br>
Sent from my iPhone</span></div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>


</div></div></span></blockquote></body></html>