proxygen
Core.h
Go to the documentation of this file.
1 /*
2  * Copyright 2016-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include <folly/Function.h>
19 #include <folly/Synchronized.h>
20 #include <folly/futures/Future.h>
21 
22 #include <atomic>
23 #include <memory>
24 #include <mutex>
25 #include <unordered_set>
26 #include <utility>
27 #include <vector>
28 
29 namespace folly {
30 namespace observer_detail {
31 
32 class ObserverManager;
33 
38 class Core : public std::enable_shared_from_this<Core> {
39  public:
40  using Ptr = std::shared_ptr<Core>;
41  using WeakPtr = std::weak_ptr<Core>;
42 
46  static Ptr create(folly::Function<std::shared_ptr<const void>()> creator);
47 
51  struct VersionedData {
53 
54  VersionedData(std::shared_ptr<const void> data_, size_t version_)
55  : data(std::move(data_)), version(version_) {}
56 
57  std::shared_ptr<const void> data;
58  size_t version{0};
59  };
60 
67 
71  size_t getVersion() const {
72  return version_;
73  }
74 
79  return versionLastChange_;
80  }
81 
89  size_t refresh(size_t version, bool force = false);
90 
91  ~Core();
92 
93  private:
94  explicit Core(folly::Function<std::shared_ptr<const void>()> creator);
95 
96  void addDependent(Core::WeakPtr dependent);
97  void removeStaleDependents();
98 
99  using Dependents = std::vector<WeakPtr>;
100  using Dependencies = std::unordered_set<Ptr>;
101 
104 
105  std::atomic<size_t> version_{0};
106  std::atomic<size_t> versionLastChange_{0};
107 
109 
111 
113 };
114 } // namespace observer_detail
115 } // namespace folly
size_t getVersion() const
Definition: Core.h:71
std::mutex refreshMutex_
Definition: Core.h:112
Core(folly::Function< std::shared_ptr< const void >()> creator)
Definition: Core.cpp:147
size_t getVersionLastChange()
Definition: Core.h:78
VersionedData getData()
Definition: Core.cpp:25
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::atomic< size_t > versionLastChange_
Definition: Core.h:106
STL namespace.
VersionedData(std::shared_ptr< const void > data_, size_t version_)
Definition: Core.h:54
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
folly::Synchronized< Dependents > dependents_
Definition: Core.h:102
std::shared_ptr< const void > data
Definition: Core.h:57
folly::Synchronized< Dependencies > dependencies_
Definition: Core.h:103
std::shared_ptr< Core > Ptr
Definition: Core.h:40
std::unordered_set< Ptr > Dependencies
Definition: Core.h:100
size_t refresh(size_t version, bool force=false)
Definition: Core.cpp:44
void addDependent(Core::WeakPtr dependent)
Definition: Core.cpp:163
folly::Function< std::shared_ptr< const void >)> creator_
Definition: Core.h:110
folly::Synchronized< VersionedData > data_
Definition: Core.h:108
std::weak_ptr< Core > WeakPtr
Definition: Core.h:41
std::mutex mutex
std::vector< WeakPtr > Dependents
Definition: Core.h:99
std::atomic< size_t > version_
Definition: Core.h:105
static Ptr create(folly::Function< std::shared_ptr< const void >()> creator)
Definition: Core.cpp:158