NIOConcurrencyHelpers: make LLP64 friendly (#1402)

On LLP64 platforms, `Int` is mapped to `intptr_t` and `UInt` is mapped
to `uintptr_t`.  Use the newly minted `CNIOAtomics` operations to
support these semantics.

Co-authored-by: Cory Benfield <lukasa@apple.com>
Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
This commit is contained in:
Saleem Abdulrasool 2020-02-19 11:05:58 -08:00 committed by GitHub
parent 0db1cd5318
commit 2c555d144a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 0 deletions

View File

@ -129,6 +129,29 @@ extension UInt64: NIOAtomicPrimitive {
public static let nio_atomic_store = catmc_nio_atomic_unsigned_long_long_store
}
#if os(Windows)
extension Int: NIOAtomicPrimitive {
public typealias AtomicWrapper = catmc_nio_atomic_intptr_t
public static let nio_atomic_create_with_existing_storage = catmc_nio_atomic_intptr_t_create_with_existing_storage
public static let nio_atomic_compare_and_exchange = catmc_nio_atomic_intptr_t_compare_and_exchange
public static let nio_atomic_add = catmc_nio_atomic_intptr_t_add
public static let nio_atomic_sub = catmc_nio_atomic_intptr_t_sub
public static let nio_atomic_exchange = catmc_nio_atomic_intptr_t_exchange
public static let nio_atomic_load = catmc_nio_atomic_intptr_t_load
public static let nio_atomic_store = catmc_nio_atomic_intptr_t_store
}
extension UInt: NIOAtomicPrimitive {
public typealias AtomicWrapper = catmc_nio_atomic_uintptr_t
public static let nio_atomic_create_with_existing_storage = catmc_nio_atomic_uintptr_t_create_with_existing_storage
public static let nio_atomic_compare_and_exchange = catmc_nio_atomic_uintptr_t_compare_and_exchange
public static let nio_atomic_add = catmc_nio_atomic_uintptr_t_add
public static let nio_atomic_sub = catmc_nio_atomic_uintptr_t_sub
public static let nio_atomic_exchange = catmc_nio_atomic_uintptr_t_exchange
public static let nio_atomic_load = catmc_nio_atomic_uintptr_t_load
public static let nio_atomic_store = catmc_nio_atomic_uintptr_t_store
}
#else
extension Int: NIOAtomicPrimitive {
public typealias AtomicWrapper = catmc_nio_atomic_long
public static let nio_atomic_create_with_existing_storage = catmc_nio_atomic_long_create_with_existing_storage
@ -150,6 +173,7 @@ extension UInt: NIOAtomicPrimitive {
public static let nio_atomic_load = catmc_nio_atomic_unsigned_long_load
public static let nio_atomic_store = catmc_nio_atomic_unsigned_long_store
}
#endif
/// An encapsulation of an atomic primitive object.
///

View File

@ -379,6 +379,29 @@ extension UInt64: AtomicPrimitive {
public static let atomic_store = catmc_atomic_unsigned_long_long_store
}
#if os(Windows)
extension Int: AtomicPrimitive {
public static let atomic_create = catmc_atomic_intptr_t_create
public static let atomic_destroy = catmc_atomic_intptr_t_destroy
public static let atomic_compare_and_exchange = catmc_atomic_intptr_t_compare_and_exchange
public static let atomic_add = catmc_atomic_intptr_t_add
public static let atomic_sub = catmc_atomic_intptr_t_sub
public static let atomic_exchange = catmc_atomic_intptr_t_exchange
public static let atomic_load = catmc_atomic_intptr_t_load
public static let atomic_store = catmc_atomic_intptr_t_store
}
extension UInt: AtomicPrimitive {
public static let atomic_create = catmc_atomic_uintptr_t_create
public static let atomic_destroy = catmc_atomic_uintptr_t_destroy
public static let atomic_compare_and_exchange = catmc_atomic_uintptr_t_compare_and_exchange
public static let atomic_add = catmc_atomic_uintptr_t_add
public static let atomic_sub = catmc_atomic_uintptr_t_sub
public static let atomic_exchange = catmc_atomic_uintptr_t_exchange
public static let atomic_load = catmc_atomic_uintptr_t_load
public static let atomic_store = catmc_atomic_uintptr_t_store
}
#else
extension Int: AtomicPrimitive {
public static let atomic_create = catmc_atomic_long_create
public static let atomic_destroy = catmc_atomic_long_destroy
@ -400,6 +423,7 @@ extension UInt: AtomicPrimitive {
public static let atomic_load = catmc_atomic_unsigned_long_load
public static let atomic_store = catmc_atomic_unsigned_long_store
}
#endif
/// `AtomicBox` is a heap-allocated box which allows lock-free access to an instance of a Swift class.
///