Index: evolvotron-0.7.1/libevolvotron/mutatable_image_computer_farm.cpp =================================================================== --- evolvotron-0.7.1.orig/libevolvotron/mutatable_image_computer_farm.cpp +++ evolvotron-0.7.1/libevolvotron/mutatable_image_computer_farm.cpp @@ -72,19 +72,20 @@ void MutatableImageComputerFarm::fasttra { QMutexLocker lock(&_mutex); - // \todo: Inefficient starting search again each time. Some problem with erase otherwise though, but might have been task abort mem leak. - TodoQueue::iterator it; - while ( - ( - it=std::find_if(_todo.begin(),_todo.end(),predicate_aborted) - ) - != - _todo.end() - ) - { - _done[(*it)->display()].insert(*it); - _todo.erase(it); - } + TodoQueue::iterator it = _todo.begin(); + + while (it != _todo.end()) + { + if ((*it)->aborted()) + { + _done[(*it)->display()].insert(*it); + it = _todo.erase(it); + } + else + { + it++; + } + } } void MutatableImageComputerFarm::push_todo(const boost::shared_ptr& task) @@ -214,7 +215,9 @@ void MutatableImageComputerFarm::abort_f if ((*it)->display()==disp) { (*it)->abort(); - _todo.erase(it); + it = _todo.erase(it); + if (it == _todo.end()) + break; } } @@ -234,7 +237,9 @@ void MutatableImageComputerFarm::abort_f if ((*it1)->display()==disp) { (*it1)->abort(); - q.erase(it1); + it1 = q.erase(it1); + if (it1 == q.end()) + break; } } }