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 }