aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/target.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2020-03-20 05:46:06 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2020-03-20 05:46:06 +0200
commita00647acd3b1c08c61234af994c2c29735a9b3ce (patch)
tree7d4825e084f0bb0914193d337d31907e07b0aaa1 /libbuild2/target.ixx
parentcbcb0b03501ce346ca3778624dcf908e851e6e2e (diff)
Add ability to query whether target has been matched for action
Diffstat (limited to 'libbuild2/target.ixx')
-rw-r--r--libbuild2/target.ixx17
1 files changed, 17 insertions, 0 deletions
diff --git a/libbuild2/target.ixx b/libbuild2/target.ixx
index f7896d0..3842c37 100644
--- a/libbuild2/target.ixx
+++ b/libbuild2/target.ixx
@@ -66,6 +66,22 @@ namespace build2
}
inline bool target::
+ matched (action a) const
+ {
+ assert (ctx.phase == run_phase::execute);
+
+ const opstate& s (state[a]);
+
+ // Note that while the target could be being executed, we should see at
+ // least offset_matched since it must have been "achieved" before the
+ // phase switch.
+ //
+ size_t c (s.task_count.load (memory_order_relaxed) - ctx.count_base ());
+
+ return c >= offset_matched;
+ }
+
+ inline bool target::
group_state (action a) const
{
// We go an extra step and short-circuit to the target state even if the
@@ -96,6 +112,7 @@ namespace build2
const opstate& s (state[a]);
// Note: already synchronized.
+ //
size_t o (s.task_count.load (memory_order_relaxed) - ctx.count_base ());
if (o == offset_tried)