From: Matthias Kruk Date: Sat, 20 Mar 2021 23:49:59 +0000 (+0900) Subject: include/mutex: Add symlink-based mutex implementation X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=47ed8b7b170e2fcbb8e9326bdb527bf80e5097e2;p=toolbox include/mutex: Add symlink-based mutex implementation Scripts that access shared resources need a means to synchronize accesses to those resources. This commit adds a symlink-based mutex implementation that can be used for this purpose. --- diff --git a/include/mutex.sh b/include/mutex.sh new file mode 100644 index 0000000..5760cfd --- /dev/null +++ b/include/mutex.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# +# mutex - pthreads-like mutex implementation for bash scripts +# Copyright (C) 2021 - Matthias Kruk +# + +__init() { + return 0 +} + +mutex_trylock() { + local lock + + lock="$1" + + if ! ln -s "$$" "$lock" &> /dev/null; then + return 1 + fi + + return 0 +} + +mutex_lock() { + local lock + + lock="$1" + + while ! mutex_trylock "$lock"; do + sleep 1 + done + + return 0 +} + +mutex_unlock() { + local lock + local owner + + lock="$1" + + if ! owner=$(readlink "$lock" 2> /dev/null); then + return 1 + fi + + if [ "$owner" -ne "$$" ]; then + return 2 + fi + + if ! rm -f "$lock"; then + return 3 + fi + + return 0 +}