]> git.plutz.net Git - serve0/commitdiff
experimental lock algorithm
authorPaul Hänsch <paul@plutz.net>
Mon, 23 Aug 2021 13:22:53 +0000 (15:22 +0200)
committerPaul Hänsch <paul@plutz.net>
Mon, 23 Aug 2021 13:22:53 +0000 (15:22 +0200)
cgilite/storage.sh

index 61eec88fb2cee63f706a634eaa48c85a09ef1967..c0f9076a2e9ebc02b8db3db9f9d52da12ba4ca46 100755 (executable)
@@ -28,38 +28,40 @@ LOCK(){
   local lock timeout block
   lock="${1}.lock"
   timeout="${2-20}"
-  if [ \! -w "${lock%/*}" ] || [ -e "$lock" -a \! -d "$lock" ]; then
+
+  if [ \! -w "${lock%/*}" ] || [ -e "$lock" -a \! -f "$lock" ]; then
     debug "Impossible to get lock: $lock"
     return 1
   fi
 
-  while ! mkdir "$lock" 2>&-; do
-    block="$(cat "$lock/pid" || printf 1)"
-    if ! { ps -eo pid |grep -qwF "$block"; }; then
+  while [ $timeout -gt 0 ]; do
+    printf '%i\n' $$ >>"${lock}"
+    read block <"$lock"
+    if [ "$block" = $$ ]; then
+      return 0
+    elif ! { ps -eo pid |grep -qwF "$block"; }; then
       debug "Overriding stale lock: $lock"
-      break
-    fi
-    if [ $timeout -le 0 ]; then
-      debug "Timeout while trying to get lock: $lock"
-      return 1
+      if LOCK "$lock" 1; then
+        rm -- "$lock"
+        RELEASE "$lock"
+      fi
+    else
+      timeout=$((timeout - 1))
+      sleep 1
     fi
-    timeout=$((timeout - 1))
-    sleep 1
   done
-  printf '%i\n' $$ >"${lock}/pid"
-  return 0
+
+  debug "Timeout while trying to get lock: $lock"
+  return 1
 }
 
 RELEASE(){
-  local lock
+  local lock block
   lock="${1}.lock"
-  if [ "$(cat "$lock/pid")" = "$$" ]; then
-    rm "$lock/pid"
-    if ! rmdir "$lock"; then
-      debug "Cannot remove tainted lock: $lock"
-      printf '%i\n' $$ >"${lock}/pid"
-      return 1
-    fi
+
+  read block <"$lock"
+  if [ "$block" = $$ ]; then
+    rm -- "$lock"
     return 0
   else
     debug "Refusing to release foreign lock: $lock"