[SIGAR-84] Prevent crash when perf counters are disabled
This commit is contained in:
parent
2959b4a4ea
commit
936a8a79c5
|
@ -29,6 +29,7 @@
|
|||
#define PERFBUF_SIZE 8192
|
||||
|
||||
#define PERF_TITLE_PROC 230
|
||||
#define PERF_TITLE_MEM_KEY "4"
|
||||
#define PERF_TITLE_PROC_KEY "230"
|
||||
#define PERF_TITLE_CPU_KEY "238"
|
||||
#define PERF_TITLE_DISK_KEY "236"
|
||||
|
@ -139,6 +140,25 @@ static DWORD perfbuf_grow(sigar_t *sigar)
|
|||
return sigar->perfbuf_size;
|
||||
}
|
||||
|
||||
static char *get_counter_name(char *key)
|
||||
{
|
||||
if (strEQ(key, PERF_TITLE_MEM_KEY)) {
|
||||
return "Memory";
|
||||
}
|
||||
else if (strEQ(key, PERF_TITLE_PROC_KEY)) {
|
||||
return "Process";
|
||||
}
|
||||
else if (strEQ(key, PERF_TITLE_CPU_KEY)) {
|
||||
return "Processor";
|
||||
}
|
||||
else if (strEQ(key, PERF_TITLE_DISK_KEY)) {
|
||||
return "LogicalDisk";
|
||||
}
|
||||
else {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
||||
static PERF_OBJECT_TYPE *get_perf_object_inst(sigar_t *sigar,
|
||||
char *counter_key,
|
||||
DWORD inst, DWORD *err)
|
||||
|
@ -167,6 +187,13 @@ static PERF_OBJECT_TYPE *get_perf_object_inst(sigar_t *sigar,
|
|||
}
|
||||
|
||||
block = (PERF_DATA_BLOCK *)sigar->perfbuf;
|
||||
if (block->NumObjectTypes == 0) {
|
||||
counter_key = get_counter_name(counter_key);
|
||||
sigar_strerror_printf(sigar, "No %s counters defined (disabled?)",
|
||||
counter_key);
|
||||
*err = -1;
|
||||
return NULL;
|
||||
}
|
||||
object = PdhFirstObject(block);
|
||||
|
||||
/*
|
||||
|
@ -197,7 +224,7 @@ static int get_swap_counters(sigar_t *sigar, sigar_swap_t *swap)
|
|||
{
|
||||
int status;
|
||||
PERF_OBJECT_TYPE *object =
|
||||
get_perf_object_inst(sigar, "4" /* Memory */, 0, &status);
|
||||
get_perf_object_inst(sigar, PERF_TITLE_MEM_KEY, 0, &status);
|
||||
PERF_INSTANCE_DEFINITION *inst;
|
||||
PERF_COUNTER_DEFINITION *counter;
|
||||
BYTE *data;
|
||||
|
@ -646,7 +673,7 @@ static PERF_INSTANCE_DEFINITION *get_cpu_instance(sigar_t *sigar,
|
|||
DWORD *perf_offsets,
|
||||
DWORD *num, DWORD *err)
|
||||
{
|
||||
PERF_OBJECT_TYPE *object = get_perf_object(sigar, "238", err);
|
||||
PERF_OBJECT_TYPE *object = get_perf_object(sigar, PERF_TITLE_CPU_KEY, err);
|
||||
PERF_INSTANCE_DEFINITION *inst;
|
||||
PERF_COUNTER_DEFINITION *counter;
|
||||
DWORD i;
|
||||
|
|
Loading…
Reference in New Issue