This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
RE: Fwd: Any way to find the network usage by a process?
- From: "Stone, Joshua I" <joshua dot i dot stone at intel dot com>
- To: "Frank Ch. Eigler" <fche at redhat dot com>, "Mike Mason" <mmlnx at us dot ibm dot com>
- Cc: <systemtap at sources dot redhat dot com>
- Date: Thu, 5 Oct 2006 18:08:34 -0700
- Subject: RE: Fwd: Any way to find the network usage by a process?
On Thursday, October 05, 2006 5:00 PM, Frank Ch. Eigler wrote:
> Hi -
>
> On Thu, Oct 05, 2006 at 04:28:10PM -0700, Mike Mason wrote:
>> [...]
>> ERROR: empty aggregate near identifier 'execname' at nettop.stp:35:4
>> WARNING: Number of errors: 1, skipped probes: 0
>> Apparently using @sum on empty aggregates isn't allowed. I expected
>> 0's to be returned.
>
> As a judgement call, to be consistent with other extractors like @avg,
> the @sum etc. of an empty set was deemed to be undefined.
FWIW, Python allows you to take the sum of an empty list, even though
other equivalent extractors fail:
>>> sum([])
0
>>> max([])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: min() or max() arg is an empty sequence
I'm just looking for precedence in other languages...
>> The only way to avoid the error is use @sum only if @count >
>> 0, which makes the printf too complex in my opinion.
>
> Maybe so. It's worth considering some syntactic sugar to express a
> undefined=>0 intent.
One possibility is an optional second parameter to the extractor that
gives a default value. We could require this to be a constant (usually
0), or maybe even allow a numeric expression.
a <<< 1; del a // prepare an empty aggregate
printf("%d\n", @sum(a)) // runtime error
printf("%d\n", @sum(a, 0)) // prints 0
printf("%d\n", @sum(a, x)) // prints value of x
This works for min, max, and avg as well.
Or, instead of a default, it might be less confusing to consider the
second parameter as an initializer -- so when 'a' isn't empty, @sum(a,x)
== x + @sum(a). Then min and max would effectively get an upper and
lower bound, respectively. I'm not sure if avg works well this way
though.
Josh