# HG changeset patch # User Merten Sach # Date 1316598689 -7200 # Node ID 79bb48d7d93be62d1990d1c168be6fafd18fcd07 # Parent 2c8f3cf6c058af7cf21b0e05afc0d85f209b69d2 changed free back to request to master and bugfixes diff -r 2c8f3cf6c058 -r 79bb48d7d93b VMS.c --- a/VMS.c Mon Sep 19 18:43:08 2011 +0200 +++ b/VMS.c Wed Sep 21 11:51:29 2011 +0200 @@ -576,7 +576,7 @@ requestingPr->dataRetFromReq = newProbe; break; case interMasterReqst: - sendInterMasterReqst(semReq->receiverID, + VMS__sendInterMasterReqst(semReq->receiverID, (InterMasterReqst*)semReq->data); break; default: @@ -665,7 +665,7 @@ { //Note, this is running in the master InterVMSCoreReqst *shutdownReqst = VMS__malloc(sizeof(InterVMSCoreReqst)); shutdownReqst->secondReqType = shutdownVP; - sendInterMasterReqst(coreIdx, (InterMasterReqst*)shutdownReqst); + VMS__sendInterMasterReqst(coreIdx, (InterMasterReqst*)shutdownReqst); } } diff -r 2c8f3cf6c058 -r 79bb48d7d93b inter_VMS_requests.c --- a/inter_VMS_requests.c Mon Sep 19 18:43:08 2011 +0200 +++ b/inter_VMS_requests.c Wed Sep 21 11:51:29 2011 +0200 @@ -2,7 +2,7 @@ #include "inter_VMS_requests.h" -void sendInterMasterReqst(int receiverID, InterMasterReqst* request) +void VMS__sendInterMasterReqst(int receiverID, InterMasterReqst* request) { request->reqType = destVMSCore; request->obsolete = 0; diff -r 2c8f3cf6c058 -r 79bb48d7d93b inter_VMS_requests.h --- a/inter_VMS_requests.h Mon Sep 19 18:43:08 2011 +0200 +++ b/inter_VMS_requests.h Wed Sep 21 11:51:29 2011 +0200 @@ -68,7 +68,7 @@ * Send inter master request. The request structure has to be malloced itself. * The sending VP will free the structure when the request is handled. */ - void sendInterMasterReqst(int receiverID, InterMasterReqst* request); + void VMS__sendInterMasterReqst(int receiverID, InterMasterReqst* request); #endif /* _MASTER_REQ_H */ diff -r 2c8f3cf6c058 -r 79bb48d7d93b inter_VMS_requests_handler.c --- a/inter_VMS_requests_handler.c Mon Sep 19 18:43:08 2011 +0200 +++ b/inter_VMS_requests_handler.c Wed Sep 21 11:51:29 2011 +0200 @@ -11,6 +11,7 @@ #include "ProcrContext.h" #include "inter_VMS_requests.h" #include "vmalloc.h" +#include @@ -22,7 +23,8 @@ inline void handleTransferFree( InterVMSCoreReqst *masterReq, VirtProcr *masterPr ) { - VMS__free( masterReq->freePtr ); + assert(((MallocPrologAllocated*)masterReq->freePtr-1)->procrID == masterPr->coreAnimatedBy); + VMS__free( masterReq->freePtr); } diff -r 2c8f3cf6c058 -r 79bb48d7d93b vmalloc.c --- a/vmalloc.c Mon Sep 19 18:43:08 2011 +0200 +++ b/vmalloc.c Wed Sep 21 11:51:29 2011 +0200 @@ -14,18 +14,25 @@ #include #include +#define NDEBUG +#include + #include "VMS.h" #include "vmalloc.h" #include "Histogram/Histogram.h" #define MAX_UINT64 0xFFFFFFFFFFFFFFFF + + inline void sendFreeReqst_lib(int receiverID, void *ptrToFree, VirtProcr *animPr); inline void sendFreeReqst_master(int receiverID, void *ptrToFree); +void VMS__check_free_list(MallocArrays *freeLists); + //A MallocProlog is a head element if the HigherInMem variable is NULL //A Chunk is free if the prevChunkInFreeList variable is NULL @@ -54,14 +61,21 @@ removedChunk->nextChunkInFreeList->prevChunkInFreeList = (MallocProlog*)container; + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); + if(*container == NULL) { if(containerIdx < 64) + { + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); freeLists->bigChunksSearchVector[0] &= ~((uint64)1 << containerIdx); + } else + { + assert((freeLists->bigChunksSearchVector[1] & ((uint64)1 << (containerIdx-64))) != 0); freeLists->bigChunksSearchVector[1] &= ~((uint64)1 << (containerIdx-64)); + } } - return removedChunk; } @@ -103,14 +117,21 @@ //The last element in the list points to the container. If the container points //to NULL the container is empty - if(*((void**)(chunk->prevChunkInFreeList)) == NULL && getChunkSize(chunk) >= BIG_LOWER_BOUND); + if(((*((void**)(chunk->prevChunkInFreeList))) == NULL) && (getChunkSize(chunk) >= BIG_LOWER_BOUND)) { + assert((*((void**)(chunk->prevChunkInFreeList))) == NULL); //Find the approppiate container because we do not know it uint64 containerIdx = ((uintptr_t)chunk->prevChunkInFreeList - (uintptr_t)freeLists->bigChunks) >> 3; if(containerIdx < (uint64)64) + { + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); freeLists->bigChunksSearchVector[0] &= ~((uint64)1 << containerIdx); + } if(containerIdx < 128 && containerIdx >=64) + { + assert((freeLists->bigChunksSearchVector[1] & ((uint64)1 << (containerIdx-64))) != 0); freeLists->bigChunksSearchVector[1] &= ~((uint64)1 << (containerIdx-64)); + } } } @@ -183,7 +204,7 @@ } containerIdx += 64; } - containerIdx--; + containerIdx--; // ffsl index starts at 1 foundChunk = removeChunk(freeLists, containerIdx); @@ -199,6 +220,8 @@ freeLists->bigChunksSearchVector[0] |= ((uint64)1 << containerIdx); else freeLists->bigChunksSearchVector[1] |= ((uint64)1 << (containerIdx-64)); + assert(freeLists->bigChunks[containerIdx] == foundChunk); + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); foundChunk = newChunk; } @@ -280,6 +303,7 @@ addIntervalToHist( startStamp, endStamp, _VMSMasterEnv->mallocTimeHist ); #endif //======================================================================== + assert(getChunkSize((MallocProlog*)returnChunk)>=sizeRequested); //skip over the prolog by adding its size to the pointer return return returnChunk + 1; @@ -334,8 +358,8 @@ InterVMSCoreReqst *freeReqst = VMS__malloc(sizeof(InterVMSCoreReqst)); freeReqst->freePtr = ptrToFree; freeReqst->secondReqType = transfer_free_ptr; - - sendInterMasterReqst(receiverID, (InterMasterReqst*)freeReqst); + + VMS__sendInterMasterReqst(receiverID, (InterMasterReqst*)freeReqst); } /* @@ -357,6 +381,18 @@ VMS__send_VMSSem_request( (void*)&reqData, animPr ); } +void VMS__check_free_list(MallocArrays *freeLists) +{ + int idx; + for(idx=0; idx< freeLists->containerCount; idx++) + { + if(freeLists->bigChunks[idx]) + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << idx)) != 0); + if((freeLists->bigChunksSearchVector[0] & ((uint64)1 << idx))) + assert(freeLists->bigChunks[idx] != NULL); + } +} + /* * This is sequential code, meant to only be called from the Master, not from * any slave VPs. @@ -411,7 +447,8 @@ freeLists->bigChunksSearchVector[0] |= (uint64)1 << containerIdx; else freeLists->bigChunksSearchVector[1] |= (uint64)1 << (containerIdx-64); - } + assert((freeLists->bigChunksSearchVector[0] & (uint64)1 << containerIdx) != 0); + } //============================= MEASUREMENT STUFF ======================== #ifdef MEAS__TIME_MALLOC @@ -457,7 +494,7 @@ firstChunk->nextLowerInMem = NULL; firstChunk->nextHigherInMem = (MallocProlog*)((uintptr_t)firstChunk + - MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE - sizeof(MallocProlog*)); + MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE - sizeof(MallocProlog)); firstChunk->nextChunkInFreeList = NULL; //previous element in the queue is the container firstChunk->prevChunkInFreeList = (MallocProlog*)&freeLists->bigChunks[container-2]; @@ -465,9 +502,15 @@ freeLists->bigChunks[container-2] = firstChunk; //Insert into bit search list if(container <= 65) + { freeLists->bigChunksSearchVector[0] = ((uint64)1 << (container-2)); + freeLists->bigChunksSearchVector[1] = 0; + } else + { + freeLists->bigChunksSearchVector[0] = 0; freeLists->bigChunksSearchVector[1] = ((uint64)1 << (container-66)); + } //Create dummy chunk to mark the top of stack this is of course //never freed