/* FILE: Queue.cpp */
#include "Queue.h"#include "QueueMessage_m.h"#include <omnetpp.h>
void Queue::initialize() {
}
void Queue::handleMessage(cMessage* msg) { QueueMessage* message = check_and_cast<QueueMessage*>(msg); if (message->getOperationType() == REQUEST_PUT) { queue.insert(message); } else if (message->getOperationType() == REQUEST_TAKE) { if (!queue.isEmpty()) { QueueMessage* reply = check_and_cast<QueueMessage*>(queue.pop()); send(reply, msg->getSenderGate()); } else { //Wait for queue to not be empty... Somehow... } }}#ifndef QUEUE_H_#define QUEUE_H_
#include <omnetpp.h>
class Queue : public cSimpleModule {private: cQueue queue; virtual void initialize(); virtual void handleMessage(cMessage* msg);};
Define_Module(Queue)
#endif /* QUEUE_H_ */if (!queue.isEmpty()) { QueueMessage* reply = check_and_cast<QueueMessage*>(queue.pop()); send(reply, msg->getSenderGate()); } else { //Wait for queue to not be empty... Somehow... <-- This bit right here. }/* FILE: Client.cpp */
#include "Client.h"#include "QueueMessage_m.h"#include <omnetpp.h>
void Client::initialize() { init_message = new cMessage("init"); scheduleAt(0,init_message);}
void Client::handleMessage(cMessage* msg) { if (msg == init_message) { ev << "Client initialized!\n"; send_to_queue(1,2); }}
void Client::send_to_queue(int first,int second) { QueueMessage* message = new QueueMessage(); message->setOperationType(REQUEST_PUT); message->setFirstValue(first); message->setSecondValue(second);
send(message, "gate$o");}/* FILE: Server.cpp */
#include "Server.h"#include "QueueMessage_m.h"#include <omnetpp.h>
void Server::initialize() { init_message = new cMessage("init"); scheduleAt(0,init_message);}
void Server::handleMessage(cMessage* msg) { if (msg == init_message) { ev << "Server initialized!\n"; QueueMessage* message = new QueueMessage(); message->setOperationType(REQUEST_TAKE); send(message, "gate$o"); } else { ev << "Server got a message other than the init message!\n"; QueueMessage* message = check_and_cast<QueueMessage*>(msg); ev.printf("Server got firstValue=%d and secondValue=%d", message->getFirstValue(), message->getSecondValue()); }}enum OperationType { NULL_OPERATION = 0; REQUEST_PUT = 1; REQUEST_TAKE = 2;};
message QueueMessage { int operationType @enum(OperationType); int firstValue; int secondValue;}#include "Queue.h"#include "QueueMessage_m.h"#include <omnetpp.h>
void Queue::initialize() {
}
void Queue::handleMessage(cMessage* msg) { QueueMessage* message = check_and_cast<QueueMessage*>(msg);
if (message->getOperationType() == REQUEST_PUT) { queue.insert(message); } else if (message->getOperationType() == REQUEST_TAKE) { if (!queue.isEmpty()) { QueueMessage* reply = check_and_cast<QueueMessage*>(queue.pop()); cGate* reply_gate = gateHalf(msg->getArrivalGate()->getBaseName(),cGate::OUTPUT,msg->getArrivalGate()->getIndex()); send(reply, reply_gate); } else { requests.insert(msg); } } //Do we have requests? Serve them! cQueue temporary_queue; ev << "Server has " << requests.length() << " requests to serve.\n"; while (!requests.isEmpty()) { QueueMessage* request = check_and_cast<QueueMessage*>(requests.pop()); if (request->getOperationType() == REQUEST_TAKE) { //If queue is not empty, serve this request now if (!queue.isEmpty()) { QueueMessage* reply = check_and_cast<QueueMessage*>(queue.pop()); cGate* reply_gate = gateHalf(request->getArrivalGate()->getBaseName(),cGate::OUTPUT,request->getArrivalGate()->getIndex()); send(reply, reply_gate); } //If not, put it back, in the temporary queue else { temporary_queue.insert(request); } } } //Copy from temporary queue while (!temporary_queue.isEmpty()) { requests.insert(temporary_queue.pop()); }}