use_file: replace mutex with nanosleep
-based loop
#478
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replaces
libc::pthread_mutex_t
withlibc::nanosleep
-based wait loop with bounded exponential backoff. This approach is similar to what we use in the VxWorks backend.This eliminates the problematic dependency on pthread mutex, reduces amount of
unsafe
and makes code slightly more straightforward. It also resolves concerns about atomic ordering from #469 without hurting the optimistic path.The main disadvantage of this approach is somewhat higher latency in pathological cases (e.g. spawning thousands of threads which simultaneously call
getrandom
). This especially could be noticeable on Linux booted without sufficient entropy, i.e. when program spends a significant amount of time inwait_until_rng_ready
. But such cases should be extremely rare in practice.On Linux we could use the
futex
syscall to implement a simple quasi-mutex based on theFD
atomic.