ARGoS
3
A parallel, multi-engine simulator for swarm robotics
|
00001 00011 #ifndef SPACE_MULTI_THREAD_BALANCE_LENGTH_H 00012 #define SPACE_MULTI_THREAD_BALANCE_LENGTH_H 00013 00014 namespace argos { 00015 class CSpace; 00016 } 00017 00018 #include <argos3/core/simulator/space/space.h> 00019 00020 namespace argos { 00021 00022 class CSpaceMultiThreadBalanceLength : public CSpace { 00023 00024 public: 00025 00026 CSpaceMultiThreadBalanceLength() {} 00027 virtual ~CSpaceMultiThreadBalanceLength() {} 00028 00029 virtual void Init(TConfigurationNode& t_tree); 00030 virtual void Destroy(); 00031 00032 virtual void UpdateControllableEntities(); 00033 virtual void UpdatePhysics(); 00034 virtual void UpdateMedia() {} 00035 00036 private: 00037 00038 void StartThreads(); 00039 void DispatchThread(UInt32 un_id); 00040 void SlaveThread(UInt32 un_id); 00041 friend void* LaunchThreadBalanceLength(void* p_data); 00042 00043 private: 00044 00046 struct SThreadLaunchData { 00047 UInt32 ThreadId; 00048 CSpaceMultiThreadBalanceLength* Space; 00049 00050 SThreadLaunchData(UInt32 un_thread_id, 00051 CSpaceMultiThreadBalanceLength* pc_space) : 00052 ThreadId(un_thread_id), 00053 Space(pc_space) {} 00054 }; 00055 00057 struct STaskData { 00059 size_t Index; 00061 bool Used; 00063 bool Done; 00064 00066 void Reset(); 00067 }; 00068 00070 pthread_t* m_ptThreads; 00071 00073 SThreadLaunchData** m_psThreadData; 00074 00076 STaskData m_sTaskData; 00077 00079 pthread_mutex_t m_tStartSenseControlPhaseMutex; 00081 pthread_mutex_t m_tStartActPhaseMutex; 00083 pthread_mutex_t m_tStartPhysicsPhaseMutex; 00085 pthread_mutex_t m_tFetchTaskMutex; 00086 00088 pthread_cond_t m_tStartSenseControlPhaseCond; 00090 pthread_cond_t m_tStartActPhaseCond; 00092 pthread_cond_t m_tStartPhysicsPhaseCond; 00094 pthread_cond_t m_tFetchTaskCond; 00095 00097 UInt32 m_unSenseControlPhaseIdleCounter; 00099 UInt32 m_unActPhaseIdleCounter; 00101 UInt32 m_unPhysicsPhaseIdleCounter; 00102 00103 }; 00104 00105 } 00106 00107 #endif