From 47ed8b7b170e2fcbb8e9326bdb527bf80e5097e2 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Sun, 21 Mar 2021 08:49:59 +0900 Subject: [PATCH] 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. --- include/mutex.sh | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 include/mutex.sh 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 +} -- 2.47.3