• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #ifndef BASE_EVENTHANDLER_FRAMEWORKS_EVENTHANDLER_INCLUDE_THREAD_LOCAL_DATA_H
17  #define BASE_EVENTHANDLER_FRAMEWORKS_EVENTHANDLER_INCLUDE_THREAD_LOCAL_DATA_H
18  
19  #include <mutex>
20  #include <thread>
21  #include <unordered_map>
22  
23  #include "nocopyable.h"
24  
25  namespace OHOS {
26  namespace AppExecFwk {
27  /*
28   * Tool class, used to save thread local data.
29   */
30  template<typename T>
31  class ThreadLocalData {
32  public:
33      ThreadLocalData() = default;
34      ~ThreadLocalData() = default;
35      DISALLOW_COPY_AND_MOVE(ThreadLocalData);
36  
37      /*
38       * Override type conversion method.
39       */
T()40      inline operator T() const
41      {
42          return Current();
43      }
44  
45      /*
46       * Override operator equal to save data.
47       */
48      inline const ThreadLocalData<T> &operator=(const T &data)
49      {
50          Save(data);
51          return *this;
52      }
53  
54      /*
55       * Override operator equal to nullptr, which can used to discard the saved data.
56       */
57      inline const ThreadLocalData<T> &operator=(std::nullptr_t)
58      {
59          Discard();
60          return *this;
61      }
62  
63  private:
Current()64      inline T Current() const
65      {
66          std::lock_guard<std::mutex> lock(mapLock_);
67          auto it = dataMap_.find(std::this_thread::get_id());
68          if (it == dataMap_.end()) {
69              return T();
70          } else {
71              return it->second;
72          }
73      }
74  
Save(const T & data)75      inline void Save(const T &data)
76      {
77          std::lock_guard<std::mutex> lock(mapLock_);
78          dataMap_[std::this_thread::get_id()] = data;
79      }
80  
Discard()81      inline void Discard()
82      {
83          std::lock_guard<std::mutex> lock(mapLock_);
84          (void)dataMap_.erase(std::this_thread::get_id());
85      }
86  
87      mutable std::mutex mapLock_;
88      std::unordered_map<std::thread::id, T> dataMap_;
89  };
90  }  // namespace AppExecFwk
91  }  // namespace OHOS
92  
93  #endif  // #ifndef BASE_EVENTHANDLER_FRAMEWORKS_EVENTHANDLER_INCLUDE_THREAD_LOCAL_DATA_H
94