Assert elem_size == map->elem_size in multi-threaded mode
opened this issue · comments
Deleted user commented
Hello,
flecs asserts when called ecs_set_name in a multi-threaded mode. Please see the calls tack below .
I believe it is linked to the #659
Sander Mertens commented
Wasn't able to reproduce the issue (pasted the code I used below). Are you able to create a reproducer? It actually looks like the assert is not happening while the process is running multiple threads, so could be related to something else.
int counter = 0;
void sys(ecs_iter_t *it) {
for (int i = 0; i < it->count; i ++) {
char name[20];
int v = ecs_os_ainc(&counter);
sprintf(name, "P.X.A.E%u", v);
ecs_set_name(it->world, it->entities[i], name);
}
}
int main(int argc, char **argv)
{
ecs_log_set_level(1);
ecs_world_t *ecs = ecs_init();
ecs_set_threads(ecs, 4);
ECS_TAG(ecs, Foo);
ecs_entity_t A = ecs_new_entity(ecs, "P.A");
ecs_add(ecs, A, Foo);
ecs_entity_t B = ecs_new_entity(ecs, "B");
ecs_add(ecs, B, Foo);
ecs_entity_t C = ecs_new_entity(ecs, "C");
ecs_add(ecs, C, Foo);
ecs_entity_t D = ecs_new_entity(ecs, "P.X.D");
ecs_add(ecs, D, Foo);
ecs_entity_t E = ecs_new_entity(ecs, "E");
ecs_add(ecs, E, Foo);
ecs_entity_t F = ecs_new_entity(ecs, "F");
ecs_add(ecs, F, Foo);
ecs_entity_t G = ecs_new_entity(ecs, "G");
ecs_add(ecs, G, Foo);
ecs_entity_t H = ecs_new_id(ecs);
ecs_add(ecs, H, Foo);
ecs_entity_t I = ecs_new_id(ecs);
ecs_add(ecs, I, Foo);
ecs_entity_t J = ecs_new_id(ecs);
ecs_add(ecs, J, Foo);
ecs_system_init(ecs, &(ecs_system_desc_t) {
.entity.add = {EcsOnUpdate},
.query.filter.terms = {{ Foo }},
.multi_threaded = true,
.callback = sys
});
while (true) {
ecs_progress(ecs, 0);
}
return 0;
}
Deleted user commented
Cannot reproduce on the latest master. Thank you!