/* */ #ifndef D_REQUEST_SLOT_H #define D_REQUEST_SLOT_H #include "common.h" #include "TimerA2.h" #include "Piece.h" #include "wallclock.h" namespace aria2 { class RequestSlot { private: Timer dispatchedTime_; size_t index_; uint32_t begin_; size_t length_; size_t blockIndex_; // This is the piece whose index is index of this RequestSlot has. // To detect duplicate RequestSlot, we have to find the piece using // PieceStorage::getPiece() repeatedly. It turns out that this process // takes time(about 1.7% of processing time). To reduce it, we put piece here // at the construction of RequestSlot as a cache. SharedHandle piece_; // inlined for performance reason void copy(const RequestSlot& requestSlot) { dispatchedTime_ = requestSlot.dispatchedTime_; index_ = requestSlot.index_; begin_ = requestSlot.begin_; length_ = requestSlot.length_; blockIndex_ = requestSlot.blockIndex_; piece_ = requestSlot.piece_; } public: RequestSlot(size_t index, uint32_t begin, size_t length, size_t blockIndex, const SharedHandle& piece = SharedHandle()): dispatchedTime_(global::wallclock), index_(index), begin_(begin), length_(length), blockIndex_(blockIndex), piece_(piece) {} RequestSlot(const RequestSlot& requestSlot): dispatchedTime_(requestSlot.dispatchedTime_), index_(requestSlot.index_), begin_(requestSlot.begin_), length_(requestSlot.length_), blockIndex_(requestSlot.blockIndex_), piece_(requestSlot.piece_) {} RequestSlot():dispatchedTime_(0), index_(0), begin_(0), length_(0), blockIndex_(0) {} ~RequestSlot() {} RequestSlot& operator=(const RequestSlot& requestSlot) { if(this != &requestSlot) { copy(requestSlot); } return *this; } bool operator==(const RequestSlot& requestSlot) const { return index_ == requestSlot.index_ && begin_ == requestSlot.begin_ && length_ == requestSlot.length_; } bool operator!=(const RequestSlot& requestSlot) const { return !(*this == requestSlot); } bool operator<(const RequestSlot& requestSlot) const { if(index_ == requestSlot.index_) { return begin_ < requestSlot.begin_; } else { return index_ < requestSlot.index_; } } void setDispatchedTime(time_t secFromEpoch); bool isTimeout(time_t timeoutSec) const; size_t getIndex() const { return index_; } void setIndex(size_t index) { index_ = index; } uint32_t getBegin() const { return begin_; } void setBegin(uint32_t begin) { begin_ = begin; } size_t getLength() const { return length_; } void setLength(size_t length) { length_ = length; } size_t getBlockIndex() const { return blockIndex_; } void setBlockIndex(size_t blockIndex) { blockIndex_ = blockIndex; } const SharedHandle& getPiece() const { return piece_; } static RequestSlot nullSlot; static bool isNull(const RequestSlot& requestSlot); }; } // namespace aria2 #endif // D_REQUEST_SLOT_H