From: Patrik Gornicz Date: Sat, 22 Nov 2008 05:36:29 +0000 (-0500) Subject: wip: more thread safety X-Git-Tag: physics-premerge~90 X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=commitdiff_plain;h=5829cb660da640894c1de518353b175fbb1a12e0;p=libbear.git wip: more thread safety --- diff --git a/src/debug.cpp b/src/debug.cpp index 909a54f..e838c8e 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -47,6 +47,7 @@ void debug::init() void debug::clean() { SDL_DestroyMutex( muDPF ); + muDPF = NULL; } /// ***** Private Methods ***** diff --git a/src/entityManager.cpp b/src/entityManager.cpp index bae30ae..ecf7955 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -19,6 +19,7 @@ #include "debug.h" #include +#include #include "Entities/Entity.h" #include "Entities/Particle.h" @@ -44,15 +45,27 @@ setPhys physics_To_Add; setPhys active_Physics; setPhys physics_To_Remove; +SDL_mutex* particleSetLock = NULL; +SDL_mutex* physicsEntitySetLock = NULL; + /// ***** Initializers/Cleaners ***** void manager::init() { + particleSetLock = SDL_CreateMutex(); + physicsEntitySetLock = SDL_CreateMutex(); + collision::init(); } void manager::clean() { collision::clean(); + + SDL_DestroyMutex(particleSetLock); + particleSetLock = NULL; + + SDL_DestroyMutex(physicsEntitySetLock); + physicsEntitySetLock = NULL; } /// ***** Public Methods ***** @@ -115,44 +128,50 @@ void manager::update(float time_step) } void manager::draw() { - // update active Particle*s - for( setPart::iterator it = active_Particles.begin(); - it != active_Particles.end(); - it++ ) - { - (*it)->draw(); - } + SDL_mutexP( particleSetLock ); + // update active Particle*s + for( setPart::iterator it = active_Particles.begin(); + it != active_Particles.end(); + it++ ) + { + (*it)->draw(); + } + SDL_mutexV( particleSetLock ); - // update active PhysicsEntity*s - for( setPhys::iterator it = active_Physics.begin(); - it != active_Physics.end(); - it++ ) - { - (*it)->draw(); - } + SDL_mutexP( physicsEntitySetLock ); + // update active PhysicsEntity*s + for( setPhys::iterator it = active_Physics.begin(); + it != active_Physics.end(); + it++ ) + { + (*it)->draw(); + } + SDL_mutexV( physicsEntitySetLock ); } /// ***** Private Methods ***** void updateParticles(float time_step) { - // add new Particle*s to Active - for( setPart::iterator it = particles_To_Add.begin(); - it != particles_To_Add.end(); - it++ ) - { - active_Particles.insert(*it); - } - particles_To_Add.clear(); + SDL_mutexP( particleSetLock ); + // add new Particle*s to Active + for( setPart::iterator it = particles_To_Add.begin(); + it != particles_To_Add.end(); + it++ ) + { + active_Particles.insert(*it); + } + particles_To_Add.clear(); - // remove dead Particle*s from Active - for( setPart::iterator it = particles_To_Remove.begin(); - it != particles_To_Remove.end(); - it++ ) - { - active_Particles.erase(*it); - } - particles_To_Remove.clear(); + // remove dead Particle*s from Active + for( setPart::iterator it = particles_To_Remove.begin(); + it != particles_To_Remove.end(); + it++ ) + { + active_Particles.erase(*it); + } + particles_To_Remove.clear(); + SDL_mutexV( particleSetLock ); // update active Particle*s for( setPart::iterator it = active_Particles.begin(); @@ -164,23 +183,25 @@ void updateParticles(float time_step) } void updatePhysics(float time_step) { - // add new PhysicsEntity*s to Active - for( setPhys::iterator it = physics_To_Add.begin(); - it != physics_To_Add.end(); - it++ ) - { - active_Physics.insert(*it); - } - physics_To_Add.clear(); + SDL_mutexP( physicsEntitySetLock ); + // add new PhysicsEntity*s to Active + for( setPhys::iterator it = physics_To_Add.begin(); + it != physics_To_Add.end(); + it++ ) + { + active_Physics.insert(*it); + } + physics_To_Add.clear(); - // remove dead PhysicsEntity*s from Active - for( setPhys::iterator it = physics_To_Remove.begin(); - it != physics_To_Remove.end(); - it++ ) - { - active_Physics.erase(*it); - } - physics_To_Remove.clear(); + // remove dead PhysicsEntity*s from Active + for( setPhys::iterator it = physics_To_Remove.begin(); + it != physics_To_Remove.end(); + it++ ) + { + active_Physics.erase(*it); + } + physics_To_Remove.clear(); + SDL_mutexV( physicsEntitySetLock ); // apply collision math collision::update(active_Physics);