Box2d removeJoint Fatal signal 11 (SIGSEGV)

У меня возникает ошибка Fatal signal 11 (SIGSEGV) при попытке удалить соединение mouseJoint. Мой код основан на этом AndEngine Пример PhysicsMouseJoint

//physicWorld onUpdate
@Override
public void onUpdate(float pSecondsElapsed) {
    if (removeMouseJoint) {
        destroyMouseJoint();
        removeMouseJoint = false;
    }

    for (Body body : elementsToBeDestroyed) {
        destroyBody(body, elementsMap.remove(body).getKey());
        checkForMouseJoint(body);
    }
    elementsToBeDestroyed.clear();
}

private void destroyBody(final Body body, final IShape mask) {
    if (physicsWorld != null) {
        physicsWorld.unregisterPhysicsConnector(physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(mask));
        physicsWorld.destroyBody(body);
    }
}

private void checkForMouseJoint(Body body) {
    if (mouseJointActive != null && mouseJointActive.getBodyB() != null && mouseJointActive.getBodyB().equals(body)) {
        destroyMouseJoint();
    }
}

private void destroyMouseJoint() {
    if (mouseJointActive != null && mouseJointActive.getBodyB() != null) {
        Log.i(C.TAG, "destroyMouseJoint from " + mouseJointActive.getBodyB().getUserData());
        physicsWorld.destroyJoint(mouseJointActive);
    }
    mouseJointActive = null;
}

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    switch (pSceneTouchEvent.getAction()) {
        case TouchEvent.ACTION_UP:
            if (sceneTouchId == pSceneTouchEvent.getPointerID()) {
                sceneTouchId = -1;
                // destroyMouseJoint();
                removeMouseJoint = true;
            }
        return true;
        }
    …
    return false;
}


Он случайно падает, и мой Log.i() показывает, что это проблема с destroyJoint:

08-13 14:56:18.465 ...I/[Logger] destroyMouseJoint from bodyColorGreen
08-13 14:56:18.970 ...A/libc﹕ Фатальный сигнал 11 (SIGSEGV) по адресу 0xbf800008 (code=1), поток 23033 (UpdateThread)

Как я могу решить эту проблему?
Спасибо за ваше время.


person GuilhE    schedule 13.08.2014    source источник
comment
Вероятно, вы разрушаете один и тот же косяк дважды. Когда вы разрушаете тело, разрушаются и все соединенные с ним суставы. Попробуйте удалить строку checkForMouseJoint(body);.   -  person cygery    schedule 13.08.2014
comment
Да, вы правы, мне не нужен этот checkForMouseJoint ;) но проблема сохраняется и без него.   -  person GuilhE    schedule 13.08.2014
comment
Вы можете подтвердить, что не уничтожаете одно и то же тело дважды?   -  person cygery    schedule 13.08.2014
comment
Я нашел проблему! Ну, по крайней мере, я не получаю этот SIGSEGV, так что будем надеяться... Я обновлю свой вопрос.   -  person GuilhE    schedule 13.08.2014
comment
Если вы решили свою проблему, отправьте ответ и примите его.   -  person cygery    schedule 13.08.2014


Ответы (1)


Я нашел проблему! Поскольку я отключал столкновения и удалял тела, у меня возникла проблема параллелизма. Я исправил эту ситуацию, используя ReentrantLock во всех методах, которые манипулировать телами, добавлять/удалять/сталкиваться/и т. д.... Отлично работает, больше нет SIGSEGV.

person GuilhE    schedule 13.08.2014