while (!dt_stat_stable(s)) { \ T_STAT_MEASURE(s) { \ err = posix_spawn(&pid, args[0], NULL, NULL, args, NULL); \ } \ if (err) { \ T_FAIL("posix_spawn returned %d", err); \ } \ waitpid(pid, &status, 0); \ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { \ T_FAIL("Child process of posix_spawn failed to run"); \ } \ } T_DECL(posix_spawn_platform_binary_latency, "posix_spawn platform binary latency", T_META_TYPE_PERF, T_META_CHECK_LEAKS(NO)) { { dt_stat_time_t s = dt_stat_time_create("time"); SPAWN_MEASURE_LOOP(s); dt_stat_finalize(s); } { dt_stat_thread_cpu_time_t s = dt_stat_thread_cpu_time_create("on-cpu time"); SPAWN_MEASURE_LOOP(s); dt_stat_finalize(s); } } #define FORK_MEASURE_LOOP(s) \ pid_t pid; \ int status; \ while (!dt_stat_stable(s)) { \
} static void reset_kdebug_trace(void) { _sysctl_reset(); } static void test(const char* test_name, void (^pretest_setup)(void), void (*test)(dt_stat_time_t s)) { T_ATEND(reset_kdebug_trace); _sysctl_reset(); _sysctl_setbuf(1000000); _sysctl_nowrap(false); _sysctl_setup(); pretest_setup(); dt_stat_time_t s = dt_stat_time_create("%s", test_name); test(s); dt_stat_finalize(s); } // // Begin tests... // T_DECL(kdebug_trace_baseline_syscall, "Test the latency of a syscall while kernel tracing is disabled") { test("kdebug_trace_baseline_syscall", ^{ enable_tracing(false); }, loop_getppid); }