49 #ifndef __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__
50 #define __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__
56 #include <system_error>
65 #define _THREADGROUPID(_id) _M_##_id##_ThreadGroup
66 #define _THREADID(_id) _M_##_id##_Thread
73 #define _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(id,unitsclass,funcptr,...) \
74 openfluid::core::UnitsList_t* _UNITSLISTID(id) = mp_SpatialData->spatialUnits(unitsclass)->list(); \
75 if (_UNITSLISTID(id) != nullptr) \
77 openfluid::core::UnitsList_t::iterator _UNITSLISTITERID(id) = _UNITSLISTID(id)->begin(); \
78 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \
80 openfluid::core::PcsOrd_t _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \
81 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \
83 std::vector<std::thread> _THREADGROUPID(id); \
84 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end() && \
85 _UNITSLISTITERID(id)->getProcessOrder() == _PCSORDID(id)) \
89 _THREADGROUPID(id).push_back(std::thread(std::bind(&funcptr,this,\
90 &(*_UNITSLISTITERID(id)),## __VA_ARGS__))); \
91 if (_THREADGROUPID(id).size() == (unsigned int)OPENFLUID_GetSimulatorMaxThreads()) \
93 for (auto& _THREADID(id) : _THREADGROUPID(id)) \
94 _THREADID(id).join(); \
95 _THREADGROUPID(id).clear(); \
98 catch (std::system_error& E) \
100 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \
101 "Error in threaded loop (" + std::string(E.what()) +")"); \
103 ++_UNITSLISTITERID(id); \
105 for (auto& _THREADID(id) : _THREADGROUPID(id)) \
106 _THREADID(id).join(); \
107 _THREADGROUPID(id).clear(); \
108 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \
109 _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \
129 #define APPLY_UNITS_ORDERED_LOOP_THREADED(unitsclass,funcptr,...) \
130 _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,unitsclass,funcptr,## __VA_ARGS__)
137 #define _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(id,funcptr,...) \
138 openfluid::core::UnitsPtrList_t* _UNITSPTRLISTID(id) = mp_SpatialData->allSpatialUnits(); \
139 if (_UNITSPTRLISTID(id) != nullptr) \
141 openfluid::core::UnitsPtrList_t::iterator _UNITSPTRLISTITERID(id) = _UNITSPTRLISTID(id)->begin(); \
142 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \
144 openfluid::core::PcsOrd_t _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \
145 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \
147 std::vector<std::thread> _THREADGROUPID(id); \
148 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end() && \
149 (*_UNITSPTRLISTITERID(id))->getProcessOrder() == _PCSORDID(id)) \
153 _THREADGROUPID(id).push_back(std::thread(std::bind(&funcptr,this,\
154 (*_UNITSPTRLISTITERID(id)),## __VA_ARGS__))); \
155 if (_THREADGROUPID(id).size() == (unsigned int)OPENFLUID_GetSimulatorMaxThreads()) \
157 for (auto& _THREADID(id) : _THREADGROUPID(id)) \
158 _THREADID(id).join(); \
159 _THREADGROUPID(id).clear(); \
162 catch (std::system_error& E) \
164 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \
165 "Error in threaded loop (" + std::string(E.what()) +")"); \
167 ++_UNITSPTRLISTITERID(id); \
169 for (auto& _THREADID(id) : _THREADGROUPID(id)) \
170 _THREADID(id).join(); \
171 _THREADGROUPID(id).clear(); \
172 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end())\
173 _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \
192 #define APPLY_ALLUNITS_ORDERED_LOOP_THREADED(funcptr,...) \
193 _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,funcptr,## __VA_ARGS__)