From c3892a2fa787bb7bcf4f6aeebfcf85bdc94ce1e8 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Fri, 19 Nov 2021 16:52:57 +0100 Subject: [PATCH] TD2 II.4 Various fixes on stack allocation --- code/test/threadcreate.c | 2 +- code/userprog/addrspace.cc | 15 ++++++++------- code/userprog/addrspace.h | 2 +- code/userprog/userthread.cc | 5 +++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/code/test/threadcreate.c b/code/test/threadcreate.c index 7e57fe8..d19848e 100644 --- a/code/test/threadcreate.c +++ b/code/test/threadcreate.c @@ -14,7 +14,7 @@ void f(int c) { int main(){ int i; - for (i=65; i < 91; i++){ + for (i=65; i < 68; i++){ ThreadCreate(f, i); } // PutString("end of main()\n"); diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc index fa9784e..fd155a4 100644 --- a/code/userprog/addrspace.cc +++ b/code/userprog/addrspace.cc @@ -132,7 +132,7 @@ AddrSpace::AddrSpace (OpenFile * executable) pageTable[0].valid = FALSE; // Catch NULL dereference #ifdef CHANGED - int bitmapSize =( UserStacksAreaSize / UserStackSize)-1; + int bitmapSize =( UserStacksAreaSize / UserStackSize); DEBUG('x', "Initialise thread counter\n"); threads = 1; @@ -140,7 +140,7 @@ AddrSpace::AddrSpace (OpenFile * executable) semThreadsCounter = new Semaphore("AddrSpace_thread_counter", 1); semAllocateUserStack = new Semaphore("Stack Avaiable", 1); - DEBUG('x', "Initialize memory map size:%d", bitmapSize); + DEBUG('x', "Initialize memory map size:%d\n", bitmapSize); memoryMap = new BitMap(bitmapSize); memoryMap->Mark(0); #endif //CHANGED @@ -329,22 +329,23 @@ AddrSpace::AllocateUserStack() semAllocateUserStack->P(); bit = memoryMap->Find(); semAllocateUserStack->V(); + if ( bit == - 1 ) { DEBUG('x', "No slot avaible on User Stack\n"); return -1; } - int addr = memory - UserStackSize * bit; - DEBUG('x', "Allocate User Stack bit %d, addr:%x\n", bit, addr); + int addr = memory - (UserStackSize * bit); + DEBUG('x', "Allocate User Stack bit %d, addr:0x%x\n", bit, (int)addr); return addr; } void AddrSpace::DeAllocateUserStack(int addr){ int memory = numPages * PageSize; - int bit = (memory - addr) / UserStackSize; - DEBUG('x', "Deallocate User Stack bit %d, addr:%x\n", bit, addr); + int bit = ((memory - addr) / UserStackSize); + DEBUG('x', "Deallocate User Stack bit %d, addr:0x%x\n", bit, addr); semAllocateUserStack->P(); memoryMap->Clear(bit); - semAllocateUserStack->P(); + semAllocateUserStack->V(); } #endif diff --git a/code/userprog/addrspace.h b/code/userprog/addrspace.h index 617b37a..ea68b64 100644 --- a/code/userprog/addrspace.h +++ b/code/userprog/addrspace.h @@ -26,7 +26,7 @@ class Semaphore; #define UserStackSize 256 #endif //CHANGED -#define UserStacksAreaSize 1024 // increase this as necessary! +#define UserStacksAreaSize 4096 // increase this as necessary! class AddrSpace:public dontcopythis { diff --git a/code/userprog/userthread.cc b/code/userprog/userthread.cc index f2eb94e..3904fac 100644 --- a/code/userprog/userthread.cc +++ b/code/userprog/userthread.cc @@ -52,11 +52,12 @@ int do_ThreadCreate(int f, int arg){ args->arg = arg; // Check if we can allocate Stack for our son - int stackAddr = currentThread->space->AllocateUserStack(); - if ( stackAddr == -1 ) { + args->stackAddr = currentThread->space->AllocateUserStack(); + if ( args->stackAddr == -1 ) { fprintf(stderr, "Segmentation Fault - no space avaible on stack\n"); Exit(1); } + DEBUG('x',"Father found stack address: 0x%x\n", args->stackAddr); // create a new Thread and start it Thread * newThread = new Thread("new thread");