From ad8f50ec6df6d6160f1fcea895f4338233d19476 Mon Sep 17 00:00:00 2001 From: Xu Cheng Date: Mon, 2 May 2016 17:52:19 +0800 Subject: [PATCH] add utils/lock.sh a Bash implementation of lock using `flock(2)`. --- Library/Homebrew/utils/lock.sh | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Library/Homebrew/utils/lock.sh diff --git a/Library/Homebrew/utils/lock.sh b/Library/Homebrew/utils/lock.sh new file mode 100644 index 0000000000..97cf282192 --- /dev/null +++ b/Library/Homebrew/utils/lock.sh @@ -0,0 +1,38 @@ +# create a lock using `flock(2)`. A name is required as first argument. +# the lock will be automatically unlocked when the shell process quits. +# Noted due to the fixed FD, a shell process can only create one lock. +lock() { + local name="$1" + local lock_file="/tmp/homebrew${HOMEBREW_REPOSITORY//\//-}-${name}.lock" + # 200 is the file descriptor used in the lock. + # This FD should be used exclusively for lock purpose. + # Any value except 0(stdin), 1(stdout) and 2(stderr) can do the job. + # Noted, FD is unique per process but it will be shared to subprocess. + # It is recommended to choose a large number to avoid conflicting with + # other FD opened by the script. + # + # close FD first, this is required if parent process holds a different lock. + exec 200>&- + # open the lock file to FD, so the shell process can hold the lock. + exec 200>"$lock_file" + if ! _create_lock 200 + then + odie <