Blob Blame History Raw
#! /bin/sh
# courtesy of Jarek Nieplocha, to clean ipc's
# Modified by Bill Gropp to apply only to calling user
ipccmd=ipcrm
username=`whoami`
for arg in "$@" ; do
   case $arg in
	-help|-u|-us*|-h)
	echo "cleanipcs [-show] [-echo]"
	exit 1
	;;
	-echo)
	set -x
	;;
	-show)
	ipccmd="echo ipcrm"
	;;
	*)
	if [ -n "$arg" ] ; then
  	    echo "Unrecognized argument $arg"
	    exit 1
	fi
	;;
   esac
done
#
# LINUX uses an incompatible form of the ipcrm command!  Try to detect this
# An earlier version looked at the output of ipcrm, but that output
# keeps changing.  The following code from Ralf Wildenhues attempts to 
# use the Linux /proc interface instead.
#statvalue=`ipcrm 2>&1`
#if [ $? != 0 ] ; then 
#    if [ "$statvalue" = 'usage: ipcrm [shm | msg | sem] id' ] ; then
#        UseLinux=1
#    fi
#fi
#if [ $UseLinux = 0 ] ; then
if [ x`uname -s` = xLinux ] ; then
    # try to use /proc interface if possible
    # and hope it does not change too often
    if [ -r /proc/sysvipc/shm  ] ; then
    	cat /proc/sysvipc/shm \
	| gawk '{if ($8 == uid) printf("%s %s\n", comm, $2)}' uid=$UID comm="$ipccmd shm " \
	| sh > /dev/null
    else
	ipcs -m \
	| gawk '{if ($3 == name) printf("%s %s\n", comm, $2)}' name=$username comm="$ipccmd shm " \
	| sh > /dev/null
    fi
    if [ -r /proc/sysvipc/sem ] ; then
    	cat /proc/sysvipc/sem \
	| gawk '{if ($5 == uid) printf("%s %s\n", comm, $2)}' uid=$UID comm="$ipccmd sem " \
	| sh > /dev/null
    else
	ipcs -s \
	| gawk '{if ($3 == name) printf("%s %s\n", comm, $2)}' name=$username comm="$ipccmd sem " \
	| sh > /dev/null
    fi
else
    $ipccmd `ipcs | awk '{if ((($1 == "m") || ($1 == "s")) && ($5 == "'$username'")) print sprintf("-%s %s",$1,$2) }'`
fi
#
# Here is the old LINUX code
#    #
#    # For LINUX, we need this instead:
#    ipcs -m | gawk '{if ($3 == name) printf("%s %s\n", comm, $2)}' name=$username comm="$ipccmd shm " | sh > /dev/null
#    ipcs -s | gawk '{if ($3 == name) printf("%s %s\n", comm, $2)}' name=$username comm="$ipccmd sem " | sh > /dev/null
#
# mpirun could call this for systems that use SYSV shared memory features,
# just to keep them friendly.