//---------------------------------------------------------------------- // // ProcessFreeResources // // Free the resources associated with a process. This assumes the // process isn't currently on any queue. // //---------------------------------------------------------------------- void ProcessFreeResources (PCB *pcb) { int i = 0; int usrsp = MEM_ADDRESS_TO_PAGE(pcb->currentSavedFrame[PROCESS_STACK_USER_STACKPOINTER]); // Allocate a new link for this pcb on the freepcbs queue if ((pcb->l = AQueueAllocLink(pcb)) == NULL) { printf("FATAL ERROR: could not get Queue Link in ProcessFreeResources!\n"); exitsim(); } // Set the pcb's status to available pcb->flags = PROCESS_STATUS_FREE; // Insert the link into the freepcbs queue if (AQueueInsertLast(&freepcbs, pcb->l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert PCB link into freepcbs queue in ProcessFreeResources!\n"); exitsim(); } //------------------------------------------------------------ // STUDENT: Free any memory resources on process death here. //------------------------------------------------------------ for(i = 0; i < 5; i++) { MemoryFreePte(pcb->pagetable[i]); } for(i = usrsp; i <= MEM_ADDRESS_TO_PAGE(MEM_MAX_VIRTUAL_ADDRESS); i++) { MemoryFreePte(pcb->pagetable[i]); } MemoryFreePage (pcb->sysStackArea / MEM_PAGESIZE); ProcessSetStatus (pcb, PROCESS_STATUS_FREE); dbprintf ('p', "ProcessFreeResources: function complete\n"); }
//---------------------------------------------------------------------- // // ProcessFreeResources // // Free the resources associated with a process. This assumes the // process isn't currently on any queue. // //---------------------------------------------------------------------- void ProcessFreeResources (PCB *pcb) { int i = 0; dbprintf ('p', "ProcessFreeResources: function started\n"); // Allocate a new link for this pcb on the freepcbs queue if ((pcb->l = AQueueAllocLink(pcb)) == NULL) { printf("FATAL ERROR: could not get Queue Link in ProcessFreeResources!\n"); GracefulExit(); } // Set the pcb's status to available pcb->flags = PROCESS_STATUS_FREE; // Insert the link into the freepcbs queue if (AQueueInsertLast(&freepcbs, pcb->l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert PCB link into freepcbs queue in ProcessFreeResources!\n"); GracefulExit(); } // Free the process's memory. for (i = 0; i < pcb->npages; i++) { MemoryFreePte (pcb->pagetable[i]); } // Free the page allocated for the system stack MemoryFreePage (pcb->sysStackArea / MEMORY_PAGE_SIZE); ProcessSetStatus (pcb, PROCESS_STATUS_FREE); dbprintf ('p', "ProcessFreeResources: function complete\n"); }
//---------------------------------------------------------------------- // // ProcessFreeResources // // Free the resources associated with a process. This assumes the // process isn't currently on any queue. // //---------------------------------------------------------------------- void ProcessFreeResources (PCB *pcb) { int i; int npages; QueueInsertLast (&freepcbs, &pcb->l); // Free the process's memory. This is easy with a one-level page // table, but could get more complex with two-level page tables. npages = pcb->npages; for (i=0; i<npages; i++) { MemoryFreeSharedPte(pcb, i); // *MUST* be called before calling // MemoryFreePte. MemoryFreePte does not know // anything about shared pages, and hence it // might screw up big time } for (i = 0; i < pcb->npages; i++) { MemoryFreePte (pcb->pagetable[i]); } // Free the page allocated for the system stack MemoryFreePage (pcb->sysStackArea / MEMORY_PAGE_SIZE); ProcessSetStatus (pcb, PROCESS_STATUS_FREE); }
//---------------------------------------------------------------------- // // ProcessFreeResources // // Free the resources associated with a process. This assumes the // process isn't currently on any queue. // //---------------------------------------------------------------------- void ProcessFreeResources (PCB *pcb) { int i; int npages; QueueInsertLast (&freepcbs, &pcb->l); // Free the process's memory. This is easy with a one-level page // table, but could get more complex with two-level page tables. //------------------------------------------ // You may change the code below //------------------------------------------ npages = pcb->npages; for (i = 0; i < pcb->npages; i++) { MemoryFreePte (pcb->pagetable[i]); } // Free the page allocated for the system stack MemoryFreePage (pcb->sysStackArea / MEMORY_PAGE_SIZE); ProcessSetStatus (pcb, PROCESS_STATUS_FREE); }