Merge pull request #2181 from ZappoMan/bugfixes

particle deadlock and crash fixes a different way
This commit is contained in:
Philip Rosedale 2014-03-03 17:31:29 -08:00
commit d38df21960
5 changed files with 18 additions and 16 deletions

View file

@ -39,12 +39,13 @@ float boundaryDistanceForRenderLevel(unsigned int renderLevel, float voxelSizeSc
} }
Octree::Octree(bool shouldReaverage) : Octree::Octree(bool shouldReaverage) :
_rootNode(NULL),
_isDirty(true), _isDirty(true),
_shouldReaverage(shouldReaverage), _shouldReaverage(shouldReaverage),
_stopImport(false), _stopImport(false),
_lock(QReadWriteLock::Recursive) { _lock(),
_rootNode = NULL; _isViewing(false)
_isViewing = false; {
} }
Octree::~Octree() { Octree::~Octree() {
@ -552,10 +553,7 @@ OctreeElement* Octree::getOctreeElementAt(float x, float y, float z, float s) co
OctreeElement* Octree::getOrCreateChildElementAt(float x, float y, float z, float s) { OctreeElement* Octree::getOrCreateChildElementAt(float x, float y, float z, float s) {
lockForWrite(); return getRoot()->getOrCreateChildElementAt(x, y, z, s);
OctreeElement* result = getRoot()->getOrCreateChildElementAt(x, y, z, s);
unlock();
return result;
} }

View file

@ -385,7 +385,7 @@ Particle Particle::fromEditPacket(const unsigned char* data, int length, int& pr
} else { } else {
// look up the existing particle // look up the existing particle
const Particle* existingParticle = tree->findParticleByID(editID); const Particle* existingParticle = tree->findParticleByID(editID, true);
// copy existing properties before over-writing with new properties // copy existing properties before over-writing with new properties
if (existingParticle) { if (existingParticle) {

View file

@ -370,12 +370,16 @@ bool ParticleTree::findByIDOperation(OctreeElement* element, void* extraData) {
} }
const Particle* ParticleTree::findParticleByID(uint32_t id) { const Particle* ParticleTree::findParticleByID(uint32_t id, bool alreadyLocked) {
FindByIDArgs args = { id, false, NULL }; FindByIDArgs args = { id, false, NULL };
lockForRead(); if (!alreadyLocked) {
lockForRead();
}
recurseTreeWithOperation(findByIDOperation, &args); recurseTreeWithOperation(findByIDOperation, &args);
unlock(); if (!alreadyLocked) {
unlock();
}
return args.foundParticle; return args.foundParticle;
} }
@ -455,6 +459,7 @@ bool ParticleTree::pruneOperation(OctreeElement* element, void* extraData) {
} }
void ParticleTree::update() { void ParticleTree::update() {
lockForWrite();
_isDirty = true; _isDirty = true;
ParticleTreeUpdateArgs args = { }; ParticleTreeUpdateArgs args = { };
@ -469,9 +474,7 @@ void ParticleTree::update() {
AABox treeBounds = getRoot()->getAABox(); AABox treeBounds = getRoot()->getAABox();
if (!shouldDie && treeBounds.contains(args._movingParticles[i].getPosition())) { if (!shouldDie && treeBounds.contains(args._movingParticles[i].getPosition())) {
lockForWrite();
storeParticle(args._movingParticles[i]); storeParticle(args._movingParticles[i]);
unlock();
} else { } else {
uint32_t particleID = args._movingParticles[i].getID(); uint32_t particleID = args._movingParticles[i].getID();
quint64 deletedAt = usecTimestampNow(); quint64 deletedAt = usecTimestampNow();
@ -482,7 +485,6 @@ void ParticleTree::update() {
} }
// prune the tree... // prune the tree...
lockForWrite();
recurseTreeWithOperation(pruneOperation, NULL); recurseTreeWithOperation(pruneOperation, NULL);
unlock(); unlock();
} }

View file

@ -44,7 +44,7 @@ public:
void addParticle(const ParticleID& particleID, const ParticleProperties& properties); void addParticle(const ParticleID& particleID, const ParticleProperties& properties);
void deleteParticle(const ParticleID& particleID); void deleteParticle(const ParticleID& particleID);
const Particle* findClosestParticle(glm::vec3 position, float targetRadius); const Particle* findClosestParticle(glm::vec3 position, float targetRadius);
const Particle* findParticleByID(uint32_t id); const Particle* findParticleByID(uint32_t id, bool alreadyLocked = false);
/// finds all particles that touch a sphere /// finds all particles that touch a sphere
/// \param center the center of the sphere /// \param center the center of the sphere

View file

@ -33,7 +33,9 @@ ParticleID ParticlesScriptingInterface::addParticle(const ParticleProperties& pr
// If we have a local particle tree set, then also update it. // If we have a local particle tree set, then also update it.
if (_particleTree) { if (_particleTree) {
_particleTree->lockForWrite();
_particleTree->addParticle(id, properties); _particleTree->addParticle(id, properties);
_particleTree->unlock();
} }
return id; return id;
@ -64,7 +66,7 @@ ParticleProperties ParticlesScriptingInterface::getParticleProperties(ParticleID
} }
if (_particleTree) { if (_particleTree) {
_particleTree->lockForRead(); _particleTree->lockForRead();
const Particle* particle = _particleTree->findParticleByID(identity.id); const Particle* particle = _particleTree->findParticleByID(identity.id, true);
if (particle) { if (particle) {
results.copyFromParticle(*particle); results.copyFromParticle(*particle);
} else { } else {