diff options
Diffstat (limited to 'dev/pktfifo.hh')
-rw-r--r-- | dev/pktfifo.hh | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/dev/pktfifo.hh b/dev/pktfifo.hh index a8b626618..61e4ead1b 100644 --- a/dev/pktfifo.hh +++ b/dev/pktfifo.hh @@ -39,6 +39,10 @@ class Checkpoint; class PacketFifo { + public: + typedef std::list<PacketPtr> fifo_list; + typedef fifo_list::iterator iterator; + protected: std::list<PacketPtr> fifo; int _maxsize; @@ -64,9 +68,16 @@ class PacketFifo return _reserved; } + iterator begin() { return fifo.begin(); } + iterator end() { return fifo.end(); } + + PacketPtr front() { return fifo.front(); } + bool push(PacketPtr ptr) { + assert(ptr->length); assert(_reserved <= ptr->length); + assert(ptr->slack == 0); if (avail() < ptr->length - _reserved) return false; @@ -76,25 +87,44 @@ class PacketFifo return true; } - PacketPtr front() { return fifo.front(); } - void pop() { if (empty()) return; - _size -= fifo.front()->length; - fifo.front() = NULL; + PacketPtr &packet = fifo.front(); + _size -= packet->length; + _size -= packet->slack; + packet->slack = 0; + packet = NULL; fifo.pop_front(); } void clear() { + for (iterator i = begin(); i != end(); ++i) + (*i)->slack = 0; fifo.clear(); _size = 0; _reserved = 0; } + void remove(iterator i) + { + PacketPtr &packet = *i; + if (i != fifo.begin()) { + --i; + (*i)->slack += packet->length; + } else { + _size -= packet->length; + _size -= packet->slack; + } + + packet->slack = 0; + packet = NULL; + fifo.erase(i); + } + /** * Serialization stuff */ |