+ return DummyProcessMemoryInfo.INSTANCE;
+ }
+ }
+
+ private static ProcessMemoryCounters getProcessMemoryCounters(ProcessMemoryInfo out) {
+ ProcessMemoryCounters counters = castOrCreate(out, ProcessMemoryCounters.class);
+ HANDLE proc = Kernel32.INSTANCE.GetCurrentProcess();
+ switch (Arch.calculate()) {
+ case X86: {
+ Psapi32.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi32.PROCESS_MEMORY_COUNTERS_EX();
+ boolean ok = Psapi32.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
+ if (ok)
+ pmem.writeTo(counters);
+ return counters;
+ }
+
+ case X86_64: {
+ Psapi64.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi64.PROCESS_MEMORY_COUNTERS_EX();
+ boolean ok = Psapi64.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
+ if (ok)
+ pmem.writeTo(counters);
+ return counters;
+ }
+
+ default:
+ return counters;
+ }
+ }
+
+ private static CMemoryInfo getCMemoryInfo(ProcessMemoryInfo out) {
+ CMemoryInfo info = castOrCreate(out, CMemoryInfo.class);
+
+ switch (Arch.calculate()) {
+ case X86: {
+ Resource32.Rusage rusage = new Resource32.Rusage();
+ int ok = Resource32.INSTANCE.getrusage(Resource.RUSAGE_SELF, rusage);
+ if (ok == 0)
+ rusage.writeTo(info);
+ return info;
+ }
+
+ case X86_64: {
+ Resource64.Rusage rusage = new Resource64.Rusage();
+ int ok = Resource64.INSTANCE.getrusage(Resource.RUSAGE_SELF, rusage);
+ if (ok == 0)
+ rusage.writeTo(info);
+ return info;
+ }
+
+ default:
+ return info;
+ }
+ }
+
+ private static CMemoryInfo getCurrentRSS(ProcessMemoryInfo out) {
+ CMemoryInfo info = castOrCreate(out, CMemoryInfo.class);
+
+ switch (Arch.calculate()) {
+ case X86: {
+ long rss = Stat.getCurrentRSS(Resource32.INSTANCE);
+ if (rss >= 0)
+ info.currentRSS = rss;
+ return info;
+ }
+
+ case X86_64: {
+ long rss = Stat.getCurrentRSS(Resource64.INSTANCE);
+ if (rss >= 0)
+ info.currentRSS = rss;
+ return info;
+ }
+
+ default:
+ return info;
+ }
+ }
+
+ private static <T> T castOrCreate(Object o, Class<T> clazz) {
+ if (clazz.isInstance(o))
+ return clazz.cast(o);
+ try {
+ return clazz.getConstructor().newInstance();
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+ | NoSuchMethodException | SecurityException e) {
+ throw new Error("Class " + clazz + " does not have a public parameterless constructor", e);