#! /bin/sh

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

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

# so we know where SYSINFO is
. ${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

report_resource_cpu ()
{
    _cpu_count=0
    _cpu=-1
    IFS="|,"
    ${GLOBUS_SH_SYSINFO} -class device -format report -type cpu | \
    {
	while read class type name attr v1 v2 v3 v4 v5 v6 v7 v8
	do
	    IFS="$IFS_save"

	    key=`white_strip_first $type`
	    case "$key" in
		name)
		    _cpu=`$EXPR ${_cpu} + 1`
		    _cpu_speed=`white_strip_first $v6`
		    _cpu_vendor=`white_strip_first $v1`
		    _cpu_model=`white_strip $v7`
		    _cpu_count=`$EXPR ${_cpu_count} + 1`

		    eval "_cpu_${_cpu}_speed=\"${_cpu_speed}\""
		    eval "_cpu_${_cpu}_vendor=\"${_cpu_vendor}\""
		    eval "_cpu_${_cpu}_model=\"${_cpu_model}\""
		    
		    if [ ! "X${_probe_cache}" = "X" ]
		    then
			${GLOBUS_SH_CAT-cat} 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_${_cpu}_speed="${_cpu_speed}"
_cpu_${_cpu}_vendor="${_cpu_vendor}"
_cpu_${_cpu}_model="${_cpu_model}"
EOF
		    fi
		    ;;
		desc)
		    case `white_strip $attr` in
			Manufacturer\#)
			    manuf=`white_strip_first $v1`
			    ;;
			Implementation\#)
			    impl=`white_strip_first $v1`
			    ;;
			Mask\#)
			    mask=`white_strip_first $v1`
			    _cpu_version="${manuf}.${impl}.${mask}"

			    eval "_cpu_${_cpu}_version=\"${_cpu_version}\""

			    if [ ! "X${_probe_cache}" = "X" ]
			    then
				${GLOBUS_SH_CAT-cat} 2>/dev/null >> "${_probe_cache_tmp}" <<EOF
_cpu_${_cpu}_version="${_cpu_version}"
EOF
			    fi
			    ;;
			External\ Cache\ Size)
			    val=`white_strip_first $v1`
			    case `white_strip_second $v1` in
				MB)
				    _cpu_l2cache_size=`$EXPR $val \* 1024`
				    ;;
				*)
				    _cpu_l2cache_size="$val"
				    ;;
			    esac

			    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}_l2cache_size="${_cpu_l2cache_size}"
EOF
			    fi
			    ;;
		    esac
		    ;;
	    esac


	    IFS="|,"
	done

	IFS="$IFS_save"

	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
    }
}

#############
# do the work
report_resource_cpu
