Go to the documentation of this file. 40 #ifndef __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__ 41 #define __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__ 47 #include <system_error> 56 #define _THREADGROUPID(_id) _M_##_id##_ThreadGroup 57 #define _THREADID(_id) _M_##_id##_Thread 64 #define _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(id,unitsclass,funcptr,...) \ 65 openfluid::core::UnitsList_t* _UNITSLISTID(id) = mp_SpatialData->spatialUnits(unitsclass)->list(); \ 66 if (_UNITSLISTID(id) != nullptr) \ 68 openfluid::core::UnitsList_t::iterator _UNITSLISTITERID(id) = _UNITSLISTID(id)->begin(); \ 69 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \ 71 openfluid::core::PcsOrd_t _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \ 72 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \ 74 std::vector<std::thread> _THREADGROUPID(id); \ 75 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end() && \ 76 _UNITSLISTITERID(id)->getProcessOrder() == _PCSORDID(id)) \ 80 _THREADGROUPID(id).push_back(std::thread(std::bind(&funcptr,this,\ 81 &(*_UNITSLISTITERID(id)),## __VA_ARGS__))); \ 82 if (_THREADGROUPID(id).size() == (unsigned int)OPENFLUID_GetSimulatorMaxThreads()) \ 84 for (auto& _THREADID(id) : _THREADGROUPID(id)) \ 85 _THREADID(id).join(); \ 86 _THREADGROUPID(id).clear(); \ 89 catch (std::system_error& E) \ 91 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \ 92 "Error in threaded loop (" + std::string(E.what()) +")"); \ 94 ++_UNITSLISTITERID(id); \ 96 for (auto& _THREADID(id) : _THREADGROUPID(id)) \ 97 _THREADID(id).join(); \ 98 _THREADGROUPID(id).clear(); \ 99 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \ 100 _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \ 111 #define APPLY_UNITS_ORDERED_LOOP_THREADED(unitsclass,funcptr,...) \ 112 _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,unitsclass,funcptr,## __VA_ARGS__) 119 #define _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(id,funcptr,...) \ 120 openfluid::core::UnitsPtrList_t* _UNITSPTRLISTID(id) = mp_SpatialData->allSpatialUnits(); \ 121 if (_UNITSPTRLISTID(id) != nullptr) \ 123 openfluid::core::UnitsPtrList_t::iterator _UNITSPTRLISTITERID(id) = _UNITSPTRLISTID(id)->begin(); \ 124 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \ 126 openfluid::core::PcsOrd_t _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \ 127 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \ 129 std::vector<std::thread> _THREADGROUPID(id); \ 130 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end() && \ 131 (*_UNITSPTRLISTITERID(id))->getProcessOrder() == _PCSORDID(id)) \ 135 _THREADGROUPID(id).push_back(std::thread(std::bind(&funcptr,this,\ 136 (*_UNITSPTRLISTITERID(id)),## __VA_ARGS__))); \ 137 if (_THREADGROUPID(id).size() == (unsigned int)OPENFLUID_GetSimulatorMaxThreads()) \ 139 for (auto& _THREADID(id) : _THREADGROUPID(id)) \ 140 _THREADID(id).join(); \ 141 _THREADGROUPID(id).clear(); \ 144 catch (std::system_error& E) \ 146 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \ 147 "Error in threaded loop (" + std::string(E.what()) +")"); \ 149 ++_UNITSPTRLISTITERID(id); \ 151 for (auto& _THREADID(id) : _THREADGROUPID(id)) \ 152 _THREADID(id).join(); \ 153 _THREADGROUPID(id).clear(); \ 154 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end())\ 155 _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \ 165 #define APPLY_ALLUNITS_ORDERED_LOOP_THREADED(funcptr,...) \ 166 _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,funcptr,## __VA_ARGS__)