2 #include "libbenchmark_topology_internal.h"
8 /****************************************************************************/
9 void libbenchmark_topology_query( struct libbenchmark_topology_state *ts, enum libbenchmark_topology_query query_type, void *query_input, void *query_output )
11 LFDS710_PAL_ASSERT( ts != NULL );
13 // TRD : query type can be any value in its range
14 // TRD : query_input can be NULL in some cases
15 // TRD : query_outputput can be NULL in some cases
19 case LIBBENCHMARK_TOPOLOGY_QUERY_GET_NUMBER_OF_NODE_TYPE:
21 enum libbenchmark_topology_node_type
27 struct lfds710_btree_au_element
30 struct libbenchmark_topology_node_state
33 // TRD : query_input is an enum and so can be 0
34 LFDS710_PAL_ASSERT( query_output != NULL );
36 type = (enum libbenchmark_topology_node_type) (lfds710_pal_uint_t) query_input;
37 count = (lfds710_pal_uint_t *) query_output;
41 while( lfds710_btree_au_get_by_absolute_position_and_then_by_relative_position(&ts->topology_tree, &baue, LFDS710_BTREE_AU_ABSOLUTE_POSITION_LARGEST_IN_TREE, LFDS710_BTREE_AU_RELATIVE_POSITION_NEXT_SMALLER_ELEMENT_IN_ENTIRE_TREE) )
43 tns = LFDS710_BTREE_AU_GET_VALUE_FROM_ELEMENT( *baue );
45 if( tns->type == type )
51 case LIBBENCHMARK_TOPOLOGY_QUERY_GET_NUMA_NODE_FOR_LOGICAL_PROCESSOR:
53 struct lfds710_btree_au_element
56 struct libbenchmark_topology_node_state
60 LFDS710_PAL_ASSERT( query_input != NULL );
61 LFDS710_PAL_ASSERT( query_output != NULL );
63 *(struct libbenchmark_topology_node_state **) query_output = NULL;
65 tns_lp = (struct libbenchmark_topology_node_state *) query_input;
67 // TRD : find the LP, the climb the tree to the first larger NUMA node
69 lfds710_btree_au_get_by_key( &ts->topology_tree, NULL, tns_lp, &baue );
71 while( lfds710_btree_au_get_by_relative_position(&baue,LFDS710_BTREE_AU_RELATIVE_POSITION_NEXT_LARGER_ELEMENT_IN_ENTIRE_TREE) )
73 tns = LFDS710_BTREE_AU_GET_VALUE_FROM_ELEMENT( *baue );
75 if( tns->type == LIBBENCHMARK_TOPOLOGY_NODE_TYPE_NUMA )
79 if( tns->type == LIBBENCHMARK_TOPOLOGY_NODE_TYPE_NUMA )
80 *(struct libbenchmark_topology_node_state **) query_output = tns;