summaryrefslogtreecommitdiff
path: root/dev/pktfifo.hh
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2004-11-16 23:59:51 -0500
committerNathan Binkert <binkertn@umich.edu>2004-11-16 23:59:51 -0500
commita109296bdeaf43c76c2384c67b05d4b5bd484ff4 (patch)
tree492f85f04edf439f33c9fd16c70784b7a4dde50a /dev/pktfifo.hh
parent8de12dc09ac1cf471f201964db68308656fdb6f6 (diff)
downloadgem5-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.hh20
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;
}