//-------------------------------------------------------------
// file: fifo1.cc
//        (part of Fifo1 - an OMNeT++ demo simulation)
//-------------------------------------------------------------

#include "fifo1.h"


void FF1AbstractFifo::activity()
{
    msgServiced = NULL;
    endServiceMsg = new cMessage("end-service");
    queue.setName("queue");

    for(;;)
    {
        cMessage *msg = receive();
        if (msg==endServiceMsg)
        {
            endService( msgServiced );
            if (queue.empty())
            {
                msgServiced = NULL;
            }
            else
            {
                msgServiced = (cMessage *) queue.pop();
                simtime_t serviceTime = startService( msgServiced );
                scheduleAt( simTime()+serviceTime, endServiceMsg );
            }
        }
        else if (!msgServiced)
        {
            arrival( msg );
            msgServiced = msg;
            simtime_t serviceTime = startService( msgServiced );
            scheduleAt( simTime()+serviceTime, endServiceMsg );

        }
        else
        {
            arrival( msg );
            queue.insert( msg );
        }
    }
}

void FF1AbstractFifo::finish()
{
    ev << "*** Module: " << fullPath() << "***" << endl;
    ev << "Stack allocated:      " << stackSize() << " bytes";
    ev << " (includes " << ev.extraStackForEnvir() << " bytes for environment)" << endl;
    ev << "Stack actually used: " << stackUsage() << " bytes" << endl;
}

//------------------------------------------------

Define_Module( FF1PacketFifo );

simtime_t FF1PacketFifo::startService(cMessage *msg)
{
    ev << "Starting service of " << msg->name() << endl;
    return par("service_time");
}

void FF1PacketFifo::endService(cMessage *msg)
{
    ev << "Completed service of " << msg->name() << endl;
    send( msg, "out" );
}

//------------------------------------------------

Define_Module( FF1BitFifo );

simtime_t FF1BitFifo::startService(cMessage *msg)
{
    ev << "Starting service of " << msg->name() << endl;
    return msg->length() / (double)par("bits_per_sec");
}

void FF1BitFifo::endService(cMessage *msg)
{
    ev << "Completed service of " << msg->name() << endl;
    send( msg, "out" );
}



syntax highlighted by Code2HTML, v. 0.9.1