diff --git a/gtsam/inference/ClusterTree-inst.h b/gtsam/inference/ClusterTree-inst.h index b042c0c8e3..9bc1419558 100644 --- a/gtsam/inference/ClusterTree-inst.h +++ b/gtsam/inference/ClusterTree-inst.h @@ -15,6 +15,10 @@ #include #include +#ifdef GTSAM_USE_TBB +#include +#endif + namespace gtsam { /* ************************************************************************* */ @@ -120,12 +124,25 @@ struct EliminationData { size_t myIndexInParent; FastVector childFactors; boost::shared_ptr bayesTreeNode; +#ifdef GTSAM_USE_TBB + boost::shared_ptr writeLock; +#endif EliminationData(EliminationData* _parentData, size_t nChildren) : - parentData(_parentData), bayesTreeNode(boost::make_shared()) { + parentData(_parentData), bayesTreeNode(boost::make_shared()) +#ifdef GTSAM_USE_TBB + , writeLock(boost::make_shared()) +#endif + { if (parentData) { +#ifdef GTSAM_USE_TBB + parentData->writeLock->lock(); +#endif myIndexInParent = parentData->childFactors.size(); parentData->childFactors.push_back(sharedFactor()); +#ifdef GTSAM_USE_TBB + parentData->writeLock->unlock(); +#endif } else { myIndexInParent = 0; } @@ -196,8 +213,15 @@ struct EliminationData { nodesIndex_.insert(std::make_pair(j, myData.bayesTreeNode)); // Store remaining factor in parent's gathered factors - if (!eliminationResult.second->empty()) + if (!eliminationResult.second->empty()) { +#ifdef GTSAM_USE_TBB + myData.parentData->writeLock->lock(); +#endif myData.parentData->childFactors[myData.myIndexInParent] = eliminationResult.second; +#ifdef GTSAM_USE_TBB + myData.parentData->writeLock->unlock(); +#endif + } } }; };