]> code.ossystems Code Review - openembedded-core.git/commitdiff
scripts/runqemu-internal: Fix lock races
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 20 Mar 2013 22:58:30 +0000 (22:58 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 27 Mar 2013 17:25:05 +0000 (17:25 +0000)
There are two problems here. Firstly the grep command is unanchored so
pid 345 will match against 12345 and so on.

The second issue is that there are several context switched between attempting
the lock and then writing the pid to it.

Between the two issues, there were issues appearing on the autobuilder due
to these conflicts. This patch replaces the mechanism with flock on fd 8
which should be a safer mechanism to use.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
scripts/runqemu-internal

index dfdde05e244a99e42b4a0c9bd53446bf2f07d56b..33fedc6c4b90d9c1d2ce7429de1f1f9d7b1ef6f2 100755 (executable)
@@ -112,18 +112,12 @@ acquire_lock() {
         return 1
     fi
 
-    if [ -e "$lockfile.lock" ]; then
-        # Check that the lockfile is not stale
-        ps=`ps -eo pid | grep $(cat $lockfile.lock)`
-        if [ -z "$ps" ]; then
-            echo "WARNING: Stale lock file detected, deleting $lockfile.lock."
-            rm -f $lockfile.lock
-            echo $$ > $lockfile.lock
-        else
-            return 1
-        fi
-    else
-        echo $$ > $lockfile.lock
+    touch $lockfile.lock
+    exec 8>$lockfile.lock
+    flock -n -x 8
+    if [ $? -ne 0 ]; then
+        exec 8>&-
+        return 1
     fi
 
     return 0
@@ -137,6 +131,7 @@ release_lock() {
     fi
 
     rm -f $lockfile.lock
+    exec  8>&-
 }
 
 LOCKDIR="/tmp/qemu-tap-locks"