Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

build: Add timeout to wrapper for execution on FPGA.

  • Loading branch information...
commit d2a15588c282002c89b051bfc579d3d12ac46e87 1 parent 0d5204b
Wolfgang Puffitsch authored June 09, 2011
2  fpga_config.sh
... ...
@@ -1,4 +1,4 @@
1  
-#! /bin/sh
  1
+#! /bin/bash
2 2
 
3 3
 jtag <<EOF
4 4
 bsdl path /usr/share/urjtag/bsdl/
11  fpga_exec.sh
... ...
@@ -1,17 +1,14 @@
1  
-#! /bin/sh
  1
+#! /bin/bash
2 2
 
3 3
 cat $2 > $1 &
4 4
 
5 5
 if [ "$3" = "RAW" ]; then
6 6
     # raw output
7  
-    cat $1
  7
+	cat $1
8 8
 else
9  
-    # filtered output
10  
-	awk 'BEGIN { boot = 0 }
  9
+    # filtered output with timeout
  10
+	`dirname $0`/timeout3 -t 60 awk 'BEGIN { boot = 0 }
11 11
          /^BOOT$/ { boot = 1; next }
12 12
          /^EXIT [0-9a-fA-F]+$/ { exit strtonum("0x"$2) }
13 13
          { if (boot) print }' < $1
14  
-	exit $?
15 14
 fi
16  
-
17  
-
91  timeout3
... ...
@@ -0,0 +1,91 @@
  1
+#! /bin/bash
  2
+#
  3
+# The Bash shell script executes a command with a time-out.
  4
+# Upon time-out expiration SIGTERM (15) is sent to the process. If the signal
  5
+# is blocked, then the subsequent SIGKILL (9) terminates it.
  6
+#
  7
+# Based on the Bash documentation example.
  8
+
  9
+# Hello Chet,
  10
+# please find attached a "little easier"  :-)  to comprehend
  11
+# time-out example.  If you find it suitable, feel free to include
  12
+# anywhere: the very same logic as in the original examples/scripts, a
  13
+# little more transparent implementation to my taste.
  14
+#
  15
+# Dmitry V Golovashkin <Dmitry.Golovashkin@sas.com>
  16
+
  17
+scriptName="${0##*/}"
  18
+
  19
+declare -i DEFAULT_TIMEOUT=9
  20
+declare -i DEFAULT_INTERVAL=1
  21
+declare -i DEFAULT_DELAY=1
  22
+
  23
+# Timeout.
  24
+declare -i timeout=DEFAULT_TIMEOUT
  25
+# Interval between checks if the process is still alive.
  26
+declare -i interval=DEFAULT_INTERVAL
  27
+# Delay between posting the SIGTERM signal and destroying the process by SIGKILL.
  28
+declare -i delay=DEFAULT_DELAY
  29
+
  30
+function printUsage() {
  31
+    cat <<EOF
  32
+
  33
+Synopsis
  34
+    $scriptName [-t timeout] [-i interval] [-d delay] command
  35
+    Execute a command with a time-out.
  36
+    Upon time-out expiration SIGTERM (15) is sent to the process. If SIGTERM
  37
+    signal is blocked, then the subsequent SIGKILL (9) terminates it.
  38
+
  39
+    -t timeout
  40
+        Number of seconds to wait for command completion.
  41
+        Default value: $DEFAULT_TIMEOUT seconds.
  42
+
  43
+    -i interval
  44
+        Interval between checks if the process is still alive.
  45
+        Positive integer, default value: $DEFAULT_INTERVAL seconds.
  46
+
  47
+    -d delay
  48
+        Delay between posting the SIGTERM signal and destroying the
  49
+        process by SIGKILL. Default value: $DEFAULT_DELAY seconds.
  50
+
  51
+As of today, Bash does not support floating point arithmetic (sleep does),
  52
+therefore all delay/time values must be integers.
  53
+EOF
  54
+}
  55
+
  56
+# Options.
  57
+while getopts ":t:i:d:" option; do
  58
+    case "$option" in
  59
+        t) timeout=$OPTARG ;;
  60
+        i) interval=$OPTARG ;;
  61
+        d) delay=$OPTARG ;;
  62
+        *) printUsage; exit 1 ;;
  63
+    esac
  64
+done
  65
+shift $((OPTIND - 1))
  66
+
  67
+# $# should be at least 1 (the command to execute), however it may be strictly
  68
+# greater than 1 if the command itself has options.
  69
+if (($# == 0 || interval <= 0)); then
  70
+    printUsage
  71
+    exit 1
  72
+fi
  73
+
  74
+# kill -0 pid   Exit code indicates if a signal may be sent to $pid process.
  75
+(
  76
+    ((t = timeout))
  77
+
  78
+    while ((t > 0)); do
  79
+        sleep $interval
  80
+        kill -0 $$ || exit 0
  81
+        ((t -= interval))
  82
+    done
  83
+
  84
+    # Be nice, post SIGTERM first.
  85
+    # The 'exit 0' below will be executed if any preceeding command fails.
  86
+    kill -s SIGTERM $$ && kill -0 $$ || exit 0
  87
+    sleep $delay
  88
+    kill -s SIGKILL $$
  89
+) 2> /dev/null &
  90
+
  91
+exec "$@"

0 notes on commit d2a1558

Please sign in to comment.
Something went wrong with that request. Please try again.