![]() |
1.3-rc2 (revision 6962)
|
#include <scorep/SCOREP_MetricPlugins.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /* Use mutex to make ID generation thread safe */ #include <pthread.h> /* Maximum number of metrics */ #define NUMBER_RANDOM_METRICS 5 /* Guard for metric ID generation */ static pthread_mutex_t add_metric_mutex; /* Number of individual metrics */ static int32_t num_metrics = 0; int32_t init() { return 0; } int32_t add_counter( char * event_name ) { /* ID generation has to be thread save */ int id; pthread_mutex_lock( &add_metric_mutex ); id = num_metrics; num_metrics++; pthread_mutex_unlock( &add_metric_mutex ); return id; } SCOREP_Metric_Plugin_MetricProperties* get_event_info( char * event_name ) { SCOREP_Metric_Plugin_MetricProperties *return_values; char name_buffer[255]; int i; /* If wildcard, add some random counters */ if ( strcmp( event_name, "*" ) == 0 ) { return_values = malloc( ( NUMBER_RANDOM_METRICS + 1 ) * sizeof( SCOREP_Metric_Plugin_MetricProperties ) ); for ( i = 0; i < NUMBER_RANDOM_METRICS; i++ ) { sprintf( name_buffer, "random strictly sync counter #%i", i ); return_values[ i ].name = strdup( name_buffer ); return_values[ i ].description = NULL; return_values[ i ].unit = NULL; return_values[ i ].mode = SCOREP_METRIC_MODE_ABSOLUTE_LAST; return_values[ i ].value_type = SCOREP_METRIC_VALUE_UINT64; return_values[ i ].base = SCOREP_METRIC_BASE_DECIMAL; return_values[ i ].exponent = 0; } return_values[ NUMBER_RANDOM_METRICS ].name = NULL; } else { /* If no wildcard is given create one random counter with the passed name */ return_values = malloc( 2 * sizeof( SCOREP_Metric_Plugin_MetricProperties ) ); sprintf( name_buffer, "random strictly sync counter #%s", event_name ); return_values[ 0 ].name = strdup( name_buffer ); return_values[ 0 ].description = NULL; return_values[ 0 ].unit = NULL; return_values[ 0 ].mode = SCOREP_METRIC_MODE_ABSOLUTE_LAST; return_values[ 0 ].value_type = SCOREP_METRIC_VALUE_UINT64; return_values[ 0 ].base = SCOREP_METRIC_BASE_DECIMAL; return_values[ 0 ].exponent = 0; return_values[ 1 ].name = NULL; } return return_values; } uint64_t get_value( int32_t counterIndex ) { return counterIndex; } void fini() { pthread_mutex_destroy( &add_metric_mutex ); } SCOREP_Metric_Plugin_Info get_info() { /* Initialize info data (with zero) */ SCOREP_Metric_Plugin_Info info; memset( &info, 0, sizeof( SCOREP_Metric_Plugin_Info ) ); /* Set up */ info.scorep_metric_plugin_version = SCOREP_METRIC_PLUGIN_VERSION; info.run_per = SCOREP_METRIC_PER_THREAD; info.sync = SCOREP_METRIC_STRICTLY_SYNC; info.initialize = init; info.finalize = fini; info.get_event_info = get_event_info; info.add_counter = add_counter; info.get_current_value = get_value; return info; }