PAPI 7.1.0.0
Loading...
Searching...
No Matches
linux-lmsensors.c
Go to the documentation of this file.
1
31/* Headers required by libsensors */
32#include <sensors.h>
33#include <error.h>
34#include <time.h>
35#include <string.h>
36#include <dlfcn.h>
37
38/* Headers required by PAPI */
39#include "papi.h"
40#include "papi_internal.h"
41#include "papi_vector.h"
42#include "papi_memory.h"
43
44/************************* DEFINES SECTION ***********************************
45 *******************************************************************************/
46// time in usecs
47#define LM_SENSORS_REFRESHTIME 200000
48
50typedef struct _lmsensors_register
51{
52 /* This is used by the framework.It likes it to be !=0 to do somehting */
53 unsigned int selector;
54 /* These are the only information needed to locate a libsensors event */
55 const sensors_chip_name *name;
58
59/*
60 * The following structures mimic the ones used by other components. It is more
61 * convenient to use them like that as programming with PAPI makes specific
62 * assumptions for them.
63 */
64
66typedef struct _lmsensors_native_event_entry
67{
70 char description[PAPI_MAX_STR_LEN];
71 unsigned int count;
73
74
75typedef struct _lmsensors_reg_alloc
76{
79
80
81typedef struct _lmsensors_control_state
82{
85
86
87typedef struct _lmsensors_context
88{
91
92
93
94/************************* GLOBALS SECTION ***********************************
95 *******************************************************************************/
96/* This table contains the LM_SENSORS native events */
98/* number of events in the table*/
99static int num_events = 0;
100static long_long *cached_counts = NULL; // used for caching readings
101
102
103static int (*sensors_initPtr)(FILE *input);
104static void (*sensors_cleanupPtr)(void);
105static int (*sensors_snprintf_chip_namePtr)(char *str, size_t size,
106 const sensors_chip_name *chip);
107static char *(*sensors_get_labelPtr)(const sensors_chip_name *name, const sensors_feature *feature);
108static int (*sensors_get_valuePtr)(const sensors_chip_name *name, int subfeat_nr,
109 double *value);
110static const sensors_chip_name *(*sensors_get_detected_chipsPtr)(const sensors_chip_name
111 *match, int *nr);
112static const sensors_feature *(*sensors_get_featuresPtr)(const sensors_chip_name *name, int *nr);
113static const sensors_subfeature *(*sensors_get_all_subfeaturesPtr)(const sensors_chip_name *name,
114 const sensors_feature *feature, int *nr);
115
116// file handles used to access lmsensors libraries with dlopen
117static void* dl1 = NULL;
118
119// string macro defined within Rules.lmsensors
120static char lmsensors_main[]=PAPI_LMSENSORS_MAIN;
121
122//-----------------------------------------------------------------------------
123// Using weak symbols (global declared without a value, so it defers to any
124// other global declared in another file WITH a value) allows PAPI to be built
125// with the component, but PAPI can still be installed in a system without the
126// required library.
127//-----------------------------------------------------------------------------
128
129void (*_dl_non_dynamic_init)(void) __attribute__((weak)); // declare a weak dynamic-library init routine pointer.
130
131static int link_lmsensors_libraries ();
132
134
135/******************************************************************************
136 ******** BEGIN FUNCTIONS USED INTERNALLY SPECIFIC TO THIS COMPONENT ********
137 *****************************************************************************/
138/*
139 * Counts number of events available in this system
140 */
141static unsigned
142detectSensors( void )
143{
144 unsigned id = 0;
145 int chip_nr = 0;
146 const sensors_chip_name *chip_name;
147
148 /* Loop through all the chips, features, subfeatures found */
149 while ( ( chip_name =
150 sensors_get_detected_chipsPtr( NULL, &chip_nr ) ) != NULL ) {
151 int a = 0, b;
152 const sensors_feature *feature;
153
154 while ( ( feature = sensors_get_featuresPtr( chip_name, &a ) ) ) {
155 b = 0;
156 while ( ( sensors_get_all_subfeaturesPtr( chip_name, feature,
157 &b ) ) ) {
158 id++;
159 }
160 }
161 }
162
163 return id;
164}
165
166
167/*
168 * Create the native events for particulare component (!= 0)
169 */
170static unsigned
172{
173 unsigned id = 0;
174 int chip_nr = 0;
175 const sensors_chip_name *chip_name;
176
177 /* component name and description */
178 strcpy( _lmsensors_vector.cmp_info.short_name, "lmsensors" );
180 "lm-sensors provides tools for monitoring the hardware health" );
181
182
183 /* Loop through all the chips found */
184 while ( ( chip_name =
185 sensors_get_detected_chipsPtr( NULL, &chip_nr ) ) != NULL ) {
186 int a, b;
187 const sensors_feature *feature;
188 const sensors_subfeature *sub;
189 char chipnamestring[PAPI_MIN_STR_LEN];
190
191 // lm_sensors_native_table[id].count = 0;
192
193 /* get chip name from its internal representation */
194 sensors_snprintf_chip_namePtr( chipnamestring,
195 PAPI_MIN_STR_LEN, chip_name );
196
197 a = 0;
198
199 /* Loop through all the features found */
200 while ( ( feature = sensors_get_featuresPtr( chip_name, &a ) ) ) {
201 char *featurelabel;
202
203 if ( !( featurelabel = sensors_get_labelPtr( chip_name, feature ))) {
204 fprintf( stderr, "ERROR: Can't get label of feature %s!\n",
205 feature->name );
206 continue;
207 }
208
209 b = 0;
210
211 /* Loop through all the subfeatures found */
212 while ((sub=sensors_get_all_subfeaturesPtr(chip_name,feature,&b))) {
213
214 /* replace spaces with underscores */
215 char *ptr;
216 while( (ptr = strchr(featurelabel, ' ')) != NULL ){ *ptr = '_'; }
217
218 /* Save native event data */
219 sprintf( lm_sensors_native_table[id].name, "%s.%s.%s",
220 chipnamestring, featurelabel, sub->name );
221
222 strncpy( lm_sensors_native_table[id].description,
225
226 /* The selector has to be !=0 . Starts with 1 */
228
229 /* Save the actual references to this event */
230 lm_sensors_native_table[id].resources.name = chip_name;
232
233 /* increment the table index counter */
234 id++;
235 }
236
237 // lm_sensors_native_table[id].count = count + 1;
238 free( featurelabel );
239 }
240 }
241
242 /* Return the number of events created */
243 return id;
244}
245
246/*
247 * Returns the value of the event with index 'i' in lm_sensors_native_table
248 * This value is scaled by 1000 to cope with the lack to return decimal numbers
249 * with PAPI
250 */
251
252static long_long
253getEventValue( unsigned event_id )
254{
255 double value;
256 int res;
257
258 res = sensors_get_valuePtr( lm_sensors_native_table[event_id].resources.name,
260 subfeat_nr, &value );
261
262 if ( res < 0 ) {
263 fprintf( stderr, "libsensors(): Could not read event #%d!\n",
264 event_id );
265 return -1;
266 }
267
268 return ( ( long_long ) ( value * 1000 ) );
269}
270
271
272/*****************************************************************************
273 ******************* BEGIN PAPI's COMPONENT REQUIRED FUNCTIONS *************
274 *****************************************************************************/
275
276/*
277 * This is called whenever a thread is initialized
278 */
279static int
281{
282 ( void ) ctx;
283 return PAPI_OK;
284}
285
286
287/* Initialize hardware counters, setup the function vector table
288 * and get hardware information, this routine is called when the
289 * PAPI process is initialized (IE PAPI_library_init)
290 */
291static int
293{
294 int res;
295 (void) cidx;
296
297 /* link in all the lmsensor libraries and resolve the symbols we need to use */
299 SUBDBG ("Dynamic link of lmsensors libraries failed, component will be disabled.\n");
300 SUBDBG ("See disable reason in papi_component_avail output for more details.\n");
301 res = PAPI_ENOSUPP;
302 goto fn_fail;
303 }
304
305 /* Initialize libsensors library */
306 if ( ( res = sensors_initPtr( NULL ) ) != 0 ) {
308 "Cannot enable libsensors",PAPI_MAX_STR_LEN);
309 goto fn_fail;
310 }
311
312 /* Create dyanmic events table */
313 num_events = detectSensors( );
314 SUBDBG("Found %d sensors\n",num_events);
315
318
320 calloc( num_events, sizeof ( _lmsensors_native_event_entry_t )))
321 == NULL ) {
323 "Could not malloc room",PAPI_MAX_STR_LEN);
324 res = PAPI_ENOMEM;
325 goto fn_fail;
326 }
327
328 cached_counts = (long long*) calloc(num_events, sizeof(long long));
329
330 if (cached_counts == NULL) {
332 "Could not malloc room",PAPI_MAX_STR_LEN);
335 res = PAPI_ENOMEM;
336 goto fn_fail;
337 }
338
339 if ( ( unsigned ) num_events != createNativeEvents( ) ) {
341 "LM_SENSOR number mismatch",PAPI_MAX_STR_LEN);
342 free(cached_counts);
343 cached_counts = NULL;
346 res = PAPI_ECMP;
347 goto fn_fail;
348 }
349
352
353 fn_exit:
354 _papi_hwd[cidx]->cmp_info.disabled = res;
355 return res;
356 fn_fail:
357 goto fn_exit;
358}
359
360/*
361 * Link the necessary lmsensors libraries to use the lmsensors
362 * component. If any of them can not be found, then the lmsensors
363 * component will just be disabled. This is done at runtime so that a
364 * version of PAPI built with the Infiniband component can be
365 * installed and used on systems which have the lmsensors libraries
366 * installed and on systems where these libraries are not installed.
367 */
368static int
370{
371 if ( _dl_non_dynamic_init != NULL ) {
372 // If weak var present, statically linked insted of dynamic.
373 strncpy( _lmsensors_vector.cmp_info.disabled_reason, "The lmsensors component REQUIRES dynamic linking capabilities.", PAPI_MAX_STR_LEN-1);
374 // EXIT not supported.
375 return PAPI_ENOSUPP;
376 }
377
378 char path_name[1024];
379 char *lmsensors_root = getenv("PAPI_LMSENSORS_ROOT");
380
381 dl1 = NULL;
382 // Step 1: Process override if given.
383 if (strlen(lmsensors_main) > 0) { // If override given, it has to work.
384 dl1 = dlopen(lmsensors_main, RTLD_NOW | RTLD_GLOBAL); // Try to open that path.
385 if (dl1 == NULL) {
386 snprintf(_lmsensors_vector.cmp_info.disabled_reason, PAPI_MAX_STR_LEN, "PAPI_LMSENSORS_MAIN override '%s' given in Rules.lmsensors not found.", lmsensors_main);
387 return(PAPI_ENOSUPP); // Override given but not found.
388 }
389 }
390
391 // Step 2: Try system paths, will work with Spack, LD_LIBRARY_PATH, default paths.
392 if (dl1 == NULL) { // No override,
393 dl1 = dlopen("libsensors.so", RTLD_NOW | RTLD_GLOBAL); // Try system paths.
394 }
395
396 // Step 3: Try the explicit install default.
397 if (dl1 == NULL && lmsensors_root != NULL) { // if root given, try it.
398 snprintf(path_name, PATH_MAX, "%s/lib64/libsensors.so", lmsensors_root); // PAPI Root check.
399 dl1 = dlopen(path_name, RTLD_NOW | RTLD_GLOBAL); // Try to open that path.
400 }
401
402 // Step 4: Try another explicit install default.
403 if (dl1 == NULL && lmsensors_root != NULL) { // if root given, try it.
404 snprintf(path_name, PATH_MAX, "%s/lib/libsensors.so", lmsensors_root); // PAPI Root check.
405 dl1 = dlopen(path_name, RTLD_NOW | RTLD_GLOBAL); // Try to open that path.
406 }
407
408 // Check for failure.
409 if (dl1 == NULL) {
410 snprintf(_lmsensors_vector.cmp_info.disabled_reason, PAPI_MAX_STR_LEN, "libsensors.so not found.");
411 return(PAPI_ENOSUPP);
412 }
413
414 // We have dl1.
415
416 sensors_initPtr = dlsym(dl1, "sensors_init");
417 if (dlerror() != NULL)
418 {
420 "lmsensor function sensors_init.",PAPI_MAX_STR_LEN);
421 return ( PAPI_ENOSUPP );
422 }
423 sensors_cleanupPtr = dlsym(dl1, "sensors_cleanup");
424 if (dlerror() != NULL)
425 {
427 "lmsensor function sensors_cleanup.",PAPI_MAX_STR_LEN);
428 return ( PAPI_ENOSUPP );
429 }
430 sensors_snprintf_chip_namePtr = dlsym(dl1, "sensors_snprintf_chip_name");
431 if (dlerror() != NULL)
432 {
434 "lmsensor function sensors_snprintf_chip_name.",PAPI_MAX_STR_LEN);
435 return ( PAPI_ENOSUPP );
436 }
437 sensors_get_labelPtr = dlsym(dl1, "sensors_get_label");
438 if (dlerror() != NULL)
439 {
441 "lmsensor function sensors_get_label.",PAPI_MAX_STR_LEN);
442 return ( PAPI_ENOSUPP );
443 }
444 sensors_get_valuePtr = dlsym(dl1, "sensors_get_value");
445 if (dlerror() != NULL)
446 {
448 "lmsensor function sensors_get_value.",PAPI_MAX_STR_LEN);
449 return ( PAPI_ENOSUPP );
450 }
451 sensors_get_detected_chipsPtr = dlsym(dl1, "sensors_get_detected_chips");
452 if (dlerror() != NULL)
453 {
455 "lmsensor function sensors_get_detected_chips.",PAPI_MAX_STR_LEN);
456 return ( PAPI_ENOSUPP );
457 }
458 sensors_get_featuresPtr = dlsym(dl1, "sensors_get_features");
459 if (dlerror() != NULL)
460 {
462 "lmsensor function sensors_get_features.",PAPI_MAX_STR_LEN);
463 return ( PAPI_ENOSUPP );
464 }
465 sensors_get_all_subfeaturesPtr = dlsym(dl1, "sensors_get_all_subfeatures");
466 if (dlerror() != NULL)
467 {
469 "lmsensor function sensors_get_all_subfeatures.",PAPI_MAX_STR_LEN);
470 return ( PAPI_ENOSUPP );
471 }
472
473 return ( PAPI_OK );
474}
475
476/*
477 * Control of counters (Reading/Writing/Starting/Stopping/Setup)
478 * functions
479 */
480static int
482{
483 int i;
484
485 for ( i = 0; i < num_events; i++ )
487
488 ( ( _lmsensors_control_state_t * ) ctl )->lastupdate =
490 return PAPI_OK;
491}
492
493
494/*
495 *
496 */
497static int
499{
500 ( void ) ctx;
501 ( void ) ctl;
502
503 return PAPI_OK;
504}
505
506
507/*
508 *
509 */
510static int
512{
513 ( void ) ctx;
514 ( void ) ctl;
515
516 return PAPI_OK;
517}
518
519
520/*
521 *
522 */
523static int
525 long_long ** events, int flags )
526{
527 ( void ) ctx;
528 ( void ) flags;
529 long long start = PAPI_get_real_usec( );
530 int i;
531
533
534 if ( start - control->lastupdate > 200000 ) { // cache refresh
535
536 for ( i = 0; i < num_events; i++ ) {
538 }
539 control->lastupdate = PAPI_get_real_usec( );
540 }
541
543 return PAPI_OK;
544}
545
546
547static int
549{
550 if (cached_counts) {
551 free(cached_counts);
552 cached_counts = NULL;
553 }
554
555 /* Call the libsensors cleaning function before leaving */
557
561 }
562
563 return PAPI_OK;
564}
565
566static int
568{
569 ( void ) ctx;
570
571 return PAPI_OK;
572}
573
574
575
576/* This function sets various options in the component
577 * The valid codes being passed in are PAPI_SET_DEFDOM,
578 * PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL * and PAPI_SET_INHERIT
579 */
580static int
582{
583 ( void ) ctx;
584 ( void ) code;
585 ( void ) option;
586 return PAPI_OK;
587}
588
589
590static int
593 int count,
594 hwd_context_t *ctx )
595{
596 int i, index;
597 ( void ) ctx;
598 ( void ) ctl;
599
600 for ( i = 0; i < count; i++ ) {
601 index = native[i].ni_event;
602 native[i].ni_position =
604 }
605 return PAPI_OK;
606}
607
608
609/*
610 * As I understand it, all data reported by these interfaces will be system wide
611 */
612static int
614{
615 (void) ctl;
616 if ( PAPI_DOM_ALL != domain )
617 return ( PAPI_EINVAL );
618
619 return ( PAPI_OK );
620}
621
622
623/*
624 *
625 */
626static int
628{
629 ( void ) ctx;
630 ( void ) ctl;
631 return PAPI_OK;
632}
633
634
635/*
636 * Native Event functions
637 */
638static int
639_lmsensors_ntv_enum_events( unsigned int *EventCode, int modifier )
640{
641
642 switch ( modifier ) {
643 case PAPI_ENUM_FIRST:
644 *EventCode = 0;
645
646 return PAPI_OK;
647 break;
648
649 case PAPI_ENUM_EVENTS:
650 {
651 int index = *EventCode;
652
653 if ( index < num_events - 1 ) {
654 *EventCode = *EventCode + 1;
655 return PAPI_OK;
656 } else
657 return PAPI_ENOEVNT;
658
659 break;
660 }
661 default:
662 return PAPI_EINVAL;
663 }
664 return PAPI_EINVAL;
665}
666
667/*
668 *
669 */
670static int
671_lmsensors_ntv_code_to_name( unsigned int EventCode, char *name, int len )
672{
673 int index = EventCode;
674
675 if (index>=0 && index<num_events) {
676 strncpy( name, lm_sensors_native_table[index].name, len );
677 }
678
679 return PAPI_OK;
680}
681
682/*
683 *
684 */
685static int
686_lmsensors_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
687{
688 int index = EventCode;
689
690 if (index>=0 && index<num_events) {
691 strncpy( name, lm_sensors_native_table[index].description, len );
692 }
693 return PAPI_OK;
694}
695
696
697
698/*
699 *
700 */
702 .cmp_info = {
703 /* component information (unspecified values are initialized to 0) */
704 .name = "lmsensors",
705 .short_name = "lmsensors",
706 .version = "5.0",
707 .description = "Linux LMsensor statistics",
708 .num_mpx_cntrs = 0,
709 .num_cntrs = 0,
710 .default_domain = PAPI_DOM_ALL,
711 .default_granularity = PAPI_GRN_SYS,
712 .available_granularities = PAPI_GRN_SYS,
713 .hardware_intr_sig = PAPI_INT_SIGNAL,
714
715 /* component specific cmp_info initializations */
716 .fast_real_timer = 0,
717 .fast_virtual_timer = 0,
718 .attach = 0,
719 .attach_must_ptrace = 0,
720 .available_domains = PAPI_DOM_USER | PAPI_DOM_KERNEL,
721 },
722
723 /* sizes of framework-opaque component-private structures */
724 .size = {
725 .context = sizeof ( _lmsensors_context_t ),
726 .control_state = sizeof ( _lmsensors_control_state_t ),
727 .reg_value = sizeof ( _lmsensors_register_t ),
728 .reg_alloc = sizeof ( _lmsensors_reg_alloc_t ),
729 },
730 /* function pointers in this component */
731 .init_thread = _lmsensors_init_thread,
732 .init_component = _lmsensors_init_component,
733 .init_control_state = _lmsensors_init_control_state,
734 .start = _lmsensors_start,
735 .stop = _lmsensors_stop,
736 .read = _lmsensors_read,
737 .shutdown_thread = _lmsensors_shutdown_thread,
738 .shutdown_component = _lmsensors_shutdown_component,
739 .ctl = _lmsensors_ctl,
740 .update_control_state = _lmsensors_update_control_state,
741 .set_domain = _lmsensors_set_domain,
742 .reset = _lmsensors_reset,
743
744 .ntv_enum_events = _lmsensors_ntv_enum_events,
745 .ntv_code_to_name = _lmsensors_ntv_code_to_name,
746 .ntv_code_to_descr = _lmsensors_ntv_code_to_descr,
747};
int i
static long count
get real time counter value in microseconds
struct papi_vectors * _papi_hwd[]
#define PAPI_DOM_USER
Definition: f90papi.h:174
#define PAPI_ENUM_EVENTS
Definition: f90papi.h:224
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_ENUM_FIRST
Definition: f90papi.h:85
#define PAPI_MIN_STR_LEN
Definition: f90papi.h:208
#define PAPI_DOM_KERNEL
Definition: f90papi.h:254
#define PAPI_ENOEVNT
Definition: f90papi.h:139
#define PAPI_EINVAL
Definition: f90papi.h:115
#define PAPI_ENOSUPP
Definition: f90papi.h:244
#define PAPI_MAX_STR_LEN
Definition: f90papi.h:77
#define PAPI_ECMP
Definition: f90papi.h:214
#define PAPI_GRN_SYS
Definition: f90papi.h:43
#define PAPI_ENOMEM
Definition: f90papi.h:16
#define PAPI_DOM_ALL
Definition: f90papi.h:261
char events[MAX_EVENTS][BUFSIZ]
static struct timeval start
static double a[MATRIX_SIZE][MATRIX_SIZE]
Definition: libmsr_basic.c:38
static double b[MATRIX_SIZE][MATRIX_SIZE]
Definition: libmsr_basic.c:39
static int _lmsensors_ntv_code_to_name(unsigned int EventCode, char *name, int len)
static _lmsensors_native_event_entry_t * lm_sensors_native_table
static long_long getEventValue(unsigned event_id)
static int _lmsensors_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
static int _lmsensors_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
static long_long * cached_counts
static int _lmsensors_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
static int num_events
papi_vector_t _lmsensors_vector
static int _lmsensors_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
static int _lmsensors_init_control_state(hwd_control_state_t *ctl)
static int _lmsensors_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
static const sensors_chip_name *(* sensors_get_detected_chipsPtr)(const sensors_chip_name *match, int *nr)
static int _lmsensors_shutdown_thread(hwd_context_t *ctx)
static int _lmsensors_init_component(int cidx)
static unsigned createNativeEvents(void)
static void * dl1
static int _lmsensors_ntv_enum_events(unsigned int *EventCode, int modifier)
static int(* sensors_initPtr)(FILE *input)
static const sensors_feature *(* sensors_get_featuresPtr)(const sensors_chip_name *name, int *nr)
static int link_lmsensors_libraries()
static char lmsensors_main[]
static const sensors_subfeature *(* sensors_get_all_subfeaturesPtr)(const sensors_chip_name *name, const sensors_feature *feature, int *nr)
static char *(* sensors_get_labelPtr)(const sensors_chip_name *name, const sensors_feature *feature)
void(* _dl_non_dynamic_init)(void)
static void(* sensors_cleanupPtr)(void)
static int(* sensors_get_valuePtr)(const sensors_chip_name *name, int subfeat_nr, double *value)
static int _lmsensors_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
static int _lmsensors_init_thread(hwd_context_t *ctx)
static int _lmsensors_set_domain(hwd_control_state_t *ctl, int domain)
static int _lmsensors_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long_long **events, int flags)
static int(* sensors_snprintf_chip_namePtr)(char *str, size_t size, const sensors_chip_name *chip)
static int _lmsensors_shutdown_component(void)
unsigned long AO_t __attribute__((__aligned__(4)))
Definition: m68k.h:21
Return codes and api definitions.
#define long_long
Definition: papi.h:559
#define SUBDBG(format, args...)
Definition: papi_debug.h:64
FILE * stderr
#define PAPI_INT_SIGNAL
Definition: papi_internal.h:52
static int native
static int cidx
const char * name
Definition: rocs.c:225
int
Definition: sde_internal.h:89
char description[PAPI_MAX_STR_LEN]
Definition: papi.h:630
char short_name[PAPI_MIN_STR_LEN]
Definition: papi.h:628
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
char disabled_reason[PAPI_HUGE_STR_LEN]
Definition: papi.h:634
_lmsensors_control_state_t state
_lmsensors_register_t resources
unsigned int count
char name[PAPI_MAX_STR_LEN]
char description[PAPI_MAX_STR_LEN]
_lmsensors_register_t ra_bits
const sensors_chip_name * name
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20