<div dir="ltr">If I understood Duane Rettig's response correctly, when a thread binds a special variable using a let, that binding is only visible for that particular thread. Is this how other Lisps behave?<div><br></div>
<div>With that in mind, in order to make with-errno work, the foreign function call expression would have to be identified and bound with a let. So something like this:</div><div><br></div><div>(defmacro with-errno (&body body)</div>
<div>  (let ((exprs-before-ffc ...)</div><div>        (ffc-expression ..)</div><div>        (exprs-after-ffc ..))</div><div>    `,@exprs-before-ffc</div><div>     (let ((errno ,ffc-expression))</div><div>       ,@(exprs-after-ffc))))</div>
<div><br></div><div>There's some complications such as, how to determine which expression is a foreign function call since defcfun can assign any arbitrary name. There's also the issue of what should the foreign function call return? It seems like it would have to return errno as the last value.</div>
<div><br></div><div>To mitigate the first concern, perhaps a more explicit interface would help:</div><div><br></div><div>(with-foreign-funcall-errno (result errno (foreign-funcall "strlen" ...))</div><div>  ...)</div>
<div><br></div><div>You mentioned that a foreign function call could return errno as the first value, how about returning it as the last?</div><div><br></div><div>Another alternative is to optimize the way synchronization is done, so that we could improve the thread-local code I wrote before.</div>
<div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 12, 2013 at 10:54 PM, Luís Oliveira <span dir="ltr"><<a href="mailto:luismbo@gmail.com" target="_blank">luismbo@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Felix Filozov <<a href="mailto:ffilozov@gmail.com">ffilozov@gmail.com</a>> writes:<br>
<br>
> The implementation uses locking, so its efficiency could improved. I'm<br>
> interested in your suggestions on how to do that.<br>
<br>
</div>Indeed, this interface is much better from the user's point of view. I<br>
feel a bit uneasy about the implementation though.<br>
<br>
I found this message from Duane Rettig<br>
(<<a href="https://groups.google.com/forum/#!msg/comp.lang.lisp/7rhuvXaiR_g/AQ2-i6-74s4J" target="_blank">https://groups.google.com/forum/#!msg/comp.lang.lisp/7rhuvXaiR_g/AQ2-i6-74s4J</a>>)<br>
that suggests that the nearest ACL gets to thread-local variables is by<br>
defining a special variable then adding it to the list of default<br>
bindings.<br>
<br>
How about an interface like this?<br>
<br>
  (with-errno<br>
    (some-foreign-function-with-the-errno-option-on)<br>
    (get-errno))<br>
<br>
or perhaps<br>
<br>
  (with-errno (errno)<br>
    (some-foreign-function-with-the-errno-option-on)<br>
    errno)<br>
<div class="HOEnZb"><div class="h5"><br>
Cheers,<br>
<br>
--<br>
Luís Oliveira<br>
<a href="http://kerno.org/~luis" target="_blank">http://kerno.org/~luis</a><br>
<br>
<br>
</div></div></blockquote></div><br></div></div></div>