mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-04 08:27:50 +00:00
[libc++][lit] Atomically update the persistent cache (#66538)
When running multiple shards in parallel, one shard might write to the cache while another one is reading this cache. Instead of updating the file in place, write to a temporary file and swap the cache file using os.replace(). This is an atomic operation and means shards will either see the old state or the new one.
This commit is contained in:
parent
6a45339bac
commit
14882d6b74
@ -69,8 +69,14 @@ def _memoizeExpensiveOperation(extractCacheKey):
|
||||
if cacheKey not in cache:
|
||||
cache[cacheKey] = function(config, *args, **kwargs)
|
||||
# Update the persistent cache so it knows about the new key
|
||||
with open(persistentCache, "wb") as cacheFile:
|
||||
# We write to a PID-suffixed file and rename the result to
|
||||
# ensure that the cache is not corrupted when running the test
|
||||
# suite with multiple shards. Since this file is in the same
|
||||
# directory as the destination, os.replace() will be atomic.
|
||||
unique_suffix = ".tmp." + str(os.getpid())
|
||||
with open(persistentCache + unique_suffix, "wb") as cacheFile:
|
||||
pickle.dump(cache, cacheFile)
|
||||
os.replace(persistentCache + unique_suffix, persistentCache)
|
||||
return cache[cacheKey]
|
||||
|
||||
return f
|
||||
|
Loading…
x
Reference in New Issue
Block a user