]> git.corax.cc Git - toolbox/commitdiff
include/mutex: Add symlink-based mutex implementation
authorMatthias Kruk <m@m10k.eu>
Sat, 20 Mar 2021 23:49:59 +0000 (08:49 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 20 Mar 2021 23:49:59 +0000 (08:49 +0900)
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 [new file with mode: 0644]

diff --git a/include/mutex.sh b/include/mutex.sh
new file mode 100644 (file)
index 0000000..5760cfd
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+#
+# mutex - pthreads-like mutex implementation for bash scripts
+# Copyright (C) 2021 - Matthias Kruk <m@m10k.eu>
+#
+
+__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
+}