Use Thread.threadDictionary instead of TaskLocal for thread-local #395
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.
Motivation
We were using a
@TaskLocal static varto hold theFiniteFieldArithmeticContext(FFAC) on each of the curve types. The intention here was this would operate as a thread-local value, since task-locals behave like thread locals when the caller is not part of a task context. However, they still require binding, (i.e. the use of e.g.P256.$__ffac.withValue { ... }1, otherwise they just return the default value, which is globally shared. We were not doing that, nor do we have a sensible place where we could.This causes crashes when using these values in a multithreaded environment since the same value will be used across threads.
Modifications
Result
Fixes crash when using ECToolbox-based APIs in multithreaded code.
Footnotes
https://developer.apple.com/documentation/swift/tasklocal#Using-task-local-values-outside-of-tasks ↩