ARGoS  3
A parallel, multi-engine simulator for swarm robotics
core/simulator/space/space_multi_thread_balance_quantity.h
Go to the documentation of this file.
00001 
00007 #ifndef SPACE_MULTI_THREAD_BALANCE_QUANTITY_H
00008 #define SPACE_MULTI_THREAD_BALANCE_QUANTITY_H
00009 
00010 #include <argos3/core/simulator/space/space.h>
00011 #include <pthread.h>
00012 
00013 namespace argos {
00014 
00015    class CSpaceMultiThreadBalanceQuantity : public CSpace {
00016 
00017       /****************************************/
00018       /****************************************/
00019       
00020    private:
00021       
00022       struct SUpdateThreadData {
00023          UInt32 ThreadId;
00024          CSpaceMultiThreadBalanceQuantity* Space;
00025          
00026          SUpdateThreadData(UInt32 un_thread_id,
00027                            CSpaceMultiThreadBalanceQuantity* pc_space) :
00028             ThreadId(un_thread_id),
00029             Space(pc_space) {}
00030       };
00031 
00032       /****************************************/
00033       /****************************************/
00034 
00035    private:
00036 
00038       SUpdateThreadData** m_psUpdateThreadData;
00039 
00041       pthread_t* m_ptUpdateThreads;
00042 
00044       UInt32 m_unSenseControlStepPhaseDoneCounter;
00045       UInt32 m_unActPhaseDoneCounter;
00046       UInt32 m_unPhysicsPhaseDoneCounter;
00047       UInt32 m_unMediaPhaseDoneCounter;
00048 
00050       pthread_mutex_t m_tSenseControlStepConditionalMutex;
00051       pthread_mutex_t m_tActConditionalMutex;
00052       pthread_mutex_t m_tPhysicsConditionalMutex;
00053       pthread_mutex_t m_tMediaConditionalMutex;
00054 
00056       pthread_cond_t m_tSenseControlStepConditional;
00057       pthread_cond_t m_tActConditional;
00058       pthread_cond_t m_tPhysicsConditional;
00059       pthread_cond_t m_tMediaConditional;
00060 
00063       bool m_bIsControllableEntityAssignmentRecalculationNeeded;
00064 
00065    public:
00066 
00067       CSpaceMultiThreadBalanceQuantity() :
00068          m_psUpdateThreadData(NULL),
00069          m_ptUpdateThreads(NULL),
00070          m_bIsControllableEntityAssignmentRecalculationNeeded(true) {}
00071       virtual ~CSpaceMultiThreadBalanceQuantity() {}
00072 
00073       virtual void Init(TConfigurationNode& t_tree);
00074       virtual void Destroy();
00075 
00076       virtual void UpdateControllableEntities();
00077       virtual void UpdatePhysics();
00078       virtual void UpdateMedia();
00079 
00080    protected:
00081 
00082       virtual void AddControllableEntity(CControllableEntity& c_entity);
00083       virtual void RemoveControllableEntity(CControllableEntity& c_entity);
00084 
00085    private:
00086 
00087       void StartThreads();
00088       void UpdateThread(UInt32 un_id);
00089       friend void* LaunchUpdateThreadBalanceQuantity(void* p_data);
00090 
00091    };
00092 
00093 }
00094 
00095 #endif