#! /bin/bash


# default libexecdir used to bootstrap scripts
libexecdir=${GLOBUS_LOCATION}/libexec

# load GRIS CPU common code and initialization
. ${libexecdir}/grid-info-cpu-common

. ${libexecdir}/globus-sh-tools.sh

#########################################################################

_probe_cache_tmp=cpu-cache-$$.tmp

# set mode for cache file
umask 077

cleanup ()
{
    rm -f "$_probe_cache_tmp"
}

trap cleanup 0

cleanup

norm_k ()
{
    case "$2" in
	K*)
	    echo $1
	    ;;
	M*)
	    $EXPR $1 \* 1024
	    ;;
    esac
}

probe_resource_cpu ()
{
    if [ -x ${GLOBUS_SH_HINV} ]
    then
	${GLOBUS_SH_HINV} -v -c processor | \
	{
	    if [ ! "X${_probe_cache}" = "X" ]
	    then
		${GLOBUS_SH_CAT-cat} 2>/dev/null > "${_probe_cache_tmp}" <<EOF
EOF
	    fi

	    _cpu_count=0
	    _cpu=0
	    read cnt spd MHZ IPnum Processors
	    while read CPU num at Module numslot numslice lett \
                    cpuspeed MHz ISA model Processor Chip state
	    do
		case "${CPU}" in
		    CPU)
			_cpu_vendor="$ISA"
			_cpu_model="$model"
			_cpu_speed="$cpuspeed"
			read Processor revision version key1 key2 key3 key4 key5 \
                          rest
			case "${key1}" in
			    Secondary)
				case "$key5" in
				    MB)
					_cpu_l2cache_size=`$EXPR $key4 \* 1024`
					;;
				    KB)
					_cpu_l2cache_size="$key4"
					;;
				esac
				
				;;
			    Scache:)
				case "$key4" in
				    MB)
					_cpu_l2cache_size=`$EXPR $key3 \* 1024`
					;;
				    KB)
					_cpu_l2cache_size="$key3"
					;;
				esac
				
				;;
			    *)
				:
				;;
			esac
			_cpu_version="$version"
			eval "_cpu_${_cpu}_vendor=\"${_cpu_vendor}\""
			eval "_cpu_${_cpu}_model=\"${_cpu_model}\""
			eval "_cpu_${_cpu}_version=\"${_cpu_version}\""
			eval "_cpu_${_cpu}_speed=\"${_cpu_speed}\""
			eval "_cpu_${_cpu}_l2cache_size=\"${_cpu_l2cache_size}\""

			if [ ! "X${_probe_cache}" = "X" ]
			then
			    ${GLOBUS_SH_CAT-cat} 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_${_cpu}_vendor="${_cpu_vendor}"
_cpu_${_cpu}_model="${_cpu_model}"
_cpu_${_cpu}_version="${_cpu_version}"
_cpu_${_cpu}_speed="${_cpu_speed}"
_cpu_${_cpu}_l2cache_size="${_cpu_l2cache_size}"
EOF
			fi

			_cpu=`$EXPR ${_cpu} + 1`
			_cpu_count=`$EXPR ${_cpu_count} + 1`
			;;
		    *)
			:
			;;
		esac
	    done

	    if [ ${_cpu_count} -eq 0 ]
	    then
		# initialize the ugly way (for octane)
		_cpu_count="$cnt"
		_cpu_speed="$spd"
		{ 
		    ${GLOBUS_SH_HINV} -t cpu
		    ${GLOBUS_SH_HINV} -v -c memory
		} | \
		{
		    read CPU ISA model Processor Chip Revision rev
		    read junk
		    read junk
		    read Instruction Cache Size icache icacheunit
		    read Data Cache Size dcache dcacheunit
		    read Secondary Unified InstrData Cache Size cache cacheunit

		    ${GLOBUS_SH_CAT-cat} > /dev/null

		    _cpu_vendor="$ISA"
		    _cpu_model="$model"
		    _cpu_version="$rev"

		    _cpu_l1icache_size=`norm_k $icache $icacheunit`
		    _cpu_l1dcache_size=`norm_k $dcache $dcacheunit`
		    _cpu_l2cache_size=`norm_k $cache $cacheunit`

		    _cpu=0
		    while [ $_cpu -lt $_cpu_count ]
		    do
			eval "_cpu_${_cpu}_vendor=\"${_cpu_vendor}\""
			eval "_cpu_${_cpu}_model=\"${_cpu_model}\""
			eval "_cpu_${_cpu}_version=\"${_cpu_version}\""
			eval "_cpu_${_cpu}_speed=\"${_cpu_speed}\""
			eval "_cpu_${_cpu}_l2cache_size=\"${_cpu_l2cache_size}\""
			_cpu=`$EXPR $_cpu + 1`

			if [ ! "X${_probe_cache}" = "X" ]
			then
			    cat 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_${_cpu}_vendor="${_cpu_vendor}"
_cpu_${_cpu}_model="${_cpu_model}"
_cpu_${_cpu}_version="${_cpu_version}"
_cpu_${_cpu}_speed="${_cpu_speed}"
_cpu_${_cpu}_l2cache_size="${_cpu_l2cache_size}"
EOF
			fi
		    done

		    if [ ! "X${_probe_cache}" = "X" ]
		    then
			${GLOBUS_SH_CAT-cat} 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_count="${_cpu_count}"
EOF
			mv "${_probe_cache_tmp}" "${_probe_cache}" 2> /dev/null
		    fi

		    
		    probe_resource_cpufree_uptime

		    # run this in initialized subshell environment
		    emit_resource_cpu_descriptions
		}
	    else
		    if [ ! "X${_probe_cache}" = "X" ]
		    then
			${GLOBUS_SH_CAT-cat} 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_count="${_cpu_count}"
EOF
			mv "${_probe_cache_tmp}" "${_probe_cache}" 2> /dev/null
		    fi

		    probe_resource_cpufree_uptime

		    # run this in initialized subshell environment
		    emit_resource_cpu_descriptions
	    fi
	}
    fi
}

#############
# do the work
probe_resource_cpu
