diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2018-02-07 10:00:46 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2018-02-07 14:05:39 +0200 |
commit | 378b2598a305d4e332e52460ca89dd867546a58b (patch) | |
tree | 7541771843232bc6d51880d58a57e25737b7ba13 /build2/algorithm.hxx | |
parent | f10be65c39c18668df31c8680569a6417ef3ae06 (diff) |
Initial work for default update outer operation
While update still uses the old "all update rules update all their
prerequisites" assumption, test and install have been fixed not to
rely on this.
Diffstat (limited to 'build2/algorithm.hxx')
-rw-r--r-- | build2/algorithm.hxx | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/build2/algorithm.hxx b/build2/algorithm.hxx index 8978eba..5287f23 100644 --- a/build2/algorithm.hxx +++ b/build2/algorithm.hxx @@ -389,10 +389,12 @@ namespace build2 // changed and target_state::unchanged otherwise. If a prerequisite's // execution is postponed, then set its pointer in prerequisite_targets to // NULL (since its state cannot be queried MT-safely). If count is not 0, - // then only the first count prerequisites are executed. + // then only the first count prerequisites are executed beginning from + // start. // target_state - straight_execute_prerequisites (action, const target&, size_t count = 0); + straight_execute_prerequisites (action, const target&, + size_t count = 0, size_t start = 0); // As above but iterates over the prerequisites in reverse. // @@ -404,6 +406,19 @@ namespace build2 target_state execute_prerequisites (action, const target&, size_t count = 0); + // As above but execute prerequisites for the inner action (that have + // been matched with match_inner()). + // + target_state + straight_execute_prerequisites_inner (action, const target&, + size_t count = 0, size_t start = 0); + + target_state + reverse_execute_prerequisites_inner (action, const target&, size_t count = 0); + + target_state + execute_prerequisites_inner (action, const target&, size_t count = 0); + // A version of the above that also determines whether the action needs to // be executed on the target based on the passed timestamp and filter. // @@ -469,11 +484,27 @@ namespace build2 // template <typename T> target_state - straight_execute_members (action, const target&, T[], size_t); + straight_execute_members (action, atomic_count&, T[], size_t, size_t); template <typename T> target_state - reverse_execute_members (action, const target&, T[], size_t); + reverse_execute_members (action, atomic_count&, T[], size_t, size_t); + + template <typename T> + inline target_state + straight_execute_members (action a, const target& t, + T ts[], size_t c, size_t s) + { + return straight_execute_members (a, t[a].task_count, ts, c, s); + } + + template <typename T> + inline target_state + reverse_execute_members (action a, const target& t, + T ts[], size_t c, size_t s) + { + return reverse_execute_members (a, t[a].task_count, ts, c, s); + } // Call straight or reverse depending on the current mode. // @@ -484,14 +515,14 @@ namespace build2 inline target_state straight_execute_members (action a, const target& t, const target* (&ts)[N]) { - return straight_execute_members (a, t, ts, N); + return straight_execute_members (a, t, ts, N, 0); } template <size_t N> inline target_state reverse_execute_members (action a, const target& t, const target* (&ts)[N]) { - return reverse_execute_members (a, t, ts, N); + return reverse_execute_members (a, t, ts, N, N); } template <size_t N> |