/* */ #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_