Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Swap and CompareAndSwap for Value wrappers #130

Merged
merged 3 commits into from
Feb 6, 2023

Commits on Feb 6, 2023

  1. Configuration menu
    Copy the full SHA
    215c976 View commit details
    Browse the repository at this point in the history
  2. Test behaviour of default values initialized in different ways

    This adds repro tests for #126 and #129
    prashantv committed Feb 6, 2023
    Configuration menu
    Copy the full SHA
    1cd118a View commit details
    Browse the repository at this point in the history
  3. Fix Swap and CompareAndSwap for Value wrappers

    Fixes #126, #129
    
    All atomic types can be used without initialization, e.g., `var v
    <AtomicType>`. This works fine for integer types as the initialized
    value of 0 matches the default value for the user-facing type.  However,
    for Value wrappers, they are initialized to `nil`, which is a value that
    can't be set (triggers a panic) so the default value for the user-facing
    type is forced to be stored as a different value. This leads to multiple
    possible values representing the default user-facing type.
    
    E.g., an `atomic.String` with value `""` may be represented by the
    underlying atomic as either `nil`, or `""`. This causes issues when we
    don't handle the `nil` value correctly, causing to panics in `Swap` and
    incorrectly not swapping values in `CompareAndSwap`.
    
    This change fixes the above issues by:
     * Requiring `pack` and `unpack` function in gen-atomicwrapper as the
       only place we weren't supplying them was for `String`, and the
       branching adds unnecessary complexity, especially with added `nil`
       handling.
     * Extending `CompareAndSwap` for `Value` wrappers to try an additional
       `CompareAndSwap(nil, <new>)` only if the original `CompareAndSwap`
       fails and the old value is the zero value.
    prashantv committed Feb 6, 2023
    Configuration menu
    Copy the full SHA
    ec1ed35 View commit details
    Browse the repository at this point in the history