diff options
author | Nathan Binkert <binkertn@umich.edu> | 2004-11-16 23:59:51 -0500 |
---|---|---|
committer | Nathan Binkert <binkertn@umich.edu> | 2004-11-16 23:59:51 -0500 |
commit | a109296bdeaf43c76c2384c67b05d4b5bd484ff4 (patch) | |
tree | 492f85f04edf439f33c9fd16c70784b7a4dde50a /dev/pktfifo.hh | |
parent | 8de12dc09ac1cf471f201964db68308656fdb6f6 (diff) | |
download | gem5-a109296bdeaf43c76c2384c67b05d4b5bd484ff4.tar.xz |
Fix a bug where we would improperly calculate if the FIFO was
full by adding a reserve feature to the packet fifo which allows
us to reserve space in the fifo if only part of a packet was
copied into the fifo.
dev/ns_gige.cc:
use the new reserve feature in the fifo to properly determine
when we're full. assert that adding a packet to the fifo suceeds.
dev/pktfifo.hh:
add the ability to reserve space in the fifo. This is useful for
partial writing of packets into the fifo.
--HG--
extra : convert_revision : 83f871f34fac237bb464c9513cf6490b5c62420e
Diffstat (limited to 'dev/pktfifo.hh')
-rw-r--r-- | dev/pktfifo.hh | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/dev/pktfifo.hh b/dev/pktfifo.hh index a54a49996..0b2e95e2a 100644 --- a/dev/pktfifo.hh +++ b/dev/pktfifo.hh @@ -43,6 +43,7 @@ class PacketFifo std::list<PacketPtr> fifo; int _maxsize; int _size; + int _reserved; public: explicit PacketFifo(int max) : _maxsize(max), _size(0) {} @@ -50,18 +51,27 @@ class PacketFifo int maxsize() const { return _maxsize; } int packets() const { return fifo.size(); } - int size() const { return _size; } - int avail() const { return _maxsize - _size; } - bool empty() const { return _size == 0; } - bool full() const { return _size >= _maxsize; } + int size() const { return _size + _reserved; } + int avail() const { return maxsize() - size(); } + bool empty() const { return size() == 0; } + bool full() const { return size() >= maxsize(); } + + int reserve(int len = 0) + { + _reserved += len; + assert(avail() >= 0); + return _reserved; + } bool push(PacketPtr ptr) { - if (avail() < ptr->length) + assert(_reserved <= ptr->length); + if (avail() < ptr->length - _reserved) return false; _size += ptr->length; fifo.push_back(ptr); + _reserved = 0; return true; } |