From 7905904cb6961afd69d54ea7675e51bc413e96dc Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Wed, 31 Mar 2010 13:17:02 -0700 Subject: [PATCH 1/2] (SIGAR-207) Add Pdh.getDescription method --- bindings/java/src/jni/win32/pdh.c | 32 +++++++++++++++++++ .../java/src/org/hyperic/sigar/win32/Pdh.java | 13 ++++++++ .../org/hyperic/sigar/win32/test/TestPdh.java | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/bindings/java/src/jni/win32/pdh.c b/bindings/java/src/jni/win32/pdh.c index b2f16ae7..4b3a9045 100644 --- a/bindings/java/src/jni/win32/pdh.c +++ b/bindings/java/src/jni/win32/pdh.c @@ -222,6 +222,38 @@ JNIEXPORT jdouble SIGAR_JNI(win32_Pdh_pdhGetValue) } } +JNIEXPORT jstring SIGAR_JNI(win32_Pdh_pdhGetDescription) +(JNIEnv *env, jclass cur, jlong counter) +{ + HCOUNTER h_counter = (HCOUNTER)counter; + PDH_COUNTER_INFO *info = NULL; + jstring retval = NULL; + DWORD size = 0; + PDH_STATUS status; + + status = PdhGetCounterInfo(h_counter, TRUE, &size, NULL); + if (status != PDH_MORE_DATA) { + win32_throw_exception(env, get_error_message(status)); + return NULL; + } + + info = malloc(size); + + status = PdhGetCounterInfo(h_counter, 1, &size, info); + if (status == ERROR_SUCCESS) { + if (info->szExplainText) { + retval = JENV->NewString(env, info->szExplainText, + lstrlen(info->szExplainText)); + } + } + else { + win32_throw_exception(env, get_error_message(status)); + } + + free(info); + return retval; +} + JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetInstances) (JNIEnv *env, jclass cur, jstring cp) { diff --git a/bindings/java/src/org/hyperic/sigar/win32/Pdh.java b/bindings/java/src/org/hyperic/sigar/win32/Pdh.java index 110d9189..cc877742 100644 --- a/bindings/java/src/org/hyperic/sigar/win32/Pdh.java +++ b/bindings/java/src/org/hyperic/sigar/win32/Pdh.java @@ -292,6 +292,17 @@ public class Pdh extends Win32 { } } + /* PdhCounterInfo.ExplainText */ + public String getDescription(String path) throws Win32Exception { + long counter = + pdhAddCounter(this.query, translate(path)); + try { + return pdhGetDescription(counter); + } finally { + pdhRemoveCounter(counter); + } + } + public static String[] getInstances(String path) throws Win32Exception { return pdhGetInstances(getCounterName(path)); } @@ -319,6 +330,8 @@ public class Pdh extends Win32 { long counter, boolean fmt) throws Win32Exception; + private static final native String pdhGetDescription(long counter) + throws Win32Exception; private static final native String[] pdhGetInstances(String path) throws Win32Exception; private static final native String[] pdhGetKeys(String path) diff --git a/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java b/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java index a6f23c1e..a00643cd 100755 --- a/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java +++ b/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java @@ -33,7 +33,7 @@ public class TestPdh extends SigarTestCase { private void getValue(String key) throws Exception { Pdh pdh = new Pdh(); - traceln(key); + traceln(key + ": " + pdh.getDescription(key)); assertGtEqZeroTrace("raw", (long)pdh.getRawValue(key)); assertGtEqZeroTrace("fmt", From 2dc981dfa842255e49d7ab150faa0af129272811 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Wed, 31 Mar 2010 14:54:25 -0700 Subject: [PATCH 2/2] (SIGAR-207) Add Pdh.getCounterType method --- bindings/java/src/jni/win32/pdh.c | 17 +++++++++++++++ .../java/src/org/hyperic/sigar/win32/Pdh.java | 21 +++++++++++++++++++ .../org/hyperic/sigar/win32/test/TestPdh.java | 5 +++++ 3 files changed, 43 insertions(+) diff --git a/bindings/java/src/jni/win32/pdh.c b/bindings/java/src/jni/win32/pdh.c index 4b3a9045..a5aefe67 100644 --- a/bindings/java/src/jni/win32/pdh.c +++ b/bindings/java/src/jni/win32/pdh.c @@ -254,6 +254,23 @@ JNIEXPORT jstring SIGAR_JNI(win32_Pdh_pdhGetDescription) return retval; } +JNIEXPORT jlong SIGAR_JNI(win32_Pdh_pdhGetCounterType) +(JNIEnv *env, jclass cur, jlong counter) +{ + HCOUNTER h_counter = (HCOUNTER)counter; + PDH_COUNTER_INFO info; + DWORD size = sizeof(info); + PDH_STATUS status; + + status = PdhGetCounterInfo(h_counter, FALSE, &size, &info); + if (status != ERROR_SUCCESS) { + win32_throw_exception(env, get_error_message(status)); + return -1; + } + + return info.dwType; +} + JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetInstances) (JNIEnv *env, jclass cur, jstring cp) { diff --git a/bindings/java/src/org/hyperic/sigar/win32/Pdh.java b/bindings/java/src/org/hyperic/sigar/win32/Pdh.java index cc877742..29de414a 100644 --- a/bindings/java/src/org/hyperic/sigar/win32/Pdh.java +++ b/bindings/java/src/org/hyperic/sigar/win32/Pdh.java @@ -63,6 +63,15 @@ public class Pdh extends Win32 { public static final String PERFLIB_KEY = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib"; + //see winperf.h + public static final long PERF_TYPE_NUMBER = 0x00000000; // a number (not a counter) + + public static final long PERF_TYPE_COUNTER = 0x00000400; // an increasing numeric value + + public static final long PERF_TYPE_TEXT = 0x00000800; // a text field + + public static final long PERF_TYPE_ZERO = 0x00000C00; // displays a zero + private long query = -1l; // Handle to the query private String hostname = null; private static Map counters = null; @@ -303,6 +312,16 @@ public class Pdh extends Win32 { } } + public long getCounterType(String path) throws Win32Exception { + long counter = + pdhAddCounter(this.query, translate(path)); + try { + return pdhGetCounterType(counter); + } finally { + pdhRemoveCounter(counter); + } + } + public static String[] getInstances(String path) throws Win32Exception { return pdhGetInstances(getCounterName(path)); } @@ -332,6 +351,8 @@ public class Pdh extends Win32 { throws Win32Exception; private static final native String pdhGetDescription(long counter) throws Win32Exception; + private static final native long pdhGetCounterType(long counter) + throws Win32Exception; private static final native String[] pdhGetInstances(String path) throws Win32Exception; private static final native String[] pdhGetKeys(String path) diff --git a/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java b/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java index a00643cd..8767f414 100755 --- a/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java +++ b/bindings/java/src/org/hyperic/sigar/win32/test/TestPdh.java @@ -30,10 +30,15 @@ public class TestPdh extends SigarTestCase { super(name); } + private static boolean isCounter(long type) { + return (type & Pdh.PERF_TYPE_COUNTER) == Pdh.PERF_TYPE_COUNTER; + } + private void getValue(String key) throws Exception { Pdh pdh = new Pdh(); traceln(key + ": " + pdh.getDescription(key)); + traceln("counter=" + isCounter(pdh.getCounterType(key))); assertGtEqZeroTrace("raw", (long)pdh.getRawValue(key)); assertGtEqZeroTrace("fmt",