66
77void Task::MarkPerformed (CPUState &state, uint32_t output, size_t task_id,
88 bool shared) {
9- state.used_resources ->Set (task_id);
10- state.tasks_performed ->Set (task_id);
11-
12- if (dependencies.size ()) {
13- size_t total = num_dep_completes;
14- for (size_t i : dependencies) {
15- // Subtract just as much as needed from each dependency until we've
16- // accumulated `num_dep_completes` completions
17- size_t subtract = std::min (state.available_dependencies [i], total);
18- total -= subtract;
19- state.available_dependencies [i] -= subtract;
20-
21- subtract = std::min ((*state.shared_available_dependencies )[i], total);
22- total -= subtract;
23- (*state.shared_available_dependencies )[i] -= subtract;
24-
25- if (total == 0 ) {
9+
10+
11+ if (state.world ->GetConfig ()->ONLY_FIRST_TASK_CREDIT ()){
12+
13+ // Iterates through all tasks and checks if any of them have been done
14+ bool donePreviousTask = false ;
15+ for (int i = 0 ; i < CPU_BITSET_LENGTH ; i++){
16+ if (state.tasks_performed ->Get (i) != 0 ){
17+ donePreviousTask = true ;
18+
2619 break ;
2720 }
2821 }
29- }
3022
31- if (shared) {
32- (*state.shared_available_dependencies )[task_id]++;
33- } else {
34- state.available_dependencies [task_id]++;
23+ // If no other tasks have been done, set the current task to have been completed
24+ if (!donePreviousTask){
25+
26+ state.tasks_performed ->Set (task_id);
27+ state.used_resources ->Set (task_id);
28+
29+
30+ if (dependencies.size ()) {
31+ size_t total = num_dep_completes;
32+ for (size_t i : dependencies) {
33+ // Subtract just as much as needed from each dependency until we've
34+ // accumulated `num_dep_completes` completions
35+ size_t subtract = std::min (state.available_dependencies [i], total);
36+ total -= subtract;
37+ state.available_dependencies [i] -= subtract;
38+
39+ subtract = std::min ((*state.shared_available_dependencies )[i], total);
40+ total -= subtract;
41+ (*state.shared_available_dependencies )[i] -= subtract;
42+
43+ if (total == 0 ) {
44+ break ;
45+ }
46+ }
47+ }
48+
49+ if (shared) {
50+ (*state.shared_available_dependencies )[task_id]++;
51+ } else {
52+
53+ state.available_dependencies [task_id]++;
54+
55+ }
56+ }
3557 }
58+ else {
59+
60+ // Hosts and Symbionts get credit for all tasks they complete
61+
62+ state.tasks_performed ->Set (task_id);
63+ state.used_resources ->Set (task_id);
64+
65+
66+ if (dependencies.size ()) {
67+ size_t total = num_dep_completes;
68+ for (size_t i : dependencies) {
69+ // Subtract just as much as needed from each dependency until we've
70+ // accumulated `num_dep_completes` completions
71+ size_t subtract = std::min (state.available_dependencies [i], total);
72+ total -= subtract;
73+ state.available_dependencies [i] -= subtract;
74+
75+ subtract = std::min ((*state.shared_available_dependencies )[i], total);
76+ total -= subtract;
77+ (*state.shared_available_dependencies )[i] -= subtract;
78+
79+ if (total == 0 ) {
80+ break ;
81+ }
82+ }
83+ }
84+
85+ if (shared) {
86+ (*state.shared_available_dependencies )[task_id]++;
87+ } else {
88+ state.available_dependencies [task_id]++;
89+ }
90+ }
91+
92+
3693}
3794
3895#endif
0 commit comments