The function
modify-hash
locks the hash table
hash-table
. It then calls the function
function
with three arguments:
key
, the value currently associated with
key
in
hash-table
(if any), and a flag which is true if the key was in the table. (This last argument is needed in case the associated value is
nil
).
modify-hash
then sets the result of the function
function
as the value for
key
in the table.
modify-hash
returns two values, the
new-value
and the
key
.
(with-hash-table-locked
hash-table
(multiple-value-bind (value found-p)
(gethash key hash-table )
(let ((new-value (funcall function
key value found-p)))
(setf (gethash key hash-table ) new-value)
(values new-value key ))))
but
modify-hash
should be more efficient.
It is guaranteed that no other thread can modify the value associated with
key
until
modify-hash
returns.
function is called with hash-table locked, so it should not do anything that may require hanging the modification, or that waits for another process that tries to modify the table.