예제 #1
0
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
}
예제 #2
0
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);
            }
        }
    }
}
예제 #3
0
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);
}
예제 #4
0
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);
        }
     }
  }
}
예제 #5
0
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
}