Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d1e65fa authored by Michael Lentine's avatar Michael Lentine Committed by Jesse Hall
Browse files

Don't remove elements while iterating through active_layers.

Change-Id: I595e51aea635dad13b6e919dee2229defc4da55a
(cherry picked from commit b735b6d52dad4d72e16968aa66a8282df2c733ea)
parent 233ac731
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -348,12 +348,9 @@ void ActivateLayer(TObject* object, Instance* instance, const String& name) {
    object->active_layers.push_back(element);
}

template <class TObject>
void DeactivateLayer(TObject* object,
                     Instance* instance,
void DeactivateLayer(Instance* instance,
                     Vector<LayerMapIterator>::iterator& element) {
    LayerMapIterator& layer_map_data = *element;
    object->active_layers.erase(element);
    LayerData& layer_data = layer_map_data->second;
    pthread_mutex_lock(&instance->layer_lock);
    layer_data.ref_count--;
@@ -556,7 +553,7 @@ void DestroyInstanceBottom(VkInstance instance) {
    }
    for (auto it = instance->active_layers.begin();
         it != instance->active_layers.end(); ++it) {
        DeactivateLayer(instance, instance, it);
        DeactivateLayer(instance, it);
    }
    const VkAllocCallbacks* alloc = instance->alloc;
    instance->~VkInstance_T();
@@ -1117,9 +1114,8 @@ VkResult DestroyDevice(VkDevice drv_device) {
    Device* device = static_cast<Device*>(vtbl->device);
    for (auto it = device->active_layers.begin();
         it != device->active_layers.end(); ++it) {
        DeactivateLayer(device, device->instance, it);
        DeactivateLayer(device->instance, it);
    }
    device->active_layers.clear();
    vtbl->DestroyDevice(drv_device);
    DestroyDevice(device);
    return VK_SUCCESS;