diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c8880a..af0d174 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ set(CXX_FLAGS -Wpointer-arith -Wshadow -Wwrite-strings - -march=native + -march=armv4 # -MMD # -std=c++0x -rdynamic @@ -31,7 +31,7 @@ if(CMAKE_BUILD_BITS EQUAL 32) endif() string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}") -set(CMAKE_CXX_COMPILER "g++") +set(CMAKE_CXX_COMPILER "arm-g++") #set(CMAKE_CXX_COMPILER "icpc") set(CMAKE_CXX_FLAGS_DEBUG "-O0") set(CMAKE_CXX_FLAGS_RELEASE "-O2 -finline-limit=1000 -DNDEBUG") diff --git a/muduo/base/Atomic.h b/muduo/base/Atomic.h index 3478da0..cc1dd45 100644 --- a/muduo/base/Atomic.h +++ b/muduo/base/Atomic.h @@ -8,6 +8,7 @@ #include <boost/noncopyable.hpp> #include <stdint.h> +#include <muduo/base/Mutex.h> namespace muduo { @@ -83,10 +84,88 @@ class AtomicIntegerT : boost::noncopyable private: volatile T value_; }; + +template<typename T> +class AtomicIntegerLock : boost::noncopyable +{ + public: + AtomicIntegerLock() + : value_(0) + { + } + + // uncomment if you need copying and assignment + // + // AtomicIntegerT(const AtomicIntegerT& that) + // : value_(that.get()) + // {} + // + // AtomicIntegerT& operator=(const AtomicIntegerT& that) + // { + // getAndSet(that.get()); + // return *this; + // } + + T get() + { + MutexLockGuard lock(mutex_); + return value_; + } + + T getAndAdd(T x) + { + MutexLockGuard lock(mutex_); + T old = value_; + value_ += x; + return old; + } + + T addAndGet(T x) + { + return getAndAdd(x) + x; + } + + T incrementAndGet() + { + return addAndGet(1); + } + + T decrementAndGet() + { + return addAndGet(-1); + } + + void add(T x) + { + getAndAdd(x); + } + + void increment() + { + incrementAndGet(); + } + + void decrement() + { + decrementAndGet(); + } + + T getAndSet(T newValue) + { + MutexLockGuard lock(mutex_); + T old = value_; + value_ = newValue; + return old; + } + + private: + volatile T value_; + MutexLock mutex_; +}; } typedef detail::AtomicIntegerT<int32_t> AtomicInt32; -typedef detail::AtomicIntegerT<int64_t> AtomicInt64; +typedef detail::AtomicIntegerLock<int64_t> AtomicInt64; } #endif // MUDUO_BASE_ATOMIC_H diff --git a/muduo/base/tests/CMakeLists.txt b/muduo/base/tests/CMakeLists.txt index 2c3f1c4..73d90fd 100644 --- a/muduo/base/tests/CMakeLists.txt +++ b/muduo/base/tests/CMakeLists.txt @@ -2,7 +2,7 @@ target_link_libraries(asynclogging_test muduo_base) add_executable(atomic_unittest Atomic_unittest.cc) -# target_link_libraries(atomic_unittest muduo_base) +target_link_libraries(atomic_unittest muduo_base) add_executable(blockingqueue_test BlockingQueue_test.cc) target_link_libraries(blockingqueue_test muduo_base)