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