SanderMertens / flecs

A fast entity component system (ECS) for C & C++

Home Page:https://www.flecs.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Assert elem_size == map->elem_size in multi-threaded mode

opened this issue · comments

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

image

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;
}

Cannot reproduce on the latest master. Thank you!