@@ -48,10 +48,7 @@ PathMappingList::PathMappingList(const PathMappingList &rhs)
48
48
49
49
const PathMappingList &PathMappingList::operator =(const PathMappingList &rhs) {
50
50
if (this != &rhs) {
51
- std::scoped_lock<std::mutex, std::mutex> callback_locks (
52
- m_callback_mutex, rhs.m_callback_mutex );
53
- std::scoped_lock<std::mutex, std::mutex> pairs_locks (m_pairs_mutex,
54
- rhs.m_pairs_mutex );
51
+ std::scoped_lock<std::recursive_mutex, std::recursive_mutex> locks (m_mutex, rhs.m_mutex );
55
52
m_pairs = rhs.m_pairs ;
56
53
m_callback = nullptr ;
57
54
m_callback_baton = nullptr ;
@@ -62,105 +59,85 @@ const PathMappingList &PathMappingList::operator=(const PathMappingList &rhs) {
62
59
63
60
PathMappingList::~PathMappingList () = default ;
64
61
65
- void PathMappingList::AppendImpl (llvm::StringRef path,
66
- llvm::StringRef replacement) {
62
+ void PathMappingList::Append (llvm::StringRef path, llvm::StringRef replacement,
63
+ bool notify) {
64
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
67
65
++m_mod_id;
68
66
m_pairs.emplace_back (pair (NormalizePath (path), NormalizePath (replacement)));
69
- }
70
-
71
- void PathMappingList::Notify (bool notify) const {
72
- std::lock_guard<std::mutex> lock (m_callback_mutex);
73
67
if (notify && m_callback)
74
68
m_callback (*this , m_callback_baton);
75
69
}
76
70
77
- void PathMappingList::Append (llvm::StringRef path, llvm::StringRef replacement,
78
- bool notify) {
79
- {
80
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
81
- AppendImpl (path, replacement);
82
- }
83
- Notify (notify);
84
- }
85
-
86
71
void PathMappingList::Append (const PathMappingList &rhs, bool notify) {
87
- {
88
- std::scoped_lock<std::mutex, std::mutex> locks (m_pairs_mutex,
89
- rhs.m_pairs_mutex );
90
- ++m_mod_id;
91
- if (rhs.m_pairs .empty ())
92
- return ;
72
+ std::scoped_lock<std::recursive_mutex, std::recursive_mutex> locks (m_mutex, rhs.m_mutex );
73
+ ++m_mod_id;
74
+ if (!rhs.m_pairs .empty ()) {
93
75
const_iterator pos, end = rhs.m_pairs .end ();
94
76
for (pos = rhs.m_pairs .begin (); pos != end; ++pos)
95
77
m_pairs.push_back (*pos);
78
+ if (notify && m_callback)
79
+ m_callback (*this , m_callback_baton);
96
80
}
97
- Notify (notify);
98
81
}
99
82
100
83
bool PathMappingList::AppendUnique (llvm::StringRef path,
101
84
llvm::StringRef replacement, bool notify) {
102
85
auto normalized_path = NormalizePath (path);
103
86
auto normalized_replacement = NormalizePath (replacement);
104
- {
105
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
106
- for (const auto &pair : m_pairs) {
107
- if (pair.first .GetStringRef () == normalized_path &&
108
- pair.second .GetStringRef () == normalized_replacement)
109
- return false ;
110
- }
111
- AppendImpl (path, replacement);
87
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
88
+ for (const auto &pair : m_pairs) {
89
+ if (pair.first .GetStringRef () == normalized_path &&
90
+ pair.second .GetStringRef () == normalized_replacement)
91
+ return false ;
112
92
}
113
- Notify ( notify);
93
+ Append (path, replacement, notify);
114
94
return true ;
115
95
}
116
96
117
97
void PathMappingList::Insert (llvm::StringRef path, llvm::StringRef replacement,
118
98
uint32_t index, bool notify) {
119
- {
120
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
121
- ++m_mod_id;
122
- iterator insert_iter;
123
- if (index >= m_pairs.size ())
124
- insert_iter = m_pairs.end ();
125
- else
126
- insert_iter = m_pairs.begin () + index ;
127
- m_pairs.emplace (insert_iter,
128
- pair (NormalizePath (path), NormalizePath (replacement)));
129
- }
130
- Notify (notify);
99
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
100
+ ++m_mod_id;
101
+ iterator insert_iter;
102
+ if (index >= m_pairs.size ())
103
+ insert_iter = m_pairs.end ();
104
+ else
105
+ insert_iter = m_pairs.begin () + index ;
106
+ m_pairs.emplace (insert_iter, pair (NormalizePath (path),
107
+ NormalizePath (replacement)));
108
+ if (notify && m_callback)
109
+ m_callback (*this , m_callback_baton);
131
110
}
132
111
133
112
bool PathMappingList::Replace (llvm::StringRef path, llvm::StringRef replacement,
134
113
uint32_t index, bool notify) {
135
- {
136
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
137
- if (index >= m_pairs.size ())
138
- return false ;
139
- ++m_mod_id;
140
- m_pairs[index ] = pair (NormalizePath (path), NormalizePath (replacement));
141
- }
142
- Notify (notify);
114
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
115
+ if (index >= m_pairs.size ())
116
+ return false ;
117
+ ++m_mod_id;
118
+ m_pairs[index ] = pair (NormalizePath (path), NormalizePath (replacement));
119
+ if (notify && m_callback)
120
+ m_callback (*this , m_callback_baton);
143
121
return true ;
144
122
}
145
123
146
124
bool PathMappingList::Remove (size_t index, bool notify) {
147
- {
148
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
149
- if (index >= m_pairs.size ())
150
- return false ;
125
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
126
+ if (index >= m_pairs.size ())
127
+ return false ;
151
128
152
- ++m_mod_id;
153
- iterator iter = m_pairs.begin () + index ;
154
- m_pairs.erase (iter);
155
- }
156
- Notify (notify );
129
+ ++m_mod_id;
130
+ iterator iter = m_pairs.begin () + index ;
131
+ m_pairs.erase (iter);
132
+ if (notify && m_callback)
133
+ m_callback (* this , m_callback_baton );
157
134
return true ;
158
135
}
159
136
160
137
// For clients which do not need the pair index dumped, pass a pair_index >= 0
161
138
// to only dump the indicated pair.
162
139
void PathMappingList::Dump (Stream *s, int pair_index) {
163
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
140
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
164
141
unsigned int numPairs = m_pairs.size ();
165
142
166
143
if (pair_index < 0 ) {
@@ -178,7 +155,7 @@ void PathMappingList::Dump(Stream *s, int pair_index) {
178
155
179
156
llvm::json::Value PathMappingList::ToJSON () {
180
157
llvm::json::Array entries;
181
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
158
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
182
159
for (const auto &pair : m_pairs) {
183
160
llvm::json::Array entry{pair.first .GetStringRef ().str (),
184
161
pair.second .GetStringRef ().str ()};
@@ -188,13 +165,12 @@ llvm::json::Value PathMappingList::ToJSON() {
188
165
}
189
166
190
167
void PathMappingList::Clear (bool notify) {
191
- {
192
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
193
- if (!m_pairs.empty ())
194
- ++m_mod_id;
195
- m_pairs.clear ();
196
- }
197
- Notify (notify);
168
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
169
+ if (!m_pairs.empty ())
170
+ ++m_mod_id;
171
+ m_pairs.clear ();
172
+ if (notify && m_callback)
173
+ m_callback (*this , m_callback_baton);
198
174
}
199
175
200
176
bool PathMappingList::RemapPath (ConstString path,
@@ -220,7 +196,7 @@ static void AppendPathComponents(FileSpec &path, llvm::StringRef components,
220
196
221
197
std::optional<FileSpec> PathMappingList::RemapPath (llvm::StringRef mapping_path,
222
198
bool only_if_exists) const {
223
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
199
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
224
200
if (m_pairs.empty () || mapping_path.empty ())
225
201
return {};
226
202
LazyBool path_is_relative = eLazyBoolCalculate;
@@ -259,7 +235,7 @@ std::optional<llvm::StringRef>
259
235
PathMappingList::ReverseRemapPath (const FileSpec &file, FileSpec &fixed) const {
260
236
std::string path = file.GetPath ();
261
237
llvm::StringRef path_ref (path);
262
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
238
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
263
239
for (const auto &it : m_pairs) {
264
240
llvm::StringRef removed_prefix = it.second .GetStringRef ();
265
241
if (!path_ref.consume_front (it.second .GetStringRef ()))
@@ -288,35 +264,34 @@ PathMappingList::FindFile(const FileSpec &orig_spec) const {
288
264
289
265
bool PathMappingList::Replace (llvm::StringRef path, llvm::StringRef new_path,
290
266
bool notify) {
291
- {
292
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
293
- uint32_t idx = FindIndexForPath (path);
294
- if (idx >= m_pairs.size ())
295
- return false ;
267
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
268
+ uint32_t idx = FindIndexForPath (path);
269
+ if (idx < m_pairs.size ()) {
296
270
++m_mod_id;
297
271
m_pairs[idx].second = ConstString (new_path);
272
+ if (notify && m_callback)
273
+ m_callback (*this , m_callback_baton);
274
+ return true ;
298
275
}
299
- Notify (notify);
300
- return true ;
276
+ return false ;
301
277
}
302
278
303
279
bool PathMappingList::Remove (ConstString path, bool notify) {
304
- {
305
- std::lock_guard<std::mutex> lock (m_pairs_mutex);
306
- iterator pos = FindIteratorForPath (path);
307
- if (pos == m_pairs.end ())
308
- return false ;
309
-
280
+ std::lock_guard<std::recursive_mutex> lock (m_mutex);
281
+ iterator pos = FindIteratorForPath (path);
282
+ if (pos != m_pairs.end ()) {
310
283
++m_mod_id;
311
284
m_pairs.erase (pos);
285
+ if (notify && m_callback)
286
+ m_callback (*this , m_callback_baton);
287
+ return true ;
312
288
}
313
- Notify (notify);
314
- return true ;
289
+ return false ;
315
290
}
316
291
317
292
PathMappingList::const_iterator
318
293
PathMappingList::FindIteratorForPath (ConstString path) const {
319
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
294
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
320
295
const_iterator pos;
321
296
const_iterator begin = m_pairs.begin ();
322
297
const_iterator end = m_pairs.end ();
@@ -330,7 +305,7 @@ PathMappingList::FindIteratorForPath(ConstString path) const {
330
305
331
306
PathMappingList::iterator
332
307
PathMappingList::FindIteratorForPath (ConstString path) {
333
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
308
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
334
309
iterator pos;
335
310
iterator begin = m_pairs.begin ();
336
311
iterator end = m_pairs.end ();
@@ -344,7 +319,7 @@ PathMappingList::FindIteratorForPath(ConstString path) {
344
319
345
320
bool PathMappingList::GetPathsAtIndex (uint32_t idx, ConstString &path,
346
321
ConstString &new_path) const {
347
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
322
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
348
323
if (idx < m_pairs.size ()) {
349
324
path = m_pairs[idx].first ;
350
325
new_path = m_pairs[idx].second ;
@@ -355,7 +330,7 @@ bool PathMappingList::GetPathsAtIndex(uint32_t idx, ConstString &path,
355
330
356
331
uint32_t PathMappingList::FindIndexForPath (llvm::StringRef orig_path) const {
357
332
const ConstString path = ConstString (NormalizePath (orig_path));
358
- std::lock_guard<std::mutex > lock (m_pairs_mutex );
333
+ std::lock_guard<std::recursive_mutex > lock (m_mutex );
359
334
const_iterator pos;
360
335
const_iterator begin = m_pairs.begin ();
361
336
const_iterator end = m_pairs.end ();
0 commit comments