Go to the documentation of this file. 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__)