16static inline int cast_and_store(
void *data,
long long int previous_value,
void *rslt_ptr,
int cntr_type);
22static papisde_library_desc_t *
find_library_by_name(
const char *library_name, papisde_control_t *gctl);
38 SDEDBG(
"sdei_get_global_struct(): global SDE control struct is being allocated.\n");
55 if( (NULL == gctl) || (NULL == library_name) )
58 papisde_library_desc_t *tmp_lib = gctl->lib_list_head;
60 while(NULL != tmp_lib){
61 char *tmp_name = tmp_lib->libraryName;
62 SDEDBG(
"Checking library: '%s' against registered library: '%s'\n", library_name, tmp_lib->libraryName);
64 if( (NULL != tmp_name) && !strcmp(tmp_name, library_name) )
67 tmp_lib = tmp_lib->next;
80 SDEDBG(
"insert_library_handle(): inserting new handle for library: '%s'\n",lib_handle->libraryName);
81 lib_handle->next = gctl->lib_list_head;
82 gctl->lib_list_head = lib_handle;
93 papisde_library_desc_t *tmp_lib;
95 SDEDBG(
"Registering library: '%s'\n",name_of_library);
99 if( NULL != tmp_lib ){
104 tmp_lib = ( papisde_library_desc_t* ) calloc( 1,
sizeof( papisde_library_desc_t ) );
105 tmp_lib->libraryName = strdup(name_of_library);
115 sde_counter_t *item = (sde_counter_t *)calloc(1,
sizeof(sde_counter_t));
119 item->u = cntr_union;
120 item->cntr_class = cntr_class;
121 item->cntr_type = cntr_type;
122 item->cntr_mode = cntr_mode;
123 item->glb_uniq_id = uniq_id;
124 item->name = strdup(
name );
125 item->description = strdup(
name );
126 item->which_lib = lib_handle;
137 sde_counter_t *tmp_cset;
139 if( NULL == list_head )
142 tmp_cset = (sde_counter_t *)cset_handle;
143 if( (NULL == tmp_cset) || !
IS_CNTR_CSET(tmp_cset) || (NULL == tmp_cset->u.cntr_cset.data) ){
144 SDE_ERROR(
"sdei_counting_set_to_list(): 'cset_handle' is clobbered.");
158 papisde_library_desc_t *lib_handle;
159 sde_counter_t *tmp_item;
160 uint32_t counter_uniq_id;
161 char *full_event_name;
163 int needs_overflow = 0;
165 lib_handle = (papisde_library_desc_t *)
handle;
166 if( (NULL == lib_handle) || (NULL == lib_handle->libraryName) ){
167 SDE_ERROR(
"sdei_setup_counter_internals(): 'handle' is clobbered. Unable to register counter.");
171 size_t str_len = strlen(lib_handle->libraryName)+strlen(
event_name)+2+1;
172 full_event_name = (
char *)malloc(str_len*
sizeof(
char));
173 snprintf(full_event_name, str_len,
"%s::%s", lib_handle->libraryName,
event_name);
175 SDEDBG(
"%s: Counter: '%s' will be added in library: %s.\n", __FILE__, full_event_name, lib_handle->libraryName);
178 SDE_ERROR(
"Unknown mode %d. SDE counter mode must be either Instant or Delta.",cntr_mode);
179 free(full_event_name);
186 if( NULL != tmp_item ){
189 SDEDBG(
"%s: Counter: '%s' was already in library: %s.\n", __FILE__, full_event_name, lib_handle->libraryName);
190 free(full_event_name);
199 SDEDBG(
"%s: Updating placeholder for counter: '%s' in library: %s.\n", __FILE__, full_event_name, lib_handle->libraryName);
201 tmp_item->u = cntr_union;
202 tmp_item->cntr_class = cntr_class;
203 tmp_item->cntr_mode = cntr_mode;
204 tmp_item->cntr_type = cntr_type;
205 free(full_event_name);
213 counter_uniq_id = gctl->num_reg_events++;
214 gctl->num_live_events++;
216 SDEDBG(
"%s: Counter %s has unique ID = %d\n", __FILE__, full_event_name, counter_uniq_id);
218 tmp_item =
allocate_and_insert( gctl, lib_handle, full_event_name, counter_uniq_id, cntr_mode, cntr_type, cntr_class, cntr_union );
220 if(NULL == tmp_item) {
221 SDEDBG(
"%s: Counter not inserted in SDE %s\n", __FILE__, lib_handle->libraryName);
222 free(full_event_name);
226 free(full_event_name);
229 if( needs_overflow ){
237 papisde_list_entry_t *curr;
238 if( NULL == counter )
243 curr = counter->u.cntr_group.group_head;
245 sde_counter_t *tmp_cntr = curr->item;
251 }
while(NULL != curr);
255 (counter->ref_count)++;
261 sde_counter_t *tmp_item;
262 papisde_control_t *gctl;
263 uint32_t item_uniq_id;
270 if( NULL == tmp_item ){
276 papisde_list_entry_t *curr, *prev;
279 curr = tmp_item->u.cntr_group.group_head;
282 int counter_is_dead = 0;
283 sde_counter_t *tmp_cntr = curr->item;
284 if( NULL == tmp_cntr ){
290 if( 0 == tmp_cntr->ref_count )
298 if( counter_is_dead ){
299 if( curr == tmp_item->u.cntr_group.group_head ){
301 tmp_item->u.cntr_group.group_head = curr->next;
306 prev->next = curr->next;
318 item_uniq_id = tmp_item->glb_uniq_id;
321 if( 0 == tmp_item->ref_count ){
324 if( NULL == tmp_item ){
332 if( NULL == tmp_item ){
342 (gctl->num_live_events)--;
344 (tmp_item->ref_count)--;
354 if( NULL == counter )
357 if( 0 == counter->ref_count ){
358 switch(counter->cntr_class){
360 SDEDBG(
" + Freeing Created Counter Data.\n");
361 free(counter->u.cntr_basic.data);
364 SDEDBG(
" + Freeing Recorder Data.\n");
365 free(counter->u.cntr_recorder.data->sorted_buffer);
367 free(counter->u.cntr_recorder.data->ptr_array[
i]);
369 free(counter->u.cntr_recorder.data);
372 SDEDBG(
" + Freeing CountingSet Data.\n");
377 SDEDBG(
" -> Freeing Counter '%s'.\n",counter->name);
379 free(counter->description);
391 papisde_list_entry_t *curr;
392 long long int final_value = 0;
394 if( NULL == counter ){
395 SDE_ERROR(
"sdei_read_counter_group(): Counter parameter is NULL.\n");
400 SDE_ERROR(
"sdei_read_counter_group(): Counter '%s' is not a counter group.\n",counter->name);
403 curr = counter->u.cntr_group.group_head;
406 long long int tmp_value = 0;
409 sde_counter_t *tmp_cntr = curr->item;
410 if( NULL == tmp_cntr ){
411 SDE_ERROR(
"sdei_read_counter_group(): List of counters in counter group '%s' is clobbered.\n",counter->name);
415 int read_succesfully = 1;
418 SDE_ERROR(
"sdei_read_counter_group(): Counter group contains counter: %s with class: %d.\n",tmp_cntr->name, tmp_cntr->cntr_class);
425 read_succesfully = 0;
430 SDE_ERROR(
"sdei_read_counter_group(): Error occured when reading counter: %s.\n",tmp_cntr->name);
431 read_succesfully = 0;
435 if( read_succesfully )
440 }
while(NULL != curr);
442 *rslt_ptr = final_value;
448#define _SDE_AGGREGATE( _TYPE, _RSLT_TYPE ) do{\
449 switch(group_flags){\
451 *(_RSLT_TYPE *)rslt = (_RSLT_TYPE) ((_TYPE)(*(_RSLT_TYPE *)rslt) + (_TYPE)(*((_RSLT_TYPE *)data)) );\
454 if( *(_RSLT_TYPE *)rslt < *((_RSLT_TYPE *)data) )\
455 *(_RSLT_TYPE *)rslt = *((_RSLT_TYPE *)data);\
458 if( *(_RSLT_TYPE *)rslt > *((_RSLT_TYPE *)data) )\
459 *(_RSLT_TYPE *)rslt = *((_RSLT_TYPE *)data);\
462 SDEDBG("Unsupported counter group flag: %d\n",group_flags);\
484 SDEDBG(
"Unsupported counter type: %d\n",cntr_type);
492 long long int tmp_int;
499 tmp_data = counter->u.cntr_basic.data;
502 tmp_int = counter->u.cntr_cb.callback(counter->u.cntr_cb.param);
505 SDEDBG(
"sdei_read_and_update_data_value(): Event %s has neither a variable nor a function pointer associated with it.\n",
event_name);
512 }
else if(
is_delta(counter->cntr_mode) ){
515 SDEDBG(
"Unsupported mode (%d) for event: %s\n",counter->cntr_mode,
event_name);
519 ret_val =
cast_and_store(tmp_data, previous_value, rslt_ptr, counter->cntr_type);
524cast_and_store(
void *data,
long long int previous_value,
void *rslt_ptr,
int cntr_type){
529 *(
long long int *)rslt_ptr = *((
long long int *)data) - previous_value;
530 SDEDBG(
" value LL=%lld (%lld-%lld)\n", *(
long long int *)rslt_ptr, *((
long long int *)data), previous_value);
534 *(
long long int *)rslt_ptr = (
long long int) (*((
int *)data) - (
int)previous_value);
535 SDEDBG(
" value LD=%lld (%d-%d)\n", *(
long long int *)rslt_ptr, *((
int *)data), (
int)previous_value);
538 tmp_ptr = &previous_value;
539 *(
double *)rslt_ptr = (*((
double *)data) - *((
double *)tmp_ptr));
540 SDEDBG(
" value LF=%lf (%lf-%lf)\n", *(
double *)rslt_ptr, *((
double *)data), *((
double *)tmp_ptr));
544 tmp_ptr = &previous_value;
545 *(
double *)rslt_ptr = (
double)(*((
float *)data) - (float)(*((
double *)tmp_ptr)) );
546 SDEDBG(
" value F=%lf (%f-%f)\n", *(
double *)rslt_ptr, *((
float *)data), (
float)(*((
double *)tmp_ptr)) );
549 SDEDBG(
"Unsupported counter type: %d\n",cntr_type);
560 switch(counter->cntr_type){
562 *((
long long int *)(counter->u.cntr_basic.data)) = new_value;
565 *((
int *)(counter->u.cntr_basic.data)) = (
int)new_value;
568 tmp_ptr = &new_value;
569 tmp_double = *((
double *)tmp_ptr);
570 *((
double *)(counter->u.cntr_basic.data)) = tmp_double;
574 tmp_ptr = &new_value;
575 tmp_double = *((
double *)tmp_ptr);
576 *((
float *)(counter->u.cntr_basic.data)) = (
float)tmp_double;
579 SDEDBG(
"Unsupported counter type: %d\n",counter->cntr_type);
static papi_handle_t handle
char event_name[2][PAPI_MAX_STR_LEN]
papisde_control_t * _papisde_global_control
int sdei_set_timer_for_overflow(void)
#define PAPI_SDE_long_long
static void SDE_ERROR(const char *format,...)
#define SDEDBG(format, args...)
int cset_delete(cset_hash_table_t *hash_ptr)
uint32_t ht_hash_name(const char *str)
void ht_insert(papisde_list_entry_t *hash_table, int ht_key, sde_counter_t *sde_counter)
sde_counter_t * ht_delete(papisde_list_entry_t *hash_table, int ht_key, uint32_t uniq_id)
sde_counter_t * ht_lookup_by_name(papisde_list_entry_t *hash_table, const char *name)
uint32_t ht_hash_id(uint32_t uniq_id)
cset_list_object_t * cset_to_list(cset_hash_table_t *hash_ptr)
#define IS_CNTR_CSET(_CNT)
#define IS_CNTR_BASIC(_CNT)
#define IS_CNTR_RECORDER(_CNT)
#define IS_CNTR_PLACEHOLDER(_CNT)
#define IS_CNTR_GROUP(_CNT)
#define EXP_CONTAINER_ENTRIES
#define IS_CNTR_CALLBACK(_CNT)
int sdei_setup_counter_internals(papi_handle_t handle, const char *event_name, int cntr_mode, int cntr_type, enum CNTR_CLASS cntr_class, cntr_class_specific_t cntr_union)
int sdei_read_and_update_data_value(sde_counter_t *counter, long long int previous_value, long long int *rslt_ptr)
static papisde_library_desc_t * find_library_by_name(const char *library_name, papisde_control_t *gctl)
void sdei_counting_set_to_list(void *cset_handle, cset_list_object_t **list_head)
static int free_counter_resources(sde_counter_t *counter)
papi_handle_t do_sde_init(const char *name_of_library, papisde_control_t *gctl)
sde_counter_t * allocate_and_insert(papisde_control_t *gctl, papisde_library_desc_t *lib_handle, const char *name, uint32_t uniq_id, int cntr_mode, int cntr_type, enum CNTR_CLASS cntr_class, cntr_class_specific_t cntr_union)
static int cast_and_store(void *data, long long int previous_value, void *rslt_ptr, int cntr_type)
int sdei_inc_ref_count(sde_counter_t *counter)
static void insert_library_handle(papisde_library_desc_t *lib_handle, papisde_control_t *gctl)
#define _SDE_AGGREGATE(_TYPE, _RSLT_TYPE)
int sdei_read_counter_group(sde_counter_t *counter, long long int *rslt_ptr)
int sdei_delete_counter(papisde_library_desc_t *lib_handle, const char *name)
int sdei_hardware_write(sde_counter_t *counter, long long int new_value)
static int aggregate_value_in_group(long long int *data, long long int *rslt, int cntr_type, int group_flags)
papisde_control_t * sdei_get_global_struct(void)