private void EndRequestHandling() { m_srActiveFile.Close(); m_srActiveFile = null; ReadTokenRequest r = m_rActiveRequest; m_rActiveRequest = null; OperatingSystem.Interrupt(r); }
public void Interrupt(ReadTokenRequest rFinishedRequest) { ProcessTableEntry curProcess = m_dProcessTable[rFinishedRequest.ProcessId]; int NumOfProcess = rFinishedRequest.ProcessId; //when the token is null, EOF has been reached. //we write the value to the appropriate address space of the calling process. if (rFinishedRequest.Token == null) { curProcess.AddressSpace[rFinishedRequest.TargetVariable] = double.NaN; } else { //translate the returned token into a value (double). double token = Convert.ToDouble(rFinishedRequest.Token); curProcess.AddressSpace[rFinishedRequest.TargetVariable] = token; } curProcess.Blocked = false; //so we will not stuck in the "idle" later on... curProcess.outOfBlock = CPU.TickCount; //the process isn't blocked any more... hence, its ready. so we save the time... for later calculate max starvation if (m_dProcessTable[NumOfProcess].Done != true) //didn't finish so i need to schedual via policy { m_spPolicy.AddProcess(NumOfProcess); } //activate the next request in queue on the disk. if (m_lReadRequests.Count > 0) { //need to activate next request... Disk.ActiveRequest = m_lReadRequests[0]; m_lReadRequests.RemoveAt(0); } if (m_spPolicy.RescheduleAfterInterrupt()) { ActivateScheduler(); } }
public void ReadToken(string sFileName, int iTokenNumber, int iProcessId, string sParameterName) { ReadTokenRequest request = new ReadTokenRequest(); request.ProcessId = iProcessId; request.TokenNumber = iTokenNumber; request.TargetVariable = sParameterName; request.Token = null; request.FileName = sFileName; m_dProcessTable[iProcessId].Blocked = true; if (Disk.ActiveRequest == null) { Disk.ActiveRequest = request; } else { m_lReadRequests.Add(request); } CPU.ProgramCounter = CPU.ProgramCounter + 1; ActivateScheduler(); }
public void Interrupt(ReadTokenRequest rFinishedRequest) { //implement an "end read request" interrupt handler. //translate the returned token into a value (double). //when the token is null, EOF has been reached. //write the value to the appropriate address space of the calling process. //activate the next request in queue on the disk. ProcessTableEntry active_process = m_dProcessTable[rFinishedRequest.ProcessId]; String var_name = rFinishedRequest.TargetVariable; String var_value = rFinishedRequest.Token; if (var_value == null) { active_process.AddressSpace[var_name] = double.NaN; } else { active_process.AddressSpace[var_name] = Convert.ToDouble(var_value); } m_dProcessTable[rFinishedRequest.ProcessId].Blocked = false; m_spPolicy.AddProcess(rFinishedRequest.ProcessId); m_lReadRequests.Remove(rFinishedRequest); if (m_lReadRequests.Count > 0) { ReadTokenRequest awaiting_procees_request = m_lReadRequests.First(); //m_dProcessTable[awaiting_procees_request.ProcessId].Blocked = true; Disk.ActiveRequest = awaiting_procees_request; } if (m_spPolicy.RescheduleAfterInterrupt()) { ActivateScheduler(); } }