7 Associative arrays

Associative arrays are implemented as hash tables with a maximum size set at startup. Associative arrays are too large to be created dynamically for individual probe handler runs, so they must be declared as global. The basic operations for arrays are setting and looking up elements. These operations are expressed in awk syntax: the array name followed by an opening bracket ([), a comma-separated list of up to nine index index expressions, and a closing bracket (]). Each index expression may be a string or a number, as long as it is consistently typed throughout the script.

7.1 Examples

     # Increment the named array slot:
     foo [4,"hello"] ++
     
     # Update a statistic:
     processusage [uid(),execname()] ++
     
     # Set a timestamp reference point:
     times [tid()] = get_cycles()
     
     # Compute a timestamp delta:
     delta = get_cycles() - times [tid()]

7.2 Types of values

Array elements may be set to a number, a string, or an aggregate. The type must be consistent throughout the use of the array. The first assignment to the array defines the type of the elements. Unset array elements may be fetched and return a null value (zero or empty string) as appropriate, but they are not seen by a membership test.

7.3 Array capacity

Array sizes can be specified explicitly or allowed to default to the maximum size as defined by MAXMAPENTRIES. See Section 1.6 for details on changing MAXMAPENTRIES.

You can explicitly specify the size of an array as follows:

     global ARRAY[<size>]

If you do not specify the size parameter, then the array is created to hold MAXMAPENTRIES number of elements.

7.4 Array wrapping

Arrays may be wrapped using the percentage symbol (%) causing previously entered elements to be overwritten if more elements are inserted than the array can hold. This works for both regular and statistics typed arrays.

You can mark arrays for wrapping as follows:

     global ARRAY1%[<size>], ARRAY2%

7.5 Iteration, foreach

Like awk, SystemTap’s foreach creates a loop that iterates over key tuples of an array, not only values. The iteration may be sorted by any single key or a value by adding an extra plus symbol (+) or minus symbol (-) to the code or limited to only a few elements with the limit keyword. The following are examples.

     # Simple loop in arbitrary sequence:
     foreach ([a,b] in foo)
         fuss_with(foo[a,b])
     
     # Loop in increasing sequence of value:
     foreach ([a,b] in foo+) { ... }
     
     # Loop in decreasing sequence of first key:
     foreach ([a-,b] in foo) { ... }
     
     # Print the first 10 tuples and values in the array in decreasing sequence
     foreach (v = [i,j] in foo- limit 10)
         printf("foo[%d,%s] = %d\n", i, j, v)

The break and continue statements also work inside foreach loops. Since arrays can be large but probe handlers must execute quickly, you should write scripts that exit iteration early, if possible. For simplicity, SystemTap forbids any modification of an array during iteration with a foreach.

For a full description of foreach see subsection 6.6.

7.6 Deletion

The delete statement can either remove a single element by index from an array or clear an entire array at once. See subsection 6.3 for details and examples.