From dcb11cf3117de658d1db43dbb850e80416060f38 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Thu, 16 Dec 2021 15:31:30 +0100 Subject: [PATCH] TD3 II.2 Manage processes counter --- code/userprog/addrspace.cc | 20 ++++++++++++++++++++ code/userprog/exception.cc | 5 +++-- code/userprog/userthread.cc | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc index 7aed644..17da5ab 100644 --- a/code/userprog/addrspace.cc +++ b/code/userprog/addrspace.cc @@ -168,6 +168,10 @@ AddrSpace::AddrSpace (OpenFile * executable) DEBUG('x', "Initialize memory map size:%d\n", bitmapSize); memoryMap = new BitMap(bitmapSize); memoryMap->Mark(0); + semProcessesCounter->P(); + processes++; + semProcessesCounter->V(); + DEBUG('x', "Increase Process counter:%d\n", processes); #endif //CHANGED AddrSpaceList.Append(this); @@ -180,15 +184,31 @@ AddrSpace::AddrSpace (OpenFile * executable) AddrSpace::~AddrSpace () { + #ifdef CHANGED + for(unsigned i = 0; i < numPages; i++) { + pageProvider->ReleasePage(pageTable[i].physicalPage); + } + #endif + + DEBUG('s',"Delete Page Table\n"); delete [] pageTable; pageTable = NULL; AddrSpaceList.Remove(this); #ifdef CHANGED + DEBUG('c',"Delete Semaphores, memorymap\n"); delete semThreadsCounter; delete semAllocateUserStack; delete memoryMap; + semProcessesCounter->P(); + processes--; + semProcessesCounter->V(); + DEBUG('c', "Decrease Process counter:%d\n", processes); #endif + if ( processes == 0 ){ + DEBUG('c', "No more processes on RAM, call Exit()\n"); + interrupt->Powerdown(); + } } //---------------------------------------------------------------------- diff --git a/code/userprog/exception.cc b/code/userprog/exception.cc index 88d244a..b6e0247 100644 --- a/code/userprog/exception.cc +++ b/code/userprog/exception.cc @@ -125,7 +125,7 @@ ExceptionHandler (ExceptionType which) case SC_Halt: { DEBUG ('s', "Shutdown, initiated by user program.\n"); - interrupt->Powerdown (); + interrupt->Powerdown(); break; } #ifdef CHANGED @@ -133,9 +133,10 @@ ExceptionHandler (ExceptionType which) { // while (1) // currentThread->Yield(); + DEBUG('x',"Exit\n"); int ret = machine->ReadRegister(4); printf("Exit code %d\n", ret); - interrupt->Powerdown(); + // do_ThreadExit(); break; } case SC_PutChar: diff --git a/code/userprog/userthread.cc b/code/userprog/userthread.cc index f93039e..6f9c99b 100644 --- a/code/userprog/userthread.cc +++ b/code/userprog/userthread.cc @@ -86,6 +86,7 @@ void do_ThreadExit(){ DEBUG('x', "Decrease numbers of Threads:%d\n",currentThread->space->threads); if ( currentThread->space->threads == 0 ){ + DEBUG('x', "Delete Userspace, no more Threads\n"); // No threads remains, desallocate addrspace delete currentThread->space; currentThread->space = NULL;