#! /bin/sh
# PCP QA Test No. 639
# pmnsadd concurrency issues - pv #826904
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

seq=`basename $0`

rm -f $seq.out
if [ $PCP_VER -lt 3600 ]
then
    ln $seq.out.1 $seq.out || exit 1
else
    ln $seq.out.2 $seq.out || exit 1
fi

echo "QA output created by $seq"

status=0	# success is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15

_add()
{
    while true
    do
	pmlock $tmp.root.lock && break
	sleep 1
    done
    pmnsadd -n $tmp.root $1
    rm -f $tmp.root.lock
}

cat <<End-of-File >$tmp.master
/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/
root {
    one
    two
    keep1 	1:0:1
    keep2 	2:0:2
}
/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/

one {
    one
}
/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/

one.one {
    one
}
/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/

one.one.one {
    keep4	4:0:4
}
/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/

two {
    keep3 	3:0:3
}

/*
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
*/
End-of-File

cat <<End-of-File >$tmp.d1
root {
    d1		1:1:1
}
End-of-File

cat <<End-of-File >$tmp.one.d2
one {
    d2		2:1:2
}
End-of-File

cat <<End-of-File >$tmp.one.one.d3
one.one {
    d3		3:1:3
}
End-of-File

cat <<End-of-File >$tmp.one.one.d6
one.one {
    d6		6:1:6
}
End-of-File

cat <<End-of-File >$tmp.one.one.d7
one.one {
    d7		7:1:7
}
End-of-File

cat <<End-of-File >$tmp.one.one.d8
one.one {
    d8		8:1:8
}
End-of-File

cat <<End-of-File >$tmp.two.d4
two {
    d4		4:1:4
}
End-of-File

cat <<End-of-File >$tmp.two.d9
two {
    d9		9:1:9
}
End-of-File

cat <<End-of-File >$tmp.three.one.d5
three.one {
    d5		5:1:5
}
End-of-File

# real QA test starts here
echo "Initial state ..."
pminfo -m -n $tmp.master

echo
echo "Serial additions ..."
echo "Serial additions ..." >$seq.full
cp $tmp.master $tmp.root
for m in $tmp.d1 $tmp.one.d2 $tmp.one.one.d3 $tmp.two.d4 $tmp.three.one.d5 \
	 $tmp.one.one.d6 $tmp.one.one.d7 $tmp.one.one.d8 $tmp.two.d9
do
    pmnsadd -n $tmp.root $m 2>&1
done \
| tee -a $seq.full \
| grep ' leaf' \
| LC_COLLATE=POSIX sort -nr
echo
pminfo -m -n $tmp.root | LC_COLLATE=POSIX sort

echo
echo "Parallel additions ..."
echo "Parallel additions ..." >>$seq.full
cp $tmp.master $tmp.root
rm -f $tmp*.out
for m in $tmp.d1 $tmp.one.d2 $tmp.one.one.d3 $tmp.two.d4 $tmp.three.one.d5 \
	 $tmp.one.one.d6 $tmp.one.one.d7 $tmp.one.one.d8 $tmp.two.d9
do
    _add $m >$m.out 2>&1 &
done
wait

cat $tmp*.out \
| grep ' leaf' \
| LC_COLLATE=POSIX sort -nr
echo

for f in $tmp*.out
do
    echo >>$seq.full
    echo "=== $f ===" >>$seq.full
    cat $f >>$seq.full
done

pminfo -m -n $tmp.root | LC_COLLATE=POSIX sort

# success, all done
exit
