use tryLock in some cases where we don't want to block and pass already locked to the findParticleByID() in scripting interface

This commit is contained in:
ZappoMan 2014-01-31 17:12:50 -08:00
parent 5b825ecd5b
commit 289be04f0f
3 changed files with 17 additions and 10 deletions

View file

@ -32,10 +32,11 @@ void ParticleTreeRenderer::init() {
void ParticleTreeRenderer::update() { void ParticleTreeRenderer::update() {
if (_tree) { if (_tree) {
ParticleTree* tree = (ParticleTree*)_tree; ParticleTree* tree = static_cast<ParticleTree*>(_tree);
_tree->lockForWrite(); if (tree->tryLockForWrite()) {
tree->update(); tree->update();
_tree->unlock(); tree->unlock();
}
} }
} }

View file

@ -56,9 +56,10 @@ bool ParticleCollisionSystem::updateOperation(OctreeElement* element, void* extr
void ParticleCollisionSystem::update() { void ParticleCollisionSystem::update() {
// update all particles // update all particles
_particles->lockForWrite(); if (_particles->tryLockForWrite()) {
_particles->recurseTreeWithOperation(updateOperation, this); _particles->recurseTreeWithOperation(updateOperation, this);
_particles->unlock(); _particles->unlock();
}
} }

View file

@ -43,6 +43,7 @@ ParticleID ParticlesScriptingInterface::addParticle(const ParticleProperties& pr
ParticleID ParticlesScriptingInterface::identifyParticle(ParticleID particleID) { ParticleID ParticlesScriptingInterface::identifyParticle(ParticleID particleID) {
uint32_t actualID = particleID.id; uint32_t actualID = particleID.id;
if (!particleID.isKnownID) { if (!particleID.isKnownID) {
actualID = Particle::getIDfromCreatorTokenID(particleID.creatorTokenID); actualID = Particle::getIDfromCreatorTokenID(particleID.creatorTokenID);
if (actualID == UNKNOWN_PARTICLE_ID) { if (actualID == UNKNOWN_PARTICLE_ID) {
@ -65,8 +66,12 @@ 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);
results.copyFromParticle(*particle); if (particle) {
results.copyFromParticle(*particle);
} else {
results.setIsUnknownID();
}
_particleTree->unlock(); _particleTree->unlock();
} }
@ -123,7 +128,7 @@ void ParticlesScriptingInterface::deleteParticle(ParticleID particleID) {
if (actualID != UNKNOWN_PARTICLE_ID) { if (actualID != UNKNOWN_PARTICLE_ID) {
particleID.id = actualID; particleID.id = actualID;
particleID.isKnownID = true; particleID.isKnownID = true;
queueParticleMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleID, properties); queueParticleMessage(PacketTypeParticleAddOrEdit, particleID, properties);
} }
// If we have a local particle tree set, then also update it. // If we have a local particle tree set, then also update it.