/******************************************************************* * * DESCRIPTION: class MessageAdmin, SingleMsgAdm * * AUTHOR: Amir Barylko & Jorge Beyoglonian * Version 2: Daniel Rodriguez. * * EMAIL: mailto://amir@dc.uba.ar * mailto://jbeyoglo@dc.uba.ar * mailto://drodrigu@dc.uba.ar * * DATE: 27/6/1998 * DATE: 8/10/1998 (v2) * *******************************************************************/ /** include files **/ #include "msgadm.h" // base header #include "mainsimu.h" // class Simulator #include "procadm.h" #include "cppwrapper.h" #include "modeladm.h" #include /** private data **/ MessageAdmin *SingleMsgAdm::instance( NULL ) ; /******************************************************************* * Function Name: ~MessageAdmin ********************************************************************/ MessageAdmin::~MessageAdmin() {} /******************************************************************* * Function Name: send * Description: add a message to the queue ********************************************************************/ //MessageAdmin &MessageAdmin::send( const Message &msg, const ModelId &id ) MessageAdmin &MessageAdmin::send( const Message &msg, const ProcId & pid) { // cout << "MessageAdmin::send adding " << msg.asString() << " to UnprocessedMsg queue" << endl; unprocessedQueue.push_back( UnprocessedMsg( msg.clone(), pid ) ) ; return *this ; } /******************************************************************* * Function Name: run ********************************************************************/ MessageAdmin &MessageAdmin::run() { running = true ; while( isRunning() ) { if (!unprocessedQueue.empty()) { const UnprocessedMsg &umsg( unprocessedQueue.front() ) ; ProcId pid = umsg.second; MachineId mid = -1 ; #ifndef WITH_PCDPP mid = SingleCPPWrapper::Instance().machineForProcId(pid); #else if (pid == SingleCPPWrapper::Instance().getFCId()) mid = 0; else mid = SingleCPPWrapper::Instance().machineForProcId( pid ) ; #endif if ( mid == SingleCPPWrapper::Instance().getMachineID()) { Processor &proc( SingleProcessorAdmin::Instance().processor( umsg.second ) ) ; if ( SingleCPPWrapper::Instance().getCPPTransferDelays().size() < LOCAL_MESSAGE_COUNT && proc.processorType() == "SIMULATOR" && ( umsg.first->type() == "*" || umsg.first->type() == "@" ) ) gettimeofday( &SingleCPPWrapper::Instance().getMessageSendTime() , (struct timezone*) 0 ); umsg.first->sendTo( proc ) ; MainSimulator::Instance().logStream() << umsg.first->asString() << " for " << proc.asString() << "\n" << flush ; // cout << (umsg.first)->asString() << " for " << proc.asString() << endl; } else { umsg.first->sendRemoteTo( mid, pid ) ; // cout << "--> " << (umsg.first)->asString() << " for " << pid << endl; } delete umsg.first ; unprocessedQueue.pop_front() ; } } return *this ; } /******************************************************************* * Function Name: stop ********************************************************************/ MessageAdmin &MessageAdmin::stop() { running = false ; return *this ; } // Rami: used to dump the unprocessedMsgQueue when the simulation is over MessageAdmin& MessageAdmin::dumpMessages() { UnprocessedMsgQueue::iterator cursor = unprocessedQueue.begin(); for(; cursor != unprocessedQueue.end(); cursor++) SingleCPPWrapper::Instance().debugLogStream() << (cursor->first)->asString() << endl; } /** private functions **/ /******************************************************************* * Function Name: MessageAdmin * Description: Constructor ********************************************************************/ MessageAdmin::MessageAdmin() : running( false ) {}