* Regenerate code to update copyright end year to 2023 * Test behaviour of default values initialized in different ways This adds repro tests for #126 and #129 * 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.
2.3 KiB
2.3 KiB