Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <charm++.h>
7 : #include <memory>
8 :
9 : #include "Parallel/Spinlock.hpp"
10 :
11 : /// \cond
12 : namespace PUP {
13 : class er;
14 : } // namespace PUP
15 : /// \endcond
16 :
17 : namespace Parallel {
18 :
19 : /*!
20 : * \ingroup ParallelGroup
21 : * \brief A typesafe wrapper for a lock for synchronization of shared resources
22 : * on a given node, with safe creation, destruction, and serialization.
23 : *
24 : * \note If a locked NodeLock is serialized, it is deserialized as unlocked.
25 : */
26 1 : class NodeLock {
27 : public:
28 0 : NodeLock();
29 :
30 0 : explicit NodeLock(CkMigrateMessage* /*message*/);
31 :
32 0 : NodeLock(const NodeLock&) = delete;
33 0 : NodeLock& operator=(const NodeLock&) = delete;
34 0 : NodeLock(NodeLock&& moved_lock) noexcept;
35 0 : NodeLock& operator=(NodeLock&& moved_lock) noexcept;
36 0 : ~NodeLock();
37 :
38 0 : void lock();
39 :
40 0 : bool try_lock();
41 :
42 0 : void unlock();
43 :
44 0 : void destroy();
45 :
46 0 : bool is_destroyed() { return nullptr == lock_; }
47 :
48 : // NOLINTNEXTLINE(google-runtime-references)
49 0 : void pup(PUP::er& p);
50 :
51 : private:
52 0 : std::unique_ptr<Spinlock> lock_;
53 : };
54 : } // namespace Parallel
|