summaryrefslogtreecommitdiff
path: root/node/AtomicCounter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/AtomicCounter.hpp')
-rw-r--r--node/AtomicCounter.hpp69
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
};