/* */ #ifndef _D_REQUEST_SLOT_H_ #define _D_REQUEST_SLOT_H_ #include "common.h" #include "TimeA2.h" #include "Piece.h" namespace aria2 { class RequestSlot { private: Time 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()): 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():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(); void setDispatchedTime(time_t secFromEpoch); bool isTimeout(time_t timeoutSec) const; size_t getIndex() const { return index; } void setIndex(size_t index) { this->index = index; } uint32_t getBegin() const { return begin; } void setBegin(uint32_t begin) { this->begin = begin; } size_t getLength() const { return length; } void setLength(size_t length) { this->length = length; } size_t getBlockIndex() const { return blockIndex; } void setBlockIndex(size_t blockIndex) { this->blockIndex = blockIndex; } const SharedHandle& getPiece() const { return _piece; } static RequestSlot nullSlot; static bool isNull(const RequestSlot& requestSlot); }; } // namespace aria2 #endif // _D_REQUEST_SLOT_H_