Skip to content

Commit a25ad82

Browse files
authored
fix: capability safeties (#156)
1 parent cb60b50 commit a25ad82

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

rt_entt_codegen/shared/parallel.cc

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ static auto loop_iterator(
204204
) -> void {
205205
std::vector<system_like_id_variant> parallel_system_list;
206206
auto unsafe_comps = std::set<ecsact_component_like_id>{};
207+
auto safe_ro_comps = std::set<ecsact_component_like_id>{};
207208

208209
using ecsact::meta::decl_full_name;
209210

@@ -227,7 +228,9 @@ static auto loop_iterator(
227228
}
228229

229230
auto capabilities = ecsact::meta::system_capabilities(sys_like_id);
231+
230232
auto child_unsafe_comps = std::set<ecsact_component_like_id>{};
233+
auto child_safe_ro_comps = std::set<ecsact_component_like_id>{};
231234
auto child_systems = ecsact::meta::get_child_system_ids(sys_like_id);
232235

233236
for(auto child_sys_id : child_systems) {
@@ -251,22 +254,18 @@ static auto loop_iterator(
251254
} else {
252255
child_unsafe_comps.insert(child_comp_id);
253256
}
257+
} else {
258+
if(child_capability == ECSACT_SYS_CAP_READONLY ||
259+
child_capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
260+
child_safe_ro_comps.insert(child_comp_id);
261+
}
254262
}
255263
}
256264
}
257265

258266
for(const auto [comp_id, capability] : capabilities) {
259267
auto cpp_name = decl_full_name(comp_id);
260268

261-
if(unsafe_comps.contains(comp_id)) {
262-
if(capability == ECSACT_SYS_CAP_READONLY ||
263-
capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
264-
parallel_system_cluster.push_back(parallel_system_list);
265-
loop_iterator(system_list, iterator, parallel_system_cluster);
266-
return;
267-
}
268-
}
269-
270269
if(!is_capability_safe(capability)) {
271270
if(!unsafe_comps.contains(comp_id)) {
272271
unsafe_comps.insert(comp_id);
@@ -275,12 +274,29 @@ static auto loop_iterator(
275274
loop_iterator(system_list, iterator, parallel_system_cluster);
276275
return;
277276
}
277+
} else {
278+
if(capability == ECSACT_SYS_CAP_READONLY ||
279+
capability == ECSACT_SYS_CAP_OPTIONAL_READONLY) {
280+
safe_ro_comps.insert(comp_id);
281+
}
282+
}
283+
284+
if(unsafe_comps.contains(comp_id) && safe_ro_comps.contains(comp_id)) {
285+
parallel_system_cluster.push_back(parallel_system_list);
286+
loop_iterator(system_list, iterator, parallel_system_cluster);
287+
return;
288+
}
289+
}
290+
291+
for(auto child_safe_ro_comp : child_safe_ro_comps) {
292+
if(!safe_ro_comps.contains(child_safe_ro_comp)) {
293+
safe_ro_comps.insert(child_safe_ro_comp);
278294
}
279295
}
280296

281-
for(auto unsafe_comp : child_unsafe_comps) {
282-
if(!unsafe_comps.contains(unsafe_comp)) {
283-
unsafe_comps.insert(unsafe_comp);
297+
for(auto child_unsafe_comp : child_unsafe_comps) {
298+
if(!unsafe_comps.contains(child_unsafe_comp)) {
299+
unsafe_comps.insert(child_unsafe_comp);
284300
}
285301
}
286302

0 commit comments

Comments
 (0)