diff --git a/src/Makefile.am b/src/Makefile.am index 186acc33..c93f41c0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,7 +53,7 @@ SRCS = Socket.h\ LogFactory.cc LogFactory.h\ TimerA2.cc TimerA2.h\ TimeA2.cc TimeA2.h\ - SharedHandle.h\ + SharedHandle.cc SharedHandle.h\ FeatureConfig.cc FeatureConfig.h\ DownloadEngineFactory.cc DownloadEngineFactory.h\ SpeedCalc.cc SpeedCalc.h\ diff --git a/src/SharedHandle.cc b/src/SharedHandle.cc new file mode 100644 index 00000000..9986f2f9 --- /dev/null +++ b/src/SharedHandle.cc @@ -0,0 +1,121 @@ +/* */ +#include "SharedHandle.h" + +namespace aria2 { + +SharedCount::SharedCount():refCount_(new RefCount()) {} + +SharedCount::SharedCount(const SharedCount& s):refCount_(s.refCount_) +{ + refCount_->addRefCount(); +} + +SharedCount::~SharedCount() +{ + refCount_->releaseRefCount(); + if(refCount_->getWeakRefCount() == 0) { + delete refCount_; + } +} + +bool SharedCount::reassign(const SharedCount& s) +{ + s.refCount_->addRefCount(); + refCount_->releaseRefCount(); + if(refCount_->getWeakRefCount() == 0) { + delete refCount_; + refCount_ = s.refCount_; + return true; + } + size_t thisCount = refCount_->getStrongRefCount(); + refCount_ = s.refCount_; + return thisCount == 0; +} + +void SharedCount::swap(SharedCount& r) +{ + std::swap(refCount_, r.refCount_); +} + +WeakCount::WeakCount(const WeakRef& t):refCount_(new RefCount(t)) {} + +WeakCount::WeakCount(const StrongRef& t):refCount_(new RefCount()) {} + +WeakCount::WeakCount(const WeakCount& w):refCount_(w.refCount_) +{ + refCount_->addWeakRefCount(); +} + +WeakCount::WeakCount(const SharedCount& s):refCount_(s.refCount_) +{ + refCount_->addWeakRefCount(); +} + +WeakCount::~WeakCount() +{ + refCount_->releaseWeakRefCount(); + if(refCount_->getWeakRefCount() == 0) { + delete refCount_; + } +} + +bool WeakCount::reassign(const SharedCount& s) +{ + s.refCount_->addWeakRefCount(); + refCount_->releaseWeakRefCount(); + if(refCount_->getWeakRefCount() == 0) { + delete refCount_; + refCount_ = s.refCount_; + return true; + } + refCount_ = s.refCount_; + return false; +} + +bool WeakCount::reassign(const WeakCount& s) +{ + s.refCount_->addWeakRefCount(); + refCount_->releaseWeakRefCount(); + if(refCount_->getWeakRefCount() == 0) { + delete refCount_; + refCount_ = s.refCount_; + return true; + } + refCount_ = s.refCount_; + return false; +} + +} // namespace aria2 diff --git a/src/SharedHandle.h b/src/SharedHandle.h index 9f0d5eed..5c94c205 100644 --- a/src/SharedHandle.h +++ b/src/SharedHandle.h @@ -2,7 +2,7 @@ /* * aria2 - The high speed download utility * - * Copyright (C) 2006 Tatsuhiro Tsujikawa + * Copyright (C) 2012 Tatsuhiro Tsujikawa * * 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 @@ -93,93 +93,38 @@ private: RefCount* refCount_; public: - SharedCount():refCount_(new RefCount()) {} + SharedCount(); - SharedCount(const SharedCount& s):refCount_(s.refCount_) - { - refCount_->addRefCount(); - } + SharedCount(const SharedCount& s); - ~SharedCount() { - refCount_->releaseRefCount(); - if(refCount_->getWeakRefCount() == 0) { - delete refCount_; - } - } + ~SharedCount(); - bool reassign(const SharedCount& s) { - s.refCount_->addRefCount(); - refCount_->releaseRefCount(); - if(refCount_->getWeakRefCount() == 0) { - delete refCount_; - refCount_ = s.refCount_; - return true; - } - size_t thisCount = refCount_->getStrongRefCount(); - refCount_ = s.refCount_; - return thisCount == 0; - } + bool reassign(const SharedCount& s); inline size_t getRefCount() const { return refCount_->getStrongRefCount(); } - void swap(SharedCount& r) - { - std::swap(refCount_, r.refCount_); - } + void swap(SharedCount& r); }; class WeakCount { private: RefCount* refCount_; public: - WeakCount(const WeakRef& t):refCount_(new RefCount(t)) {} + WeakCount(const WeakRef& t); - WeakCount(const StrongRef& t):refCount_(new RefCount()) {} + WeakCount(const StrongRef& t); - WeakCount(const WeakCount& w):refCount_(w.refCount_) - { - refCount_->addWeakRefCount(); - } + WeakCount(const WeakCount& w); - WeakCount(const SharedCount& s):refCount_(s.refCount_) - { - refCount_->addWeakRefCount(); - } + WeakCount(const SharedCount& s); - ~WeakCount() - { - refCount_->releaseWeakRefCount(); - if(refCount_->getWeakRefCount() == 0) { - delete refCount_; - } - } + ~WeakCount(); - bool reassign(const SharedCount& s) { - s.refCount_->addWeakRefCount(); - refCount_->releaseWeakRefCount(); - if(refCount_->getWeakRefCount() == 0) { - delete refCount_; - refCount_ = s.refCount_; - return true; - } - refCount_ = s.refCount_; - return false; - } + bool reassign(const SharedCount& s); - bool reassign(const WeakCount& s) { - s.refCount_->addWeakRefCount(); - refCount_->releaseWeakRefCount(); - if(refCount_->getWeakRefCount() == 0) { - delete refCount_; - refCount_ = s.refCount_; - return true; - } - refCount_ = s.refCount_; - return false; - } + bool reassign(const WeakCount& s); inline size_t getRefCount() const { return refCount_->getStrongRefCount(); } - }; template