#!/bin/sh

kill_users()
{
        users=$(for x in `lsof -t /dev/DspBridge`; do basename `cat /proc/$x/cmdline | tr '\0' ':' | cut -f1 -d :`; done)
        logger -s -t "dsp-recover" "FIXME! killing users of 'bridgedriver': $users"
        kill -9 `lsof -t /dev/DspBridge`
        sleep 5
}

MODULE_USAGE=`grep bridgedriver /proc/modules | cut -d ' ' -f3`
COUNT=0
while [ $MODULE_USAGE -ne 0 ]
do
	MODULE_USAGE=`grep bridgedriver /proc/modules | cut -d ' ' -f3`
	if [ $COUNT -ge 10 ]; then
                logger -t "dsp-recover" "gave up waiting for 'bridgedriver' to become free"
                kill_users
		break
	fi

        sleep 1
        COUNT=$(($COUNT + 1))
done

modprobe -r bridgedriver
if [ $? == 0 ]; then
        modprobe bridgedriver
else
        logger -t "dsp-recover" "initial restart failed, reloading image"
        /lib/dsp/cexec.out -v -T /lib/dsp/baseimage.dof | grep -q failed
        test $? != 0 # revert the result
fi
if [ $? == 0 ]; then
        logger -t "dsp-recover" "DSP restarted"
else
        logger -t "dsp-recover" "couldn't restart the DSP"
fi
