| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- //
- // AtomicCounter.cpp
- //
- // $Id: //poco/1.4/Foundation/src/AtomicCounter.cpp#2 $
- //
- // Library: Foundation
- // Package: Core
- // Module: AtomicCounter
- //
- // Copyright (c) 2009, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #include "Poco/AtomicCounter.h"
- namespace Poco {
- #if POCO_OS == POCO_OS_WINDOWS_NT
- //
- // Windows
- //
- AtomicCounter::AtomicCounter():
- _counter(0)
- {
- }
-
- AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue):
- _counter(initialValue)
- {
- }
- AtomicCounter::AtomicCounter(const AtomicCounter& counter):
- _counter(counter.value())
- {
- }
- AtomicCounter::~AtomicCounter()
- {
- }
- AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
- {
- InterlockedExchange(&_counter, counter.value());
- return *this;
- }
-
- AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
- {
- InterlockedExchange(&_counter, value);
- return *this;
- }
- #elif POCO_OS == POCO_OS_MAC_OS_X
- //
- // Mac OS X
- //
- AtomicCounter::AtomicCounter():
- _counter(0)
- {
- }
-
- AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue):
- _counter(initialValue)
- {
- }
- AtomicCounter::AtomicCounter(const AtomicCounter& counter):
- _counter(counter.value())
- {
- }
- AtomicCounter::~AtomicCounter()
- {
- }
- AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
- {
- _counter = counter.value();
- return *this;
- }
-
- AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
- {
- _counter = value;
- return *this;
- }
- #elif defined(POCO_HAVE_GCC_ATOMICS)
- //
- // GCC 4.1+ atomic builtins.
- //
- AtomicCounter::AtomicCounter():
- _counter(0)
- {
- }
-
- AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue):
- _counter(initialValue)
- {
- }
- AtomicCounter::AtomicCounter(const AtomicCounter& counter):
- _counter(counter.value())
- {
- }
- AtomicCounter::~AtomicCounter()
- {
- }
- AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
- {
- __sync_lock_test_and_set(&_counter, counter.value());
- return *this;
- }
-
- AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
- {
- __sync_lock_test_and_set(&_counter, value);
- return *this;
- }
- #else
- //
- // Generic implementation based on FastMutex
- //
- AtomicCounter::AtomicCounter()
- {
- _counter.value = 0;
- }
-
- AtomicCounter::AtomicCounter(AtomicCounter::ValueType initialValue)
- {
- _counter.value = initialValue;
- }
- AtomicCounter::AtomicCounter(const AtomicCounter& counter)
- {
- _counter.value = counter.value();
- }
- AtomicCounter::~AtomicCounter()
- {
- }
- AtomicCounter& AtomicCounter::operator = (const AtomicCounter& counter)
- {
- FastMutex::ScopedLock lock(_counter.mutex);
- _counter.value = counter.value();
- return *this;
- }
-
- AtomicCounter& AtomicCounter::operator = (AtomicCounter::ValueType value)
- {
- FastMutex::ScopedLock lock(_counter.mutex);
- _counter.value = value;
- return *this;
- }
- #endif // POCO_OS
- } // namespace Poco
|