aboutsummaryrefslogtreecommitdiff
path: root/build2/b.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-04-08 08:10:32 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-04-08 08:10:32 +0200
commit230e7cb0bab4582132de2bc411e355eacbacff4a (patch)
tree166ca16718762b679777b6fb198dc053187d3c89 /build2/b.cxx
parentd8cba1bae2b0212c7f8bc5af5c33709a6e622510 (diff)
Add phase switch contention to build statistics
Diffstat (limited to 'build2/b.cxx')
-rw-r--r--build2/b.cxx36
1 files changed, 26 insertions, 10 deletions
diff --git a/build2/b.cxx b/build2/b.cxx
index 556cf36..e615ef5 100644
--- a/build2/b.cxx
+++ b/build2/b.cxx
@@ -268,6 +268,10 @@ main (int argc, char* argv[])
options ops;
scheduler sched;
+ // Statistics.
+ //
+ size_t phase_switch_contention (0);
+
try
{
// Parse the command line.
@@ -412,9 +416,17 @@ main (int argc, char* argv[])
// below).
//
unique_ptr<context> pctx;
- auto new_context = [&ops, &cmdl, &pctx, &sched, &mutexes, &fcache]
+ auto new_context = [&ops, &cmdl,
+ &sched, &mutexes, &fcache,
+ &phase_switch_contention,
+ &pctx]
{
- pctx = nullptr; // Free first.
+ if (pctx != nullptr)
+ {
+ phase_switch_contention += pctx->phase_mutex.contention;
+ pctx = nullptr; // Free first to reuse memory.
+ }
+
pctx.reset (new context (sched,
mutexes,
fcache,
@@ -1389,6 +1401,8 @@ main (int argc, char* argv[])
cout << endl;
}
#endif
+
+ phase_switch_contention += pctx->phase_mutex.contention;
}
catch (const failed&)
{
@@ -1410,16 +1424,18 @@ main (int argc, char* argv[])
{
text << '\n'
<< "build statistics:" << "\n\n"
- << " thread_max_active " << st.thread_max_active << '\n'
- << " thread_max_total " << st.thread_max_total << '\n'
- << " thread_helpers " << st.thread_helpers << '\n'
- << " thread_max_waiting " << st.thread_max_waiting << '\n'
+ << " thread_max_active " << st.thread_max_active << '\n'
+ << " thread_max_total " << st.thread_max_total << '\n'
+ << " thread_helpers " << st.thread_helpers << '\n'
+ << " thread_max_waiting " << st.thread_max_waiting << '\n'
+ << '\n'
+ << " task_queue_depth " << st.task_queue_depth << '\n'
+ << " task_queue_full " << st.task_queue_full << '\n'
<< '\n'
- << " task_queue_depth " << st.task_queue_depth << '\n'
- << " task_queue_full " << st.task_queue_full << '\n'
+ << " wait_queue_slots " << st.wait_queue_slots << '\n'
+ << " wait_queue_collisions " << st.wait_queue_collisions << '\n'
<< '\n'
- << " wait_queue_slots " << st.wait_queue_slots << '\n'
- << " wait_queue_collisions " << st.wait_queue_collisions << '\n';
+ << " phase_switch_contention " << phase_switch_contention << '\n';
}
return r;