diff options
Diffstat (limited to 'node/AtomicCounter.hpp')
-rw-r--r-- | node/AtomicCounter.hpp | 69 |
1 files changed, 21 insertions, 48 deletions
diff --git a/node/AtomicCounter.hpp b/node/AtomicCounter.hpp index b4993771..a42a18d4 100644 --- a/node/AtomicCounter.hpp +++ b/node/AtomicCounter.hpp @@ -1,6 +1,6 @@ /* * ZeroTier One - Network Virtualization Everywhere - * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/ + * Copyright (C) 2011-2018 ZeroTier, Inc. https://www.zerotier.com/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,17 +14,22 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. */ #ifndef ZT_ATOMICCOUNTER_HPP #define ZT_ATOMICCOUNTER_HPP #include "Constants.hpp" -#include "Mutex.hpp" -#include "NonCopyable.hpp" -#ifdef __WINDOWS__ -// <atomic> will replace this whole class eventually once it's ubiquitous +#ifndef __GNUC__ #include <atomic> #endif @@ -33,78 +38,46 @@ namespace ZeroTier { /** * Simple atomic counter supporting increment and decrement */ -class AtomicCounter : NonCopyable +class AtomicCounter { public: - /** - * Initialize counter at zero - */ - AtomicCounter() - throw() - { - _v = 0; - } + AtomicCounter() { _v = 0; } - inline operator int() const - throw() + inline int load() const { #ifdef __GNUC__ - return __sync_or_and_fetch(const_cast <volatile int *>(&_v),0); + return __sync_or_and_fetch(const_cast<int *>(&_v),0); #else -#ifdef __WINDOWS__ - return (int)_v; -#else - _l.lock(); - int v = _v; - _l.unlock(); - return v; -#endif + return _v.load(); #endif } inline int operator++() - throw() { #ifdef __GNUC__ return __sync_add_and_fetch(&_v,1); #else -#ifdef __WINDOWS__ return ++_v; -#else - _l.lock(); - int v = ++_v; - _l.unlock(); - return v; -#endif #endif } inline int operator--() - throw() { #ifdef __GNUC__ return __sync_sub_and_fetch(&_v,1); #else -#ifdef __WINDOWS__ return --_v; -#else - _l.lock(); - int v = --_v; - _l.unlock(); - return v; -#endif #endif } private: -#ifdef __WINDOWS__ - std::atomic_int _v; -#else + AtomicCounter(const AtomicCounter &) {} + const AtomicCounter &operator=(const AtomicCounter &) { return *this; } + +#ifdef __GNUC__ int _v; -#ifndef __GNUC__ -#warning Neither __WINDOWS__ nor __GNUC__ so AtomicCounter using Mutex - Mutex _l; -#endif +#else + std::atomic_int _v; #endif }; |