DYNAMORIO_EXPORT void dr_inject_print_stats(void *data, int elapsed_secs, bool showstats, bool showmem) { dr_inject_info_t *info = (dr_inject_info_t *) data; VM_COUNTERS mem; /* not in DR library - floating point use is OK */ int secs = elapsed_secs; if (data == NULL) return; if (!get_process_mem_stats(info->pi.hProcess, &mem)) { /* failed */ memset(&mem, 0, sizeof(VM_COUNTERS)); } if (showstats) { int cpu = get_process_load(info->pi.hProcess); /* Elapsed real (wall clock) time. */ if (secs >= 3600) { /* One hour -> h:m:s. */ fprintf(FP, "%ld:%02ld:%02ldelapsed ", secs / 3600, (secs % 3600) / 60, secs % 60); } else { fprintf(FP, "%ld:%02ld.%02ldelapsed ", /* -> m:s. */ secs / 60, secs % 60, 0 /* for now */); } fprintf(FP, "%d%%CPU \n", cpu); fprintf(FP, "(%lu tot, %lu RSS, %lu paged, %lu non, %lu swap)k\n", mem.PeakVirtualSize/1024, mem.PeakWorkingSetSize/1024, mem.QuotaPeakPagedPoolUsage/1024, mem.QuotaPeakNonPagedPoolUsage/1024, mem.PeakPagefileUsage/1024); } if (showmem) { fprintf(FP, "Process Memory Statistics:\n"); fprintf(FP, "\tPeak virtual size: %6d KB\n", mem.PeakVirtualSize/1024); fprintf(FP, "\tPeak working set size: %6d KB\n", mem.PeakWorkingSetSize/1024); fprintf(FP, "\tPeak paged pool usage: %6d KB\n", mem.QuotaPeakPagedPoolUsage/1024); fprintf(FP, "\tPeak non-paged pool usage: %6d KB\n", mem.QuotaPeakNonPagedPoolUsage/1024); fprintf(FP, "\tPeak pagefile usage: %6d KB\n", mem.PeakPagefileUsage/1024); } }
JNIEXPORT jdouble JNICALL Java_com_sun_management_internal_OperatingSystemImpl_getProcessCpuLoad0 (JNIEnv *env, jobject dummy) { return get_process_load(); }