ARGoS
3
A parallel, multi-engine simulator for swarm robotics
|
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