Make the datapoint storage cache safe for concurrent use #417
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.
Fixes #405
This adds one RW lock for each cache. For GetFoo() functions, it takes a RLock, and for SetFoo() functions, it takes a write Lock. However, since the "used" bool is set in GetFoo() functions (it indicates if the item has been touched since the last GC), this still produced a data race. I could have switched to a full write-lock for Get functions, but thought it would be more performant to use a concurrency-safe bool. That also simplifies the implementation of GC using Compare and swap.
I added tests for concurrency to verify that there are no data races.