Merge pull request #7421 from ZappoMan/fixBlenderCrashRedux

one more crack at fixing the blender
This commit is contained in:
Philip Rosedale 2016-03-22 09:51:21 -07:00
commit f57332e4be
2 changed files with 16 additions and 6 deletions

View file

@ -1277,20 +1277,26 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) {
}
return;
}
_modelsRequiringBlends.insert(model);
{
Lock lock(_mutex);
_modelsRequiringBlends.insert(model);
}
}
void ModelBlender::setBlendedVertices(const QPointer<Model>& model, int blendNumber,
const QWeakPointer<NetworkGeometry>& geometry, const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {
if (!model.isNull()) {
model->setBlendedVertices(blendNumber, geometry, vertices, normals);
}
_pendingBlenders--;
while (!_modelsRequiringBlends.empty()) {
auto firstItem = _modelsRequiringBlends.begin();
if (firstItem != _modelsRequiringBlends.end()) {
_modelsRequiringBlends.erase(firstItem);
ModelPointer nextModel = firstItem->lock();
{
Lock lock(_mutex);
for (auto i = _modelsRequiringBlends.begin(); i != _modelsRequiringBlends.end();) {
auto weakPtr = *i;
_modelsRequiringBlends.erase(i++); // remove front of the set
ModelPointer nextModel = weakPtr.lock();
if (nextModel && nextModel->maybeStartBlender()) {
_pendingBlenders++;
return;

View file

@ -402,11 +402,15 @@ public slots:
const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals);
private:
using Mutex = std::mutex;
using Lock = std::unique_lock<Mutex>;
ModelBlender();
virtual ~ModelBlender();
std::set<ModelWeakPointer, std::owner_less<ModelWeakPointer>> _modelsRequiringBlends;
int _pendingBlenders;
Mutex _mutex;
};