bool w_perf_finish(w_perf_t *perf) { gettimeofday(&perf->time_end, NULL); w_timeval_sub(perf->time_end, perf->time_begin, &perf->duration); #ifdef HAVE_SYS_RESOURCE_H getrusage(RUSAGE_SELF, &perf->usage_end); // Compute the delta for the usage w_timeval_sub(perf->usage_end.ru_utime, perf->usage_begin.ru_utime, &perf->usage.ru_utime); w_timeval_sub(perf->usage_end.ru_stime, perf->usage_begin.ru_stime, &perf->usage.ru_stime); #define DIFFU(n) perf->usage.n = perf->usage_end.n - perf->usage_begin.n DIFFU(ru_maxrss); DIFFU(ru_ixrss); DIFFU(ru_idrss); DIFFU(ru_minflt); DIFFU(ru_majflt); DIFFU(ru_nswap); DIFFU(ru_inblock); DIFFU(ru_oublock); DIFFU(ru_msgsnd); DIFFU(ru_msgrcv); DIFFU(ru_nsignals); DIFFU(ru_nvcsw); DIFFU(ru_nivcsw); #undef DIFFU #endif if (!perf->will_log) { if (perf->wall_time_elapsed_thresh == 0) { json_t *thresh = cfg_get_json(NULL, "perf_sampling_thresh"); if (thresh) { if (json_is_number(thresh)) { perf->wall_time_elapsed_thresh = json_number_value(thresh); } else { json_unpack(thresh, "{s:f}", perf->description, &perf->wall_time_elapsed_thresh); } } } if (perf->wall_time_elapsed_thresh > 0 && w_timeval_diff(perf->time_begin, perf->time_end) > perf->wall_time_elapsed_thresh) { perf->will_log = true; } } return perf->will_log; }
bool watchman_perf_sample::finish() { gettimeofday(&time_end, nullptr); w_timeval_sub(time_end, time_begin, &duration); #ifdef HAVE_SYS_RESOURCE_H getrusage(RUSAGE_SELF, &usage_end); // Compute the delta for the usage w_timeval_sub(usage_end.ru_utime, usage_begin.ru_utime, &usage.ru_utime); w_timeval_sub(usage_end.ru_stime, usage_begin.ru_stime, &usage.ru_stime); #define DIFFU(n) usage.n = usage_end.n - usage_begin.n DIFFU(ru_maxrss); DIFFU(ru_ixrss); DIFFU(ru_idrss); DIFFU(ru_minflt); DIFFU(ru_majflt); DIFFU(ru_nswap); DIFFU(ru_inblock); DIFFU(ru_oublock); DIFFU(ru_msgsnd); DIFFU(ru_msgrcv); DIFFU(ru_nsignals); DIFFU(ru_nvcsw); DIFFU(ru_nivcsw); #undef DIFFU #endif if (!will_log) { if (wall_time_elapsed_thresh == 0) { auto thresh = cfg_get_json("perf_sampling_thresh"); if (thresh) { if (json_is_number(thresh)) { wall_time_elapsed_thresh = json_number_value(thresh); } else { json_unpack(thresh, "{s:f}", description, &wall_time_elapsed_thresh); } } } if (wall_time_elapsed_thresh > 0 && w_timeval_diff(time_begin, time_end) > wall_time_elapsed_thresh) { will_log = true; } } return will_log; }