Skip to content

[stdlib] tee _stdlib_AtomicInt > SwiftPrivate #21337

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

Merged
merged 2 commits into from
Dec 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion stdlib/private/StdlibUnittest/RaceTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ class _RaceTestSharedState<RT : RaceTestWithPerTrialData> {
var stopNow = _stdlib_AtomicInt(0)

var trialBarrier: _stdlib_Barrier
var trialSpinBarrier: _stdlib_AtomicInt = _stdlib_AtomicInt()
var trialSpinBarrier = _stdlib_AtomicInt()

var raceData: [RT.RaceData] = []
var workerStates: [_RaceTestWorkerState<RT>] = []
Expand Down
75 changes: 3 additions & 72 deletions stdlib/private/SwiftPrivate/AtomicInt.swift.gyb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

import Swift

// This type intentionally shadows the stdlib one
@available(swift, introduced: 5.0)
public final class _stdlib_AtomicInt {
internal var _value: Int

Expand Down Expand Up @@ -47,7 +49,7 @@ public final class _stdlib_AtomicInt {

public func compareExchange(expected: inout Int, desired: Int) -> Bool {
var expectedVar = expected
let result = _stdlib_atomicCompareExchangeStrongInt(
let result = _swift_stdlib_atomicCompareExchangeStrongInt(
object: _valuePtr,
expected: &expectedVar,
desired: desired)
Expand All @@ -56,74 +58,3 @@ public final class _stdlib_AtomicInt {
}
}

public func _swift_stdlib_atomicLoadInt(
object target: UnsafeMutablePointer<Int>) -> Int {
#if arch(i386) || arch(arm)
let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
return Int(value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = Builtin.atomicload_seqcst_Int64(target._rawValue)
return Int(value)
#endif
}

public func _swift_stdlib_atomicStoreInt(
object target: UnsafeMutablePointer<Int>,
desired: Int) {
#if arch(i386) || arch(arm)
Builtin.atomicstore_seqcst_Int32(target._rawValue, desired._value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
Builtin.atomicstore_seqcst_Int64(target._rawValue, desired._value)
#endif
}

public func _stdlib_atomicCompareExchangeStrongInt(
object target: UnsafeMutablePointer<Int>,
expected: UnsafeMutablePointer<Int>,
desired: Int) -> Bool {
#if arch(i386) || arch(arm)
let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int32(
target._rawValue, expected.pointee._value, desired._value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int64(
target._rawValue, expected.pointee._value, desired._value)
#endif
expected.pointee._value = oldValue
return Bool(won)
}

% for operation in ['Add', 'And', 'Or', 'Xor']:
// Warning: no overflow checking.
public func _swift_stdlib_atomicFetch${operation}Int(
object target: UnsafeMutablePointer<Int>,
operand: Int) -> Int {
let rawTarget = UnsafeMutableRawPointer(target)
#if arch(i386) || arch(arm)
let value = _swift_stdlib_atomicFetch${operation}Int32(
object: rawTarget.assumingMemoryBound(to: Int32.self),
operand: Int32(operand))
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = _swift_stdlib_atomicFetch${operation}Int64(
object: rawTarget.assumingMemoryBound(to: Int64.self),
operand: Int64(operand))
#endif
return Int(value)
}

% for bits in [ 32, 64 ]:

// Warning: no overflow checking.
public func _swift_stdlib_atomicFetch${operation}Int${bits}(
object target: UnsafeMutablePointer<Int${bits}>,
operand: Int${bits}) -> Int${bits} {

let value = Builtin.atomicrmw_${operation.lower()}_seqcst_Int${bits}(
target._rawValue, operand._value)

return Int${bits}(value)
}

% end

% end

134 changes: 134 additions & 0 deletions stdlib/public/core/AtomicInt.swift.gyb
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

@available(swift, deprecated: 4.2, obsoleted: 5.0)
public final class _stdlib_AtomicInt {
internal var _value: Int

internal var _valuePtr: UnsafeMutablePointer<Int> {
return _getUnsafePointerToStoredProperties(self).assumingMemoryBound(
to: Int.self)
}

public init(_ value: Int = 0) {
_value = value
}

public func store(_ desired: Int) {
return _swift_stdlib_atomicStoreInt(object: _valuePtr, desired: desired)
}

public func load() -> Int {
return _swift_stdlib_atomicLoadInt(object: _valuePtr)
}

% for operation_name, operation in [ ('Add', '+'), ('And', '&'), ('Or', '|'), ('Xor', '^') ]:
@discardableResult
public func fetchAnd${operation_name}(_ operand: Int) -> Int {
return _swift_stdlib_atomicFetch${operation_name}Int(
object: _valuePtr,
operand: operand)
}

public func ${operation_name.lower()}AndFetch(_ operand: Int) -> Int {
return fetchAnd${operation_name}(operand) ${operation} operand
}
% end

public func compareExchange(expected: inout Int, desired: Int) -> Bool {
var expectedVar = expected
let result = _swift_stdlib_atomicCompareExchangeStrongInt(
object: _valuePtr,
expected: &expectedVar,
desired: desired)
expected = expectedVar
return result
}
}

@usableFromInline // used by SwiftPrivate._stdlib_AtomicInt
internal func _swift_stdlib_atomicCompareExchangeStrongInt(
object target: UnsafeMutablePointer<Int>,
expected: UnsafeMutablePointer<Int>,
desired: Int) -> Bool {
#if arch(i386) || arch(arm) || arch(arm64_32)
let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int32(
target._rawValue, expected.pointee._value, desired._value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int64(
target._rawValue, expected.pointee._value, desired._value)
#endif
expected.pointee._value = oldValue
return Bool(won)
}


@usableFromInline // used by SwiftPrivate._stdlib_AtomicInt
internal func _swift_stdlib_atomicLoadInt(
object target: UnsafeMutablePointer<Int>) -> Int {
#if arch(i386) || arch(arm) || arch(arm64_32)
let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
return Int(value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = Builtin.atomicload_seqcst_Int64(target._rawValue)
return Int(value)
#endif
}

@usableFromInline // used by SwiftPrivate._stdlib_AtomicInt
internal func _swift_stdlib_atomicStoreInt(
object target: UnsafeMutablePointer<Int>,
desired: Int) {
#if arch(i386) || arch(arm) || arch(arm64_32)
Builtin.atomicstore_seqcst_Int32(target._rawValue, desired._value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
Builtin.atomicstore_seqcst_Int64(target._rawValue, desired._value)
#endif
}

% for operation in ['Add', 'And', 'Or', 'Xor']:
// Warning: no overflow checking.
@usableFromInline // used by SwiftPrivate._stdlib_AtomicInt
internal func _swift_stdlib_atomicFetch${operation}Int(
object target: UnsafeMutablePointer<Int>,
operand: Int) -> Int {
let rawTarget = UnsafeMutableRawPointer(target)
#if arch(i386) || arch(arm)
let value = _swift_stdlib_atomicFetch${operation}Int32(
object: rawTarget.assumingMemoryBound(to: Int32.self),
operand: Int32(operand))
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = _swift_stdlib_atomicFetch${operation}Int64(
object: rawTarget.assumingMemoryBound(to: Int64.self),
operand: Int64(operand))
#endif
return Int(value)
}

% for bits in [ 32, 64 ]:

// Warning: no overflow checking.
@usableFromInline // used by SwiftPrivate._stdlib_AtomicInt
internal func _swift_stdlib_atomicFetch${operation}Int${bits}(
object target: UnsafeMutablePointer<Int${bits}>,
operand: Int${bits}) -> Int${bits} {

let value = Builtin.atomicrmw_${operation.lower()}_seqcst_Int${bits}(
target._rawValue, operand._value)

return Int${bits}(value)
}

% end

% end

1 change: 1 addition & 0 deletions stdlib/public/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ set(SWIFTLIB_ESSENTIAL
ASCII.swift
Assert.swift
AssertCommon.swift
AtomicInt.swift.gyb
BidirectionalCollection.swift
Bitset.swift
Bool.swift
Expand Down
1 change: 1 addition & 0 deletions stdlib/public/core/GroupInfo.json
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@
"Bitset.swift"
],
"Misc": [
"AtomicInt.swift",
"ErrorType.swift",
"InputStream.swift",
"LifetimeManager.swift",
Expand Down
48 changes: 0 additions & 48 deletions stdlib/public/core/Runtime.swift.gyb
Original file line number Diff line number Diff line change
Expand Up @@ -114,54 +114,6 @@ func _stdlib_atomicLoadARCRef(
return nil
}

//===----------------------------------------------------------------------===//
// These pieces are used in ThreadLocalStorage.swift in debug builds.
// For tests, see similar functions from SwiftPrivate/AtomicInt.swift.gyb
//===----------------------------------------------------------------------===//
internal func _swift_stdlib_atomicLoadInt(
object target: UnsafeMutablePointer<Int>) -> Int {
#if arch(i386) || arch(arm)
let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
return Int(value)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = Builtin.atomicload_seqcst_Int64(target._rawValue)
return Int(value)
#endif
}

% for bits in [ 32, 64 ]:

// Warning: no overflow checking.
internal func _swift_stdlib_atomicFetchAddInt${bits}(
object target: UnsafeMutablePointer<Int${bits}>,
operand: Int${bits}) -> Int${bits} {

let value = Builtin.atomicrmw_add_seqcst_Int${bits}(
target._rawValue, operand._value)

return Int${bits}(value)
}

% end

// Warning: no overflow checking.
internal func _swift_stdlib_atomicFetchAddInt(
object target: UnsafeMutablePointer<Int>,
operand: Int) -> Int {
let rawTarget = UnsafeMutableRawPointer(target)
#if arch(i386) || arch(arm)
let value = _swift_stdlib_atomicFetchAddInt32(
object: rawTarget.assumingMemoryBound(to: Int32.self),
operand: Int32(operand))
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
let value = _swift_stdlib_atomicFetchAddInt64(
object: rawTarget.assumingMemoryBound(to: Int64.self),
operand: Int64(operand))
#endif
return Int(value)
}
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// Conversion of primitive types to `String`
//===----------------------------------------------------------------------===//
Expand Down
2 changes: 1 addition & 1 deletion test/Prototypes/CollectionTransformers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ final public class ForkJoinPool {
internal let _maxThreads: Int
/// Total number of threads: number of running threads plus the number of
/// threads that are preparing to start).
internal let _totalThreads: _stdlib_AtomicInt = _stdlib_AtomicInt(0)
internal let _totalThreads = _stdlib_AtomicInt(0)

internal var _runningThreads: [_ForkJoinWorkerThread] = []
internal var _runningThreadsMutex: _ForkJoinMutex = _ForkJoinMutex()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %gyb %s -o %t/PersistentVector.swift
// RUN: %line-directive %t/PersistentVector.swift -- %target-build-swift -parse-stdlib %t/PersistentVector.swift -o %t/a.out
// RUN: %line-directive %t/PersistentVector.swift -- %target-build-swift -parse-stdlib -Xfrontend -disable-access-control %t/PersistentVector.swift -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %line-directive %t/PersistentVector.swift -- %target-run %t/a.out
// REQUIRES: executable_test
Expand Down