From 615d121a768e3d2031fb840d796b980beb0272b4 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Tue, 16 Nov 2021 21:51:00 +0100 Subject: [PATCH] TD2 I.6+ Implement thread counter --- code/Makefile.dep | 4 ++-- code/userprog/addrspace.cc | 5 +++++ code/userprog/addrspace.h | 1 + code/userprog/userthread.cc | 25 ++++++++++++++++++------- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/code/Makefile.dep b/code/Makefile.dep index e42a43b..1678db3 100644 --- a/code/Makefile.dep +++ b/code/Makefile.dep @@ -41,8 +41,8 @@ CFLAGS += -fsanitize=undefined LDFLAGS += -fsanitize=undefined # décommenté TD1 - partie V -#CFLAGS += -fsanitize=address -#LDFLAGS += -fsanitize=address -lpthread +CFLAGS += -fsanitize=address +LDFLAGS += -fsanitize=address -lpthread endif ifeq ($(NACHOS_SYS),MAC_OS_SYS) diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc index 9543006..2aed310 100644 --- a/code/userprog/addrspace.cc +++ b/code/userprog/addrspace.cc @@ -128,6 +128,11 @@ AddrSpace::AddrSpace (OpenFile * executable) pageTable[0].valid = FALSE; // Catch NULL dereference + #ifdef CHANGED + DEBUG('x', "Initialise thread counter\n"); + Threads = 1; + #endif //CHANGED + AddrSpaceList.Append(this); } diff --git a/code/userprog/addrspace.h b/code/userprog/addrspace.h index a5169a9..bd44fdd 100644 --- a/code/userprog/addrspace.h +++ b/code/userprog/addrspace.h @@ -41,6 +41,7 @@ class AddrSpace:public dontcopythis // Dump program layout as SVG unsigned NumPages() { return numPages; } #ifdef CHANGED + int Threads; // count number of threads into address space int AllocateUserStack(); #endif private: diff --git a/code/userprog/userthread.cc b/code/userprog/userthread.cc index 8565913..014d574 100644 --- a/code/userprog/userthread.cc +++ b/code/userprog/userthread.cc @@ -7,7 +7,7 @@ static void StartUserThread( void * args ){ - + DEBUG('x', "Enter StartUserThread function\n"); // retrieve function and arguments // create a ThreadArgs_t struct and cast args content into it @@ -15,7 +15,7 @@ static void StartUserThread( void * args ){ ThreadArgs_t * cpy_args; cpy_args = (ThreadArgs_t *) args; int stack_addr = currentThread->space->AllocateUserStack(); - + // init register for (int i = 0; i < NumTotalRegs; i++ ) { machine->WriteRegister(i, 0); @@ -25,7 +25,7 @@ static void StartUserThread( void * args ){ machine->WriteRegister(PCReg, cpy_args->f); machine->WriteRegister (NextPCReg, machine->ReadRegister(PCReg) + 4); DEBUG('x',"PCReg: 0x%x, NextPCReg: 0x%x\n", cpy_args->f, cpy_args->f + 4); - + // init register 4: arguments machine->WriteRegister(4, cpy_args->arg); DEBUG('x',"Register 4: 0x%x\n", cpy_args->arg); @@ -34,6 +34,10 @@ static void StartUserThread( void * args ){ machine->WriteRegister(StackReg, stack_addr); DEBUG('x',"StackRegister: 0x%x\n", stack_addr); + // All our registers have values, we can desallocate our cpy_args + free(cpy_args); + cpy_args = NULL; + // run our thread machine->Run(); } @@ -41,24 +45,31 @@ static void StartUserThread( void * args ){ int do_ThreadCreate(int f, int arg){ DEBUG('x',"Enter do_ThreadCreate function\n"); - + // Initialize our structure we'll pass to StartUserThread ThreadArgs_t * args = (ThreadArgs_t *) malloc(sizeof(ThreadArgs_t)); args->f = f; args->arg = arg; - + // create a new Thread and start it Thread * newThread = new Thread("new thread"); + + // increment number of threads + currentThread->space->Threads++; + DEBUG('x', "Increase numbers of Threads:%d\n",currentThread->space->Threads); + newThread->space = currentThread->space; newThread->Start(StartUserThread, args); - + return 0; } void do_ThreadExit(){ DEBUG('x', "Enter do_ThreadExit function\n"); // TODO: what should we do with thread space? - // Probalely desallocate it... + // Probalely desallocate it... if no threads remain + currentThread->space->Threads--; + DEBUG('x', "Decrease numbers of Threads:%d\n",currentThread->space->Threads); currentThread->Finish(); } #endif