Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <mutex> 7 : 8 : #include "DataStructures/DataBox/DataBox.hpp" 9 : #include "Parallel/NodeLock.hpp" 10 : #include "Utilities/ErrorHandling/Error.hpp" 11 : #include "Utilities/Gsl.hpp" 12 : #include "Utilities/PrettyType.hpp" 13 : #include "Utilities/TMPL.hpp" 14 : 15 0 : namespace observers::Actions { 16 : 17 : /// Local synchronous action for retrieving a pointer to the `NodeLock` with tag 18 : /// `LockTag` on the component. 19 : /// 20 : /// \warning The retrieved pointer to a lock must only be treated as 'good' 21 : /// during the execution of the action from which this synchronous action is 22 : /// called. This is because we can only trust that charm will not migrate the 23 : /// component on which the action is running until after the action has 24 : /// completed, and it will not migrate the Nodegroup to which the lock points 25 : /// until a checkpoint. 26 : template <typename LockTag> 27 1 : struct GetLockPointer { 28 0 : using return_type = Parallel::NodeLock*; 29 : 30 : template <typename ParallelComponent, typename DbTagList> 31 0 : static return_type apply(db::DataBox<DbTagList>& box, 32 : const gsl::not_null<Parallel::NodeLock*> node_lock) { 33 : Parallel::NodeLock* result_lock; 34 : const std::lock_guard hold_lock(*node_lock); 35 : db::mutate<LockTag>( 36 : [&result_lock](const gsl::not_null<Parallel::NodeLock*> lock) { 37 : result_lock = lock; 38 : }, 39 : make_not_null(&box)); 40 : return result_lock; 41 : } 42 : }; 43 : } // namespace observers::Actions