From 2d2cbcaf1c2afd1565502f8f0c83fb1cd56f6cec Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 9 Dec 2016 17:56:55 +0200 Subject: Fix GCC 5 compilation error, improve scheduler unit test --- build2/scheduler | 9 +++++--- unit-tests/scheduler/driver.cxx | 48 ++++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/build2/scheduler b/build2/scheduler index 99e9524..80b9ec9 100644 --- a/build2/scheduler +++ b/build2/scheduler @@ -110,7 +110,7 @@ namespace build2 new (&td->data) task { &task_count, decay_copy (forward (f)), - {decay_copy (forward (a))...}}; + typename task::args_type (decay_copy (forward (a))...)}; td->thunk = &task_thunk; } @@ -235,9 +235,12 @@ namespace build2 template struct task_type { + using func_type = std::decay_t; + using args_type = std::tuple...>; + atomic_count* task_count; - std::decay_t func; - std::tuple...> args; + func_type func; + args_type args; template void diff --git a/unit-tests/scheduler/driver.cxx b/unit-tests/scheduler/driver.cxx index 65ba5e5..726415a 100644 --- a/unit-tests/scheduler/driver.cxx +++ b/unit-tests/scheduler/driver.cxx @@ -17,11 +17,24 @@ using namespace std; namespace build2 { + // Usage argv[0] + // int - main () + main (int argc, char* argv[]) { - //scheduler s (1); - scheduler s (scheduler::hardware_concurrency ()); + bool verb (false); + size_t max_active (0); + + if (argc > 1) + { + verb = true; + max_active = stoul (argv[1]); + } + + if (max_active == 0) + max_active = scheduler::hardware_concurrency (); + + scheduler s (max_active); auto inner = [] (size_t x, size_t y, size_t& out) { @@ -70,25 +83,26 @@ namespace build2 scheduler::stat st (s.shutdown ()); - /* - cerr << "thread_max_active " << st.thread_max_active << endl - << "thread_max_total " << st.thread_max_total << endl - << "thread_helpers " << st.thread_helpers << endl - << "thread_max_waiting " << st.thread_max_waiting << endl - << endl - << "task_queue_depth " << st.task_queue_depth << endl - << "task_queue_full " << st.task_queue_full << endl - << endl - << "wait_queue_slots " << st.wait_queue_slots << endl - << "wait_queue_collisions " << st.wait_queue_collisions << endl; - */ + if (verb) + { + cerr << "thread_max_active " << st.thread_max_active << endl + << "thread_max_total " << st.thread_max_total << endl + << "thread_helpers " << st.thread_helpers << endl + << "thread_max_waiting " << st.thread_max_waiting << endl + << endl + << "task_queue_depth " << st.task_queue_depth << endl + << "task_queue_full " << st.task_queue_full << endl + << endl + << "wait_queue_slots " << st.wait_queue_slots << endl + << "wait_queue_collisions " << st.wait_queue_collisions << endl; + } return 0; } } int -main () +main (int argc, char* argv[]) { - return build2::main (); + return build2::main (argc, argv); } -- cgit v1.1