Fix a multithreading bug related to storing objects in the cache (#495)
parent
83bd474eda
commit
6762e8480c
|
@ -1,5 +1,6 @@
|
||||||
Development version (next version)
|
Development version (next version)
|
||||||
- Fix pointer error in pyclblast on ARM
|
- Fix pointer error in pyclblast on ARM
|
||||||
|
- Fix a multithreading bug related to storing objects in the cache
|
||||||
- Added tuned parameters for many devices (see doc/tuning.md)
|
- Added tuned parameters for many devices (see doc/tuning.md)
|
||||||
|
|
||||||
Version 1.6.0
|
Version 1.6.0
|
||||||
|
|
|
@ -56,7 +56,12 @@ void Cache<Key, Value>::Store(Key &&key, Value &&value) {
|
||||||
// emplace() into a map
|
// emplace() into a map
|
||||||
auto r = cache_.emplace(std::move(key), std::move(value));
|
auto r = cache_.emplace(std::move(key), std::move(value));
|
||||||
if (!r.second) {
|
if (!r.second) {
|
||||||
throw LogicError("Cache::Store: object already in cache");
|
// The object is already in cache. This can happen if two threads both
|
||||||
|
// checked the cache for an object, both found that it isn't there, then
|
||||||
|
// both produced the object (e.g. a compiled binary) and try to store it
|
||||||
|
// in the cache. The first one will succeed normally, the second one will
|
||||||
|
// hit this point. We simply return in this case.
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
// emplace_back() into a vector
|
// emplace_back() into a vector
|
||||||
|
|
Loading…
Reference in New Issue