Skip to content

Instantly share code, notes, and snippets.

@nestserau
Last active October 6, 2022 12:12
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save nestserau/ce8f5e5d3f68781732374f7b1c352a5a to your computer and use it in GitHub Desktop.
Save nestserau/ce8f5e5d3f68781732374f7b1c352a5a to your computer and use it in GitHub Desktop.
Atomic way to operate on integers in Swift. Inspired by Java's AtomicInteger
/// This is free and unencumbered software released into the public domain.
///
/// Anyone is free to copy, modify, publish, use, compile, sell, or
/// distribute this software, either in source code form or as a compiled
/// binary, for any purpose, commercial or non-commercial, and by any
/// means.
///
/// In jurisdictions that recognize copyright laws, the author or authors
/// of this software dedicate any and all copyright interest in the
/// software to the public domain. We make this dedication for the benefit
/// of the public at large and to the detriment of our heirs and
/// successors. We intend this dedication to be an overt act of
/// relinquishment in perpetuity of all present and future rights to this
/// software under copyright law.
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
/// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
/// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
/// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
/// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
/// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
/// OTHER DEALINGS IN THE SOFTWARE.
///
/// For more information, please refer to <http://unlicense.org/>
import Foundation
public final class AtomicInteger {
private let lock = DispatchSemaphore(value: 1)
private var _value: Int
public init(value initialValue: Int = 0) {
_value = initialValue
}
public var value: Int {
get {
lock.wait()
defer { lock.signal() }
return _value
}
set {
lock.wait()
defer { lock.signal() }
_value = newValue
}
}
public func decrementAndGet() -> Int {
lock.wait()
defer { lock.signal() }
_value -= 1
return _value
}
public func incrementAndGet() -> Int {
lock.wait()
defer { lock.signal() }
_value += 1
return _value
}
}
@andyvanosdale
Copy link

It looks like line 56 needs to be _value as well, otherwise, it will deadlock.

@nestserau
Copy link
Author

nestserau commented Oct 27, 2017

@enozero You're correct. I'll fix it now. Thank you.

@andyvanosdale
Copy link

Thanks! Great work!

@kartik-venugopal
Copy link

Thank you for the great work and for sharing this and especially without the nonsense about licensing. Big thumbs up !

This class really should be provided by Swift out of the box. What were/are they thinking ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment