From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684339517; x=1686931517; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=7q6nz2hvQ/WcXM6erusmjvbjVgIUTOGgm5lQV58l77E=; b=IDysP93/NhOVr2x/b0h4+0gO0Y19KU/oJ4FGtuDRs9Pjh+F0j1dAlTmuFI1Cj9JZpT DoDqNk21O5I92FUsQ7BeUxtqYzUyH8FmM6HO1G860F1KUI9GTwcfr3psxrocA2lENE4z 1ARO4WqSyI8N0xDTfFhRoM9BvIwjzfAfVKnN+Ud84PIs3e+uWVaHtwp58yTrAVrbeLVt EzGyI+GK8YqFWEgNoURaxYJqAK9TEufBWAJAx9PEaUSpwZfloFezvii4dtNwTdvIndZh ag5eRj5Y7gsjoYeG97zRKB+fC72apu6Nv2q5xwY6+yCsp1t4Ft5WPo22hmeGDzIdL4Or UWsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684339517; x=1686931517; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7q6nz2hvQ/WcXM6erusmjvbjVgIUTOGgm5lQV58l77E=; b=mGjtk3IYUAzvS143XL1D8eZDUyOdHQCXybKxq2DDmkv3XiAh7PnBtkVT9yaVIKYZtv m1gF3ehHcHbDlK0fID9WySuXZHPg4WjW/wqsrSxwACncq7cDeT3oT3PHlzJCqGc2isNI nSaerMt3ao4om0tPbvH5HODTy7JK1BVSLKzLrLn0lsrUaqEKUZDCzGhutiokgVGV48pJ xQjOI0dzI/CyRhZBKuGvsDkB9RbnKlp41Hu9NVwvnGOIFGwG4Lcizx47TMrcmDGuO5xN 3/Drn69s6iH8dbI+Lcq0hXXPWd2W2Jyu4GAS3hLt4nsLXjiwcNPKvxKj40LhuVcla9i9 Xr1A== X-Gm-Message-State: AC+VfDy+THdqH0UCb67lHEuOfFE/HRWZP2uo58LYxAALWJMA3eq+fyZS RsmbJrg67SxALnXVW5mOnFGPvpjv+C0= X-Google-Smtp-Source: ACHHUZ4uedoSY3YYGt/r+3oT+FvQ2GAs/ZGxypNOmRIwZnwM9YaqM6ZY/6sSIE/9/3nu78XKKPbNOw== X-Received: by 2002:adf:f3c1:0:b0:307:95d1:d7d0 with SMTP id g1-20020adff3c1000000b0030795d1d7d0mr1118785wrp.39.1684339516798; Wed, 17 May 2023 09:05:16 -0700 (PDT) From: Alexey Gladkov To: make-initrd@lists.altlinux.org Date: Wed, 17 May 2023 18:04:40 +0200 Message-Id: <437d45dddaf15bd1151aaa058a6f7f3a41b5929a.1684332365.git.gladkov.alexey@gmail.com> X-Mailer: git-send-email 2.33.8 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [make-initrd] [PATCH 1/3] runtime: Add locking functions based on flock utility X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 May 2023 16:05:20 -0000 Archived-At: List-Archive: Signed-off-by: Alexey Gladkov --- data/bin/shell-locks | 40 +++++++++++++++ testing/units/runtime-locks/ts0001/expect | 24 +++++++++ testing/units/runtime-locks/ts0001/lock-1 | 0 testing/units/runtime-locks/ts0001/lock-2 | 0 testing/units/runtime-locks/ts0001/lock-3 | 0 testing/units/runtime-locks/ts0001/run | 61 +++++++++++++++++++++++ testing/units/runtime-locks/ts0002/expect | 5 ++ testing/units/runtime-locks/ts0002/lock-1 | 0 testing/units/runtime-locks/ts0002/lock-2 | 0 testing/units/runtime-locks/ts0002/lock-3 | 0 testing/units/runtime-locks/ts0002/run | 25 ++++++++++ testing/units/runtime-locks/ts0003/expect | 9 ++++ testing/units/runtime-locks/ts0003/lock-1 | 0 testing/units/runtime-locks/ts0003/lock-2 | 0 testing/units/runtime-locks/ts0003/lock-3 | 0 testing/units/runtime-locks/ts0003/run | 38 ++++++++++++++ 16 files changed, 202 insertions(+) create mode 100644 data/bin/shell-locks create mode 100644 testing/units/runtime-locks/ts0001/expect create mode 100644 testing/units/runtime-locks/ts0001/lock-1 create mode 100644 testing/units/runtime-locks/ts0001/lock-2 create mode 100644 testing/units/runtime-locks/ts0001/lock-3 create mode 100755 testing/units/runtime-locks/ts0001/run create mode 100644 testing/units/runtime-locks/ts0002/expect create mode 100644 testing/units/runtime-locks/ts0002/lock-1 create mode 100644 testing/units/runtime-locks/ts0002/lock-2 create mode 100644 testing/units/runtime-locks/ts0002/lock-3 create mode 100755 testing/units/runtime-locks/ts0002/run create mode 100644 testing/units/runtime-locks/ts0003/expect create mode 100644 testing/units/runtime-locks/ts0003/lock-1 create mode 100644 testing/units/runtime-locks/ts0003/lock-2 create mode 100644 testing/units/runtime-locks/ts0003/lock-3 create mode 100755 testing/units/runtime-locks/ts0003/run diff --git a/data/bin/shell-locks b/data/bin/shell-locks new file mode 100644 index 00000000..1b855761 --- /dev/null +++ b/data/bin/shell-locks @@ -0,0 +1,40 @@ +#!/bin/bash -efu +# SPDX-License-Identifier: GPL-2.0-or-later + +if [ -z "${__included_shell_locks-}" ]; then +__included_shell_locks=1 + +_fd_lock() +{ + local fd="$1"; shift + local fn="$1"; shift + eval "exec $fd<\"$fn\"" + flock "$@" "$fd" +} + +fd_rlock() { _fd_lock "$1" "$2" -s; } +fd_lock() { _fd_lock "$1" "$2" -x; } +fd_trylock() { _fd_lock "$1" "$2" -n; } + +fd_unlock() +{ + eval "exec $1<&-" +} + +fd_is_locked() +{ + local fd=0 + while [ -e "/proc/self/fd/$fd" ]; do + fd=$(( $fd + 1 )) + done + + if fd_trylock "$fd" "$1"; then + fd_unlock "$fd" + return 1 + fi + + eval "exec $fd<&-" + return 0 +} + +fi #__included_shell_locks diff --git a/testing/units/runtime-locks/ts0001/expect b/testing/units/runtime-locks/ts0001/expect new file mode 100644 index 00000000..7272e014 --- /dev/null +++ b/testing/units/runtime-locks/ts0001/expect @@ -0,0 +1,24 @@ +=== step 1 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/92:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/93:lock: 1: FLOCK ADVISORY WRITE +=== step 2 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/93:lock: 1: FLOCK ADVISORY WRITE +=== step 3 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/92:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/93:lock: 1: FLOCK ADVISORY WRITE +=== step 4 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/92:lock: 1: FLOCK ADVISORY WRITE +/proc/self/fdinfo/93:lock: 1: FLOCK ADVISORY WRITE +=== step 5 === +=== step 6 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY READ +/proc/self/fdinfo/92:lock: 1: FLOCK ADVISORY READ +/proc/self/fdinfo/93:lock: 1: FLOCK ADVISORY READ +unable to take write lock +=== step 7 === +/proc/self/fdinfo/94:lock: 1: FLOCK ADVISORY WRITE +rc=0 diff --git a/testing/units/runtime-locks/ts0001/lock-1 b/testing/units/runtime-locks/ts0001/lock-1 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0001/lock-2 b/testing/units/runtime-locks/ts0001/lock-2 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0001/lock-3 b/testing/units/runtime-locks/ts0001/lock-3 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0001/run b/testing/units/runtime-locks/ts0001/run new file mode 100755 index 00000000..be71fbea --- /dev/null +++ b/testing/units/runtime-locks/ts0001/run @@ -0,0 +1,61 @@ +#!/bin/bash -eu + +cwd="${0%/*}" + +. data/bin/shell-locks + +show_self_locks() +{ + grep -E -o -e "^lock:.* FLOCK .* (READ|WRITE) " "/proc/self/fdinfo"/* 2>/dev/null ||: +} + +fd_lock 91 "$cwd/lock-1" +fd_lock 92 "$cwd/lock-2" +fd_lock 93 "$cwd/lock-3" + +echo === step 1 === +show_self_locks + +fd_unlock 92 + +echo === step 2 === +show_self_locks + +fd_lock 92 "$cwd/lock-2" + +echo === step 3 === +show_self_locks + +fd_trylock 92 "$cwd/lock-2" + +echo === step 4 === +show_self_locks + +fd_unlock 91 +fd_unlock 92 +fd_unlock 93 + +echo === step 5 === +show_self_locks + +fd_rlock 91 "$cwd/lock-1" +fd_rlock 92 "$cwd/lock-1" +fd_rlock 93 "$cwd/lock-1" + +echo === step 6 === +show_self_locks + +fd_trylock 94 "$cwd/lock-1" || + echo "unable to take write lock" + +fd_unlock 91 +fd_unlock 92 +fd_unlock 93 + +fd_trylock 94 "$cwd/lock-1" || + echo "unable to take write lock" + +echo === step 7 === +show_self_locks + + diff --git a/testing/units/runtime-locks/ts0002/expect b/testing/units/runtime-locks/ts0002/expect new file mode 100644 index 00000000..51f65a47 --- /dev/null +++ b/testing/units/runtime-locks/ts0002/expect @@ -0,0 +1,5 @@ +=== step 1 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +=== step 2 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +rc=0 diff --git a/testing/units/runtime-locks/ts0002/lock-1 b/testing/units/runtime-locks/ts0002/lock-1 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0002/lock-2 b/testing/units/runtime-locks/ts0002/lock-2 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0002/lock-3 b/testing/units/runtime-locks/ts0002/lock-3 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0002/run b/testing/units/runtime-locks/ts0002/run new file mode 100755 index 00000000..70c8257a --- /dev/null +++ b/testing/units/runtime-locks/ts0002/run @@ -0,0 +1,25 @@ +#!/bin/bash -eu + +cwd="${0%/*}" + +. data/bin/shell-locks + +show_self_locks() +{ + grep -E -o -e "^lock:.* FLOCK .* (READ|WRITE) " "/proc/self/fdinfo"/* 2>/dev/null ||: +} + +fd_lock 91 "$cwd/lock-1" +fd_lock 91 "$cwd/lock-2" +fd_lock 91 "$cwd/lock-3" + +echo === step 1 === +show_self_locks + +fd_lock 91 "$cwd/lock-1" +fd_lock 91 "$cwd/lock-1" +fd_lock 91 "$cwd/lock-1" + +echo === step 2 === +show_self_locks + diff --git a/testing/units/runtime-locks/ts0003/expect b/testing/units/runtime-locks/ts0003/expect new file mode 100644 index 00000000..0cd65029 --- /dev/null +++ b/testing/units/runtime-locks/ts0003/expect @@ -0,0 +1,9 @@ +=== step 1 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY WRITE +lock-1 locked +=== step 2 === +lock-1 unlocked +=== step 3 === +/proc/self/fdinfo/91:lock: 1: FLOCK ADVISORY READ +lock-1 locked +rc=0 diff --git a/testing/units/runtime-locks/ts0003/lock-1 b/testing/units/runtime-locks/ts0003/lock-1 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0003/lock-2 b/testing/units/runtime-locks/ts0003/lock-2 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0003/lock-3 b/testing/units/runtime-locks/ts0003/lock-3 new file mode 100644 index 00000000..e69de29b diff --git a/testing/units/runtime-locks/ts0003/run b/testing/units/runtime-locks/ts0003/run new file mode 100755 index 00000000..dd972973 --- /dev/null +++ b/testing/units/runtime-locks/ts0003/run @@ -0,0 +1,38 @@ +#!/bin/bash -eu + +cwd="${0%/*}" + +. data/bin/shell-locks + +show_self_locks() +{ + grep -E -o -e "^lock:.* FLOCK .* (READ|WRITE) " "/proc/self/fdinfo"/* 2>/dev/null ||: +} + +fd_lock 91 "$cwd/lock-1" + +echo === step 1 === +show_self_locks + +fd_is_locked "$cwd/lock-1" && + echo lock-1 locked || + echo lock-1 unlocked + +fd_unlock 91 + +echo === step 2 === +show_self_locks + +fd_is_locked "$cwd/lock-1" && + echo lock-1 locked || + echo lock-1 unlocked + +fd_rlock 91 "$cwd/lock-1" + +echo === step 3 === +show_self_locks + +fd_is_locked "$cwd/lock-1" && + echo lock-1 locked || + echo lock-1 unlocked + -- 2.33.8