This repository has been archived by the owner on Nov 9, 2017. It is now read-only.
Properly release locks in lamina.core.graph.node/propagate
#45
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously, exceptions raised in
lamina.core.graph.node/propagate
could lead to a node's lock to not be released properly because
releasing didn't happen in a
finally
clause. However, using thewith-lock
macro is not possible in this case because in somebranches the lock is released before the
with-lock
body ends. Toallow for this, a
with-lock*
macro is introduced. If the lock isreleased inside its body it will refrain from unlocking it again. To
support this,
locked?
is added toILock
which checks whether alock is currently held. Also, recurring from inside a
try
form isnot allowed but would be required in this case for traversing a chain
of nodes. Thus the nodes traversal loop is changed to recur from
outside the
try
form.I'm not sure if this is the best way to fix the root problem, so feel
free to implement a better solution instead.
Oh, and I threw out some unnecessary
do
forms fromwith-lock
and
with-exclusive-lock
while I was at it :-)