@@ -35,7 +35,6 @@ template <typename ObjectType> struct PerThread {
3535 PerThread &operator =(const PerThread &) = delete ;
3636 PerThread &operator =(PerThread &&) = delete ;
3737 ~PerThread () {
38- std::lock_guard<std::mutex> Lock (Mutex);
3938 ThreadDataList.clear ();
4039 }
4140
@@ -63,7 +62,6 @@ template <typename ObjectType> struct PerThread {
6362 ObjectType &get () { return getThreadEntry (); }
6463
6564 template <class F > void clear (F f) {
66- std::lock_guard<std::mutex> Lock (Mutex);
6765 for (auto ThData : ThreadDataList) {
6866 if (!ThData->ThEntry )
6967 continue ;
@@ -107,10 +105,10 @@ template <typename ContainerType, typename ObjectType> struct PerThreadTable {
107105
108106 struct PerThreadData {
109107 size_t NElements = 0 ;
110- std::unique_ptr<ContainerType> ThEntry ;
108+ std::unique_ptr<ContainerType> ThreadEntry ;
111109 };
112110
113- std::mutex Mtx ;
111+ std::mutex Mutex ;
114112 std::list<std::shared_ptr<PerThreadData>> ThreadDataList;
115113
116114 // define default constructors, disable copy and move constructors
@@ -120,33 +118,32 @@ template <typename ContainerType, typename ObjectType> struct PerThreadTable {
120118 PerThreadTable &operator =(const PerThreadTable &) = delete ;
121119 PerThreadTable &operator =(PerThreadTable &&) = delete ;
122120 ~PerThreadTable () {
123- std::lock_guard<std::mutex> Lock (Mtx);
124121 ThreadDataList.clear ();
125122 }
126123
127124private:
128125 PerThreadData &getThreadData () {
129- static thread_local std::shared_ptr<PerThreadData> ThData = nullptr ;
130- if (!ThData ) {
131- ThData = std::make_shared<PerThreadData>();
132- std::lock_guard<std::mutex> Lock (Mtx );
133- ThreadDataList.push_back (ThData );
126+ static thread_local std::shared_ptr<PerThreadData> ThreadData = nullptr ;
127+ if (!ThreadData ) {
128+ ThreadData = std::make_shared<PerThreadData>();
129+ std::lock_guard<std::mutex> Lock (Mutex );
130+ ThreadDataList.push_back (ThreadData );
134131 }
135- return *ThData ;
132+ return *ThreadData ;
136133 }
137134
138135protected:
139136 ContainerType &getThreadEntry () {
140- auto &ThData = getThreadData ();
141- if (ThData. ThEntry )
142- return *ThData. ThEntry ;
143- ThData. ThEntry = std::make_unique<ContainerType>();
144- return *ThData. ThEntry ;
137+ auto &ThreadData = getThreadData ();
138+ if (ThreadData. ThreadEntry )
139+ return *ThreadData. ThreadEntry ;
140+ ThreadData. ThreadEntry = std::make_unique<ContainerType>();
141+ return *ThreadData. ThreadEntry ;
145142 }
146143
147144 size_t &getThreadNElements () {
148- auto &ThData = getThreadData ();
149- return ThData .NElements ;
145+ auto &ThreadData = getThreadData ();
146+ return ThreadData .NElements ;
150147 }
151148
152149 void setNElements (size_t Size) {
@@ -183,36 +180,35 @@ template <typename ContainerType, typename ObjectType> struct PerThreadTable {
183180 }
184181
185182 template <class F > void clear (F f) {
186- std::lock_guard<std::mutex> Lock (Mtx );
187- for (auto ThData : ThreadDataList) {
188- if (!ThData-> ThEntry || ThData ->NElements == 0 )
183+ std::lock_guard<std::mutex> Lock (Mutex );
184+ for (auto ThreadData : ThreadDataList) {
185+ if (!ThreadData-> ThreadEntry || ThreadData ->NElements == 0 )
189186 continue ;
190187 if constexpr (has_clearAll<ContainerType>::value) {
191- ThData-> ThEntry ->clearAll (f);
188+ ThreadData-> ThreadEntry ->clearAll (f);
192189 } else if constexpr (has_iterator<ContainerType>::value &&
193190 has_clear<ContainerType>::value) {
194- for (auto &Obj : *ThData-> ThEntry ) {
191+ for (auto &Obj : *ThreadData-> ThreadEntry ) {
195192 if constexpr (is_associative<ContainerType>::value) {
196193 f (Obj.second );
197194 } else {
198195 f (Obj);
199196 }
200197 }
201- ThData-> ThEntry ->clear ();
198+ ThreadData-> ThreadEntry ->clear ();
202199 } else {
203200 static_assert (true , " Container type not supported" );
204201 }
205- ThData ->NElements = 0 ;
202+ ThreadData ->NElements = 0 ;
206203 }
207204 ThreadDataList.clear ();
208205 }
209206
210207 template <class F > llvm::Error deinit (F f) {
211- std::lock_guard<std::mutex> Lock (Mtx);
212- for (auto ThData : ThreadDataList) {
213- if (!ThData->ThEntry || ThData->NElements == 0 )
208+ for (auto ThreadData : ThreadDataList) {
209+ if (!ThreadData->ThreadEntry || ThreadData->NElements == 0 )
214210 continue ;
215- for (auto &Obj : *ThData-> ThEntry ) {
211+ for (auto &Obj : *ThreadData-> ThreadEntry ) {
216212 if constexpr (is_associative<ContainerType>::value) {
217213 if (auto Err = f (Obj.second ))
218214 return Err;
0 commit comments