diff --git a/cmd/tools/modules/testing/common.v b/cmd/tools/modules/testing/common.v index 8bafc72b39..8a3ab2a621 100644 --- a/cmd/tools/modules/testing/common.v +++ b/cmd/tools/modules/testing/common.v @@ -8,14 +8,6 @@ import sync import v.pref import v.util.vtest -pub struct TestMessageHandler { -mut: - messages []string -pub mut: - message_idx int - mtx &sync.Mutex -} - pub struct TestSession { pub mut: files []string @@ -26,14 +18,24 @@ pub mut: failed bool benchmark benchmark.Benchmark show_ok_tests bool - message_handler &TestMessageHandler root_relative bool // used by CI runs, so that the output is stable everywhere + nmessages chan string // many publishers, single consumer/printer + nmessage_idx int // currently printed message index } -pub fn (mut mh TestMessageHandler) append_message(msg string) { - mh.mtx.m_lock() - mh.messages << msg - mh.mtx.unlock() +pub fn (mut ts TestSession) append_message(msg string) { + ts.nmessages <- msg +} + +pub fn (mut ts TestSession) print_messages() { + for { + mut nm := <- ts.nmessages + ts.nmessage_idx++ + msg := nm.replace("TMP1", "${ts.nmessage_idx:1d}"). + replace("TMP2", "${ts.nmessage_idx:2d}"). + replace("TMP3", "${ts.nmessage_idx:3d}") + eprintln(msg) + } } pub fn new_test_session(_vargs string) TestSession { @@ -53,7 +55,6 @@ pub fn new_test_session(_vargs string) TestSession { skip_files: skip_files vargs: vargs show_ok_tests: !_vargs.contains('-silent') - message_handler: &TestMessageHandler(0) } } @@ -105,9 +106,9 @@ pub fn (mut ts TestSession) test() { callback: worker_trunner }) // for handling messages across threads - ts.message_handler = &TestMessageHandler{ - mtx: sync.new_mutex() - } + ts.nmessages = chan string{cap: 10000} + ts.nmessage_idx = 0 + go ts.print_messages() pool_of_test_runners.set_shared_context(ts) pool_of_test_runners.work_on_pointers(remaining_files.pointers()) ts.benchmark.stop() @@ -118,25 +119,8 @@ pub fn (mut ts TestSession) test() { } } -pub fn (mut m TestMessageHandler) display_message() { - m.mtx.m_lock() - defer { - m.messages.clear() - m.mtx.unlock() - } - for msg in m.messages { - m.message_idx++ - eprintln(msg. - replace("TMP1", "${m.message_idx:1d}"). - replace("TMP2", "${m.message_idx:2d}"). - replace("TMP3", "${m.message_idx:3d}") - ) - } -} - fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr { mut ts := &TestSession(p.get_shared_context()) - defer { ts.message_handler.display_message() } tmpd := os.temp_dir() show_stats := '-stats' in ts.vargs.split(' ') // tls_bench is used to format the step messages/timings @@ -172,11 +156,11 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr { if relative_file.replace('\\', '/') in ts.skip_files { ts.benchmark.skip() tls_bench.skip() - ts.message_handler.append_message(tls_bench.step_message_skip(relative_file)) + ts.append_message(tls_bench.step_message_skip(relative_file)) return sync.no_result } if show_stats { - ts.message_handler.append_message(term.h_divider('-')) + ts.append_message(term.h_divider('-')) status := os.system(cmd) if status == 0 { ts.benchmark.ok() @@ -194,20 +178,20 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr { ts.failed = true ts.benchmark.fail() tls_bench.fail() - ts.message_handler.append_message(tls_bench.step_message_fail(relative_file)) + ts.append_message(tls_bench.step_message_fail(relative_file)) return sync.no_result } if r.exit_code != 0 { ts.failed = true ts.benchmark.fail() tls_bench.fail() - ts.message_handler.append_message(tls_bench.step_message_fail('${relative_file}\n$r.output\n')) + ts.append_message(tls_bench.step_message_fail('${relative_file}\n$r.output\n')) } else { ts.benchmark.ok() tls_bench.ok() if ts.show_ok_tests { - ts.message_handler.append_message(tls_bench.step_message_ok(relative_file)) + ts.append_message(tls_bench.step_message_ok(relative_file)) } } }