swap.page_{in,out} windows impl
This commit is contained in:
parent
2af18adeb3
commit
02ab6d8730
|
@ -133,8 +133,9 @@ static DWORD perfbuf_grow(sigar_t *sigar)
|
||||||
return sigar->perfbuf_size;
|
return sigar->perfbuf_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PERF_OBJECT_TYPE *get_perf_object(sigar_t *sigar, char *counter_key,
|
static PERF_OBJECT_TYPE *get_perf_object_inst(sigar_t *sigar,
|
||||||
DWORD *err)
|
char *counter_key,
|
||||||
|
DWORD inst, DWORD *err)
|
||||||
{
|
{
|
||||||
DWORD retval, type, bytes;
|
DWORD retval, type, bytes;
|
||||||
WCHAR wcounter_key[MAX_PATH+1];
|
WCHAR wcounter_key[MAX_PATH+1];
|
||||||
|
@ -167,7 +168,7 @@ static PERF_OBJECT_TYPE *get_perf_object(sigar_t *sigar, char *counter_key,
|
||||||
* functions are in use by the same process.
|
* functions are in use by the same process.
|
||||||
* confucius say what the fuck.
|
* confucius say what the fuck.
|
||||||
*/
|
*/
|
||||||
if (object->NumInstances == PERF_NO_INSTANCES) {
|
if (inst && (object->NumInstances == PERF_NO_INSTANCES)) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<block->NumObjectTypes; i++) {
|
for (i=0; i<block->NumObjectTypes; i++) {
|
||||||
|
@ -183,6 +184,46 @@ static PERF_OBJECT_TYPE *get_perf_object(sigar_t *sigar, char *counter_key,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define get_perf_object(sigar, counter_key, err) \
|
||||||
|
get_perf_object_inst(sigar, counter_key, 1, err)
|
||||||
|
|
||||||
|
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);
|
||||||
|
PERF_INSTANCE_DEFINITION *inst;
|
||||||
|
PERF_COUNTER_DEFINITION *counter;
|
||||||
|
BYTE *data;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
if (!object) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = (BYTE *)((BYTE *)object + object->DefinitionLength);
|
||||||
|
|
||||||
|
for (i=0, counter = PdhFirstCounter(object);
|
||||||
|
i<object->NumCounters;
|
||||||
|
i++, counter = PdhNextCounter(counter))
|
||||||
|
{
|
||||||
|
DWORD offset = counter->CounterOffset;
|
||||||
|
|
||||||
|
switch (counter->CounterNameTitleIndex) {
|
||||||
|
case 48: /* "Pages Output/sec" */
|
||||||
|
swap->page_out = *((DWORD *)(data + offset));
|
||||||
|
break;
|
||||||
|
case 822: /* "Pages Input/sec" */
|
||||||
|
swap->page_in = *((DWORD *)(data + offset));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static void get_sysinfo(sigar_t *sigar)
|
static void get_sysinfo(sigar_t *sigar)
|
||||||
{
|
{
|
||||||
SYSTEM_INFO sysinfo;
|
SYSTEM_INFO sysinfo;
|
||||||
|
@ -522,6 +563,7 @@ SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
SIGAR_DECLARE(int) sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
{
|
{
|
||||||
|
int status;
|
||||||
DLLMOD_INIT(kernel, TRUE);
|
DLLMOD_INIT(kernel, TRUE);
|
||||||
|
|
||||||
if (sigar_GlobalMemoryStatusEx) {
|
if (sigar_GlobalMemoryStatusEx) {
|
||||||
|
@ -545,7 +587,10 @@ SIGAR_DECLARE(int) sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
|
|
||||||
swap->used = swap->total - swap->free;
|
swap->used = swap->total - swap->free;
|
||||||
|
|
||||||
swap->page_in = swap->page_out = -1;
|
if (get_swap_counters(sigar, swap) != SIGAR_OK) {
|
||||||
|
swap->page_in = SIGAR_FIELD_NOTIMPL;
|
||||||
|
swap->page_out = SIGAR_FIELD_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue