void Process::executeProcess(){ IntVTime sendTime = dynamic_cast<const IntVTime&>(getSimulationTime()); do { PHOLDEvent* recvEvent = (PHOLDEvent*) getEvent(); if( recvEvent != NULL ){ ProcessState* myState = (ProcessState *) getState(); myState->eventReceived(); SimulationObject* receiver = getDestination(myState); // Generate the delay between the send and receive times. int ldelay = msgDelay(); IntVTime recvTime = sendTime + 1 + ldelay; PHOLDEvent* newRequest = new PHOLDEvent(sendTime, recvTime, this, receiver); newRequest->numberOfHops = recvEvent->numberOfHops + 1; newRequest->eventNumber = recvEvent->eventNumber; computationGrain(); receiver->receiveEvent(newRequest); myState->eventSent(); } } while(haveMoreEvents() == true); // end of while loop }
void LocationObject::migrateLocationEvent( IntVTime currentTime, LocationState *locationState ) { /* Randomly decide whether to migrate any person */ if( !diffusionRandGen->genRandNum(SAMPLING_FREQ) ) { /* Decide a random location */ string selectedLocation = diffusionNetwork->getLocationName(); if( "" != selectedLocation ) { int travelTime = (int) ( diffusionNetwork->travelTimeToChosenLoc(selectedLocation) ); SimulationObject *receiver = getObjectHandle(selectedLocation); /* Decide a random person */ Person *person = diffusionNetwork->getPerson( locationState->getPersonMap() ); if(person) { EpidemicEvent *migrateLocEvent = new EpidemicEvent( currentTime, currentTime + travelTime, this, receiver, person, DIFFUSION ); receiver->receiveEvent(migrateLocEvent); locationState->deletePersonFromLocation(person); } } } }
void LocationObject::sendCapturedData( IntVTime currentTime, unsigned int uninfectedNum, unsigned int latentNum, unsigned int incubatingNum, unsigned int infectiousNum, unsigned int asymptNum, unsigned int recoveredNum ) { SimulationObject *receiver = getObjectHandle("writer"); FileEvent *fileEvent = new FileEvent( currentTime, currentTime, this, receiver, locationName, countIntraLocDiseaseUpdate, uninfectedNum, latentNum, incubatingNum, infectiousNum, asymptNum, recoveredNum); receiver->receiveEvent(fileEvent); }
void MemSourceObject::executeProcess(){ MemSourceState *myState = static_cast<MemSourceState *>(getState()); MemRequest* received = NULL; IntVTime sendTime = static_cast<const IntVTime&>(getSimulationTime()); //int id = getObjectID()->getSimulationObjectID(); while(true == haveMoreEvents()) { received = (MemRequest*)getEvent(); if(received != NULL){ myState->filter.update((double)((IntVTime &)getSimulationTime() - received->getStartTime() ).getTime() ); int requestsCompleted = myState->numMemRequests; if (requestsCompleted < maxMemRequests ) { double ldelay = 1.0; // we want the memRequest to get there at the exact scheduled time SimulationObject *receiver = getObjectHandle(destObjName); IntVTime recvTime = sendTime + (int) ldelay; MemRequest *newMemRequest = new MemRequest(sendTime, recvTime, this, receiver); newMemRequest->setProcessor(getName()); newMemRequest->setStartTime(sendTime.getTime()); myState->numMemRequests++; myState->oldDelay = sendTime; receiver->receiveEvent(newMemRequest); } } } }
void RAIDDisk::executeProcess() { RAIDRequest *recvEvent; RAIDDiskState *myState; RAIDRequest *newEvent; RAIDRequest *tmpEvent; IntVTime recvTime(0); int seekDist; double seekTime, a, b, c; int nextCylinder; int timeDelay = 1; int objectId; IntVTime sendTime = dynamic_cast<const IntVTime&> (getSimulationTime()); myState = (RAIDDiskState *) getState(); while (true == haveMoreEvents()) { recvEvent = (RAIDRequest*) getEvent(); if (recvEvent != NULL) { SimulationObject *recvr = getObjectHandle( recvEvent->getSourceObject()); string receiverName = recvr->getName(); objectId=recvr->getObjectID()->getSimulationObjectID(); tmpEvent = new RAIDRequest(sendTime, sendTime + 1, this, recvr); *tmpEvent = *recvEvent; nextCylinder = (tmpEvent->getStartStripe() / (sectorsPerTrack * tracksPerCyl)) % numCylinders; tmpEvent->setStartCylinder(nextCylinder); tmpEvent->setStartSector( tmpEvent->getStartStripe() % sectorsPerTrack); seekDist = nextCylinder - myState->getCurrentCylinder(); myState = (RAIDDiskState*) getState(); if (seekDist < 0) { seekDist = abs(seekDist); } if (seekDist != 0) { a = (-10 * minSeekTime + 15 * avgSeekTime - 5 * maxSeekTime) / (3 * sqrt(numCylinders)); b = (7 * minSeekTime - 15 * avgSeekTime + 8 * maxSeekTime) / (3 * numCylinders); c = minSeekTime; if (a > 0 && b > 0) { seekTime = a * sqrt(seekDist - 1) + b * (seekDist - 1) + c; } else { cerr << "Disk Model parameters are not correct for model" << endl; seekTime = 0; } } else { seekTime = 0; } recvTime = max(sendTime.getApproximateIntTime(), lastEventTime[receiverName]) + int(seekTime + 0.5 * revolutionTime); // recvTime = lastEventTime + int(seekTime + 0.5 * revolutionTime); newEvent = new RAIDRequest(sendTime, recvTime, this, recvr); //delete lastEventTime; lastEventTime[receiverName] = recvTime.getApproximateIntTime(); //cout << "LastEvent Time for the Disk = " << lastEventTime << endl; #if 0 recvTime = VTime(getSimulationTime() + int(seekTime + 0.5*revolutionTime) + timeDelay++); newEvent = new RAIDRequest(sendTime, recvTime, this, recvr); #endif *newEvent = *tmpEvent; delete tmpEvent; myState->setCurrentCylinder(nextCylinder); // Send event back to source. recvr->receiveEvent(newEvent); } // End of if (event != null) } // End of while "have more events" loop }