Hi Matthew,<div><br></div><div>let me try to answer your your email without quoting your message, just to make it all more readable.</div><div><br></div><div>* The basic problem is that due to what I believe is a design flaw, mutexes offer no API to query their status. This is a problem because a call to a mutex lock may be interrupted by a user who unwinds the stack to an outer point (using a restart) leaving ECL without means to record that the call indeed succeeded. This means that making the calls to get-lock and giveup-lock atomic is impossible.</div>

<div><br></div><div>* I believe the right algorithm for with-lock would be</div><div><br></div><div><div>1 - variable error_code = not_owned</div><div>2 - begin unwind-protect region</div><div>3 -- error_code =  pthread_mutex_lock()</div>

<div>4 -- if not error_code execute user code</div><div>5 - exit unwind-protect region</div><div>6 -- if no error_code</div><div>7 --- error_code = pthread_mutex_unlock()</div><div>8 --- if error_code != not owned signal error</div>

<div>9 -- end if</div><div>a - end unwind-protect</div><div><br></div><div>The problem we have right now is that steps 3 and 7 are implemented using Lisp routines that consist on more than just a call to pthread_mutex_[un]lock(). They can be interrupted and the output variables not match at all the desired values (error_code would have the wrong value)</div>

<div><br></div><div>* This all arises, as I say, from the fact that we export get-lock for the user. A possible safer alternative would be to implement WITH-LOCK as</div><div><br></div><div>(defmacro with-lock ((lock &rest options) &body body) `(mp:do-with-lock #'(lambda () ,@body) ,lock ,@options))</div>

<div><br></div><div>and let MP:DO-WITH-LOCK be a C function that implements steps 1-a above. What do you think?</div><div><br></div><div>Juanjo</div><div><br></div>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br>

<a href="http://juanjose.garciaripoll.googlepages.com" target="_blank">http://juanjose.garciaripoll.googlepages.com</a><br>
</div>