c++: Implement modules ABI for vtable emissions
[official-gcc.git] / gcc / lock-and-run.sh
bloba1360adab52d847d9f211c3bff59811c760c72d6
1 #! /bin/sh
2 # Shell-based mutex using mkdir. This script is used in make to prefer
3 # serialized execution to avoid consuming too much RAM. If reusing it,
4 # bear in mind that the lock-breaking logic is not race-free, so disable
5 # it in err() if concurrent execution could cause more serious problems.
7 self=`basename $0`
8 lockdir="$1" prog="$2"; shift 2 || exit 1
10 # Remember when we started trying to acquire the lock.
11 count=0
13 err () {
14 if test -f $lockdir/lock-$1.$$; then
15 rm -rf $lockdir
16 echo "$self: *** (PID $$) removed stale $lockdir" >&2
18 # Possible variant for uses where races are more problematic:
19 #echo "$self: *** (PID $$) giving up, maybe rm -r $lockdir" >&2
20 #exit 42
21 else
22 touch $lockdir/lock-$1.$$
26 until mkdir "$lockdir" 2>/dev/null; do
27 # Say something periodically so the user knows what's up.
28 if [ `expr $count % 30` = 0 ]; then
29 # Check for valid lock.
30 if pid=`cat $lockdir/pid 2>/dev/null` && kill -0 $pid 2>/dev/null; then
31 echo "$self: (PID $$) waiting $count sec to acquire $lockdir from PID $pid" >&2
32 elif test -z "$pid"; then
33 echo "$self: (PID $$) cannot read $lockdir/pid" >&2
34 err nopid
35 else
36 echo "$self: (PID $$) cannot signal $lockdir owner PID $pid" >&2
37 err dead
40 sleep 1
41 count=`expr $count + 1`
42 done
44 trap 'rm -rf "$lockdir"' 0
45 echo $$ > $lockdir/pidT && mv $lockdir/pidT $lockdir/pid
46 echo "$self: (PID $$) acquired $lockdir after $count seconds" >&2
48 echo $prog "$@"
49 $prog "$@"
51 # The trap runs on exit.