From 0236c3dfb4b33a0d5bde96c0c99edace879715a9 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Tue, 14 Feb 2017 16:12:06 +0100 Subject: [PATCH] meta-digi-dey: suspend: add critical section Add critical section in suspend script to avoid that more than one instance can be executed concurrently. This happens, for instance, when the power button key is pressed while the system is resuming, causing issues on the wifi interface. Signed-off-by: Mike Engel https://jira.digi.com/browse/DEL-3694 --- .../busybox/busybox-1.23.2/suspend | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/suspend b/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/suspend index 84699c6d0..ec0da8101 100755 --- a/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/suspend +++ b/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/suspend @@ -3,7 +3,7 @@ # # suspend # -# Copyright (C) 2009-2014 by Digi International Inc. +# Copyright (C) 2009-2017 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -17,6 +17,8 @@ scriptname="$(basename ${0})" syspower="/sys/power/state" +lockfile="/var/lock/${scriptname}.lock" +lockfd="9" usage() { printf "\nSuspend system to RAM memory\n" @@ -37,6 +39,21 @@ resume_interfaces() { fi } +enter_critical_section() { + # Create lock file + eval "exec ${lockfd}>${lockfile}" + + # Acquire the lock in non blocking mode. Otherwise, additional calls + # to the script will be queued and the system will endlessly go in + # and out of suspend to ram + flock -n "${lockfd}" || exit 0 +} + +exit_critical_section() { + # Release the lock + flock -u "${lockfd}" +} + while getopts "h" c; do case "${c}" in h) usage; exit;; @@ -44,6 +61,9 @@ while getopts "h" c; do done if [ -f "${syspower}" ]; then + # Avoid running multiple instances of this script in parallel + enter_critical_section + # Pre-suspend actions suspend_interfaces @@ -53,6 +73,8 @@ if [ -f "${syspower}" ]; then # Post-resume actions resume_interfaces + + exit_critical_section else printf "\n[ERROR] File ${syspower} not found\n\n" fi