<div dir="ltr">I worked out a basic implementation for a <a href="https://github.com/ffilozov/cffi/compare/thread-local-errno" target="_blank">thread-local errno</a>. Bordeaux-threads has been added as a dependency as well as two extra functions: cffi:set-errno and cffi:get-errno.<div>
<br></div><div>This is a much cleaner interface than passing an object, and the generated function doesn't need to have an extra parameter.</div><div><br></div><div>Sample:</div><div><br></div><div><div>CL-USER>  (cffi:defcfun ("socket" :errno t) :int</div>
<div>                 (a :int)</div><div>                 (b :int)</div><div>                 (c :int))</div><div>Warning: :call-direct ignored because :error-value specified.</div><div>SOCKET</div><div><br></div><div>CL-USER> (socket -1 -1 -1)</div>
<div>-1</div><div><br></div><div>CL-USER> (cffi:get-errno)</div><div>22</div><div>T</div></div><div><br></div><div>The implementation uses locking, so its efficiency could improved. I'm interested in your suggestions on how to do that.</div>
<div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 8, 2013 at 4:29 AM, Daniel Herring <span dir="ltr"><<a href="mailto:dherring@tentpost.com" target="_blank">dherring@tentpost.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Felix,<br>
<br>
Errno is a particularly tricky beast.  It is a thread-local "global" that is modified by a large number of system calls and library functions. Code must be careful to check it before another such call is made.  I could easily imagine a stop-the-world GC accidentally modifying errno if errno is not checked "atomically" with the function call.<br>

<br>
Also errno is very lightweight.  An extra foreign call to check it could easily dwarf the cost of the check.  Errno is a "hidden" return parameter, much like the second position in a multiple-value return.<br>
<br>
Thus the Allegro semantics of returning errno as a second value seem reasonable to me.<br>
<br>
As you suggested, CFFI could provide a default errno implementation for CLs that have different native semantics.<span class="HOEnZb"><font color="#888888"><br>
<br>
- Daniel<br>
<br>
</font></span></blockquote></div><br></div>