add some support for random access of data in packet fifos

dev/pktfifo.cc:
    add support for copying arbitrary data out of a
    packet fifo
dev/pktfifo.hh:
    add support for copying arbitrary data out of a
    packet fifo.
    Add functions to determine where in the fifo a
    particular packet is

--HG--
extra : convert_revision : f8ddc994ce8577f29af0de3fa418a01e4e2cb0f1
This commit is contained in:
Nathan Binkert 2006-02-26 20:31:08 -05:00
parent 10fcad4ce0
commit 9b18c0e872
2 changed files with 61 additions and 2 deletions

View file

@ -31,6 +31,36 @@
using namespace std;
bool
PacketFifo::copyout(void *dest, int offset, int len)
{
char *data = (char *)dest;
if (offset + len >= size())
return false;
list<PacketPtr>::iterator p = fifo.begin();
list<PacketPtr>::iterator end = fifo.end();
while (len > 0) {
while (offset >= (*p)->length) {
offset -= (*p)->length;
++p;
}
if (p == end)
panic("invalid fifo");
int size = min((*p)->length - offset, len);
memcpy(data, (*p)->data, size);
offset = 0;
len -= size;
data += size;
++p;
}
return true;
}
void
PacketFifo::serialize(const string &base, ostream &os)
{
@ -40,8 +70,8 @@ PacketFifo::serialize(const string &base, ostream &os)
paramOut(os, base + ".packets", fifo.size());
int i = 0;
std::list<PacketPtr>::iterator p = fifo.begin();
std::list<PacketPtr>::iterator end = fifo.end();
list<PacketPtr>::iterator p = fifo.begin();
list<PacketPtr>::iterator end = fifo.end();
while (p != end) {
(*p)->serialize(csprintf("%s.packet%d", base, i), os);
++p;

View file

@ -127,6 +127,35 @@ class PacketFifo
fifo.erase(i);
}
bool copyout(void *dest, int offset, int len);
int countPacketsBefore(iterator end)
{
iterator i = fifo.begin();
int count = 0;
while (i != end) {
++count;
++i;
}
return count;
}
int countPacketsAfter(iterator i)
{
iterator end = fifo.end();
int count = 0;
while (i != end) {
++count;
++i;
}
return count;
}
/**
* Serialization stuff
*/