Skip to content

Commit

Permalink
Fix issue with deleting & recycling same id in command buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Sep 21, 2023
1 parent 40abcf1 commit 819953c
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 4 deletions.
2 changes: 1 addition & 1 deletion flecs.c
Original file line number Diff line number Diff line change
Expand Up @@ -8101,7 +8101,7 @@ bool flecs_defer_end(
for (i = 0; i < count; i ++) {
ecs_cmd_t *cmd = &cmds[i];
ecs_entity_t e = cmd->entity;
bool is_alive = flecs_entities_is_valid(world, e);
bool is_alive = flecs_entities_is_alive(world, e);

/* A negative index indicates the first command for an entity */
if (merge_to_world && (cmd->next_for_entity < 0)) {
Expand Down
2 changes: 1 addition & 1 deletion src/entity.c
Original file line number Diff line number Diff line change
Expand Up @@ -4729,7 +4729,7 @@ bool flecs_defer_end(
for (i = 0; i < count; i ++) {
ecs_cmd_t *cmd = &cmds[i];
ecs_entity_t e = cmd->entity;
bool is_alive = flecs_entities_is_valid(world, e);
bool is_alive = flecs_entities_is_alive(world, e);

/* A negative index indicates the first command for an entity */
if (merge_to_world && (cmd->next_for_entity < 0)) {
Expand Down
3 changes: 2 additions & 1 deletion test/api/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -2545,7 +2545,8 @@
"on_set_hook_before_on_add_for_existing_component",
"defer_2_sets_w_observer_same_component",
"defer_2_sets_w_observer_other_component",
"on_remove_after_deferred_clear_and_add"
"on_remove_after_deferred_clear_and_add",
"defer_delete_recycle_same_id"
]
}, {
"id": "SingleThreadStaging",
Expand Down
39 changes: 39 additions & 0 deletions test/api/src/DeferredActions.c
Original file line number Diff line number Diff line change
Expand Up @@ -3407,3 +3407,42 @@ void DeferredActions_on_remove_after_deferred_clear_and_add(void) {

ecs_fini(world);
}

static void Recycle(ecs_iter_t *it) {
ecs_new_id(it->world);
*(ecs_entity_t*)it->ctx = ecs_new_id(it->world);
}

void DeferredActions_defer_delete_recycle_same_id(void) {
ecs_world_t *world = ecs_mini();

ECS_TAG(world, Foo);
ECS_TAG(world, Bar);

ecs_entity_t parent = ecs_new_id(world);
ecs_entity_t e1 = ecs_new_w_pair(world, EcsChildOf, parent);
ecs_entity_t e2 = ecs_new_id(world);

ecs_observer(world, {
.filter.terms = {
{ .id = ecs_id(Foo) }
},
.events = { EcsOnAdd },
.callback = Recycle,
.ctx = &e1
});

ecs_defer_begin(world);
ecs_delete(world, parent);
ecs_add(world, e2, Foo);
ecs_add(world, e1, Bar);
ecs_defer_end(world);

test_assert(!ecs_is_alive(world, parent));
test_assert(ecs_is_alive(world, e2));
test_assert(ecs_is_alive(world, e1));
test_assert((uint32_t)e1 != e1);
test_assert(ecs_has(world, e2, Foo));

ecs_fini(world);
}
7 changes: 6 additions & 1 deletion test/api/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2455,6 +2455,7 @@ void DeferredActions_on_set_hook_before_on_add_for_existing_component(void);
void DeferredActions_defer_2_sets_w_observer_same_component(void);
void DeferredActions_defer_2_sets_w_observer_other_component(void);
void DeferredActions_on_remove_after_deferred_clear_and_add(void);
void DeferredActions_defer_delete_recycle_same_id(void);

// Testsuite 'SingleThreadStaging'
void SingleThreadStaging_setup(void);
Expand Down Expand Up @@ -12144,6 +12145,10 @@ bake_test_case DeferredActions_testcases[] = {
{
"on_remove_after_deferred_clear_and_add",
DeferredActions_on_remove_after_deferred_clear_and_add
},
{
"defer_delete_recycle_same_id",
DeferredActions_defer_delete_recycle_same_id
}
};

Expand Down Expand Up @@ -13054,7 +13059,7 @@ static bake_test_suite suites[] = {
"DeferredActions",
NULL,
NULL,
115,
116,
DeferredActions_testcases
},
{
Expand Down

0 comments on commit 819953c

Please sign in to comment.