On Monday, June 8, 2015, Taylor R Campbell <campb...@mumble.net
<javascript:_e(%7B%7D,'cvml','campb...@mumble.net');>> wrote:


> Hi, Arthur!  I asked the list last year whether anyone relied on it:
>
> https://lists.gnu.org/archive/html/mit-scheme-devel/2014-11/msg00005.html
>
> Nobody replied that they relied on it, and since the thread system is
> undocumented I expected its use outside the tree to be limited.
>

Oops.  Sorry, I somehow I missed that.


> The reason I decided to do this is that it is practically always a
> mistake to rely on recursion: for each mutex, you should know whether
> or not you hold it at each point when you need access to the resource
> it protects, and you should know what other locks are held in order to
> determine a consistent lock order.
>

In each case where I'm using them, there really is only one lock, so lock
order is not an issue.  Other locks that are not part of the system and are
held by callers are not relevant because third-party code is never called
in the contexts of the sections those locks control.

I know, in each case, that I need access to the resource being protected.
That's why I'm acquiring the lock.  The only question is whether is has
already been acquired.


> Utility routines whose callers might or might not hold the lock are
> suspect and tend to suggest insufficiently considered design:  What is
> the invariant the lock provides?  If the caller doesn't need to hold
> the lock, why does the lock need to be there at all?
>

Here's an example: I have a web server whose internal data structures are
rarely mutated.  I use a lock to prevent conflicts.  I also use that lock
to serialize the server's write access to its logs.  My logging procedures
are sometimes called by the server while it holds the lock, and sometimes
when it doesn't already hold the lock.  Rather than have two variants of
each logging procedure, one that expects the lock to be held already and
one that acquires it, I used recursive locks.  Now I can't do that, at
least with what's built into MIT Scheme.


> There are legitimate cases where recursive locks make sense, but most
> uses are best served by a nonrecursive lock abstraction.  You can
> always build a recursive lock out of a nonrecursive lock and a
> condition variable.
>

That's more complicated and prone to error.

I'll look over my code again, but all the cases where I am using recursive
mutexes are of that flavor.

Anyway, thanks for the explanation, and sorry for missing your earlier
message.
_______________________________________________
MIT-Scheme-devel mailing list
MIT-Scheme-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/mit-scheme-devel

Reply via email to