Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VMS_impls > VMS__MC_shared_impl
changeset 141:79bb48d7d93b DistributedMalloc2
changed free back to request to master and bugfixes
| author | Merten Sach <msach@mailbox.tu-berlin.de> |
|---|---|
| date | Wed, 21 Sep 2011 11:51:29 +0200 |
| parents | 2c8f3cf6c058 |
| children | e7cd1945c9b6 |
| files | VMS.c inter_VMS_requests.c inter_VMS_requests.h inter_VMS_requests_handler.c vmalloc.c |
| diffstat | 5 files changed, 57 insertions(+), 12 deletions(-) [+] |
line diff
1.1 --- a/VMS.c Mon Sep 19 18:43:08 2011 +0200 1.2 +++ b/VMS.c Wed Sep 21 11:51:29 2011 +0200 1.3 @@ -576,7 +576,7 @@ 1.4 requestingPr->dataRetFromReq = newProbe; 1.5 break; 1.6 case interMasterReqst: 1.7 - sendInterMasterReqst(semReq->receiverID, 1.8 + VMS__sendInterMasterReqst(semReq->receiverID, 1.9 (InterMasterReqst*)semReq->data); 1.10 break; 1.11 default: 1.12 @@ -665,7 +665,7 @@ 1.13 { //Note, this is running in the master 1.14 InterVMSCoreReqst *shutdownReqst = VMS__malloc(sizeof(InterVMSCoreReqst)); 1.15 shutdownReqst->secondReqType = shutdownVP; 1.16 - sendInterMasterReqst(coreIdx, (InterMasterReqst*)shutdownReqst); 1.17 + VMS__sendInterMasterReqst(coreIdx, (InterMasterReqst*)shutdownReqst); 1.18 } 1.19 1.20 }
2.1 --- a/inter_VMS_requests.c Mon Sep 19 18:43:08 2011 +0200 2.2 +++ b/inter_VMS_requests.c Wed Sep 21 11:51:29 2011 +0200 2.3 @@ -2,7 +2,7 @@ 2.4 #include "inter_VMS_requests.h" 2.5 2.6 2.7 -void sendInterMasterReqst(int receiverID, InterMasterReqst* request) 2.8 +void VMS__sendInterMasterReqst(int receiverID, InterMasterReqst* request) 2.9 { 2.10 request->reqType = destVMSCore; 2.11 request->obsolete = 0;
3.1 --- a/inter_VMS_requests.h Mon Sep 19 18:43:08 2011 +0200 3.2 +++ b/inter_VMS_requests.h Wed Sep 21 11:51:29 2011 +0200 3.3 @@ -68,7 +68,7 @@ 3.4 * Send inter master request. The request structure has to be malloced itself. 3.5 * The sending VP will free the structure when the request is handled. 3.6 */ 3.7 - void sendInterMasterReqst(int receiverID, InterMasterReqst* request); 3.8 + void VMS__sendInterMasterReqst(int receiverID, InterMasterReqst* request); 3.9 3.10 #endif /* _MASTER_REQ_H */ 3.11
4.1 --- a/inter_VMS_requests_handler.c Mon Sep 19 18:43:08 2011 +0200 4.2 +++ b/inter_VMS_requests_handler.c Wed Sep 21 11:51:29 2011 +0200 4.3 @@ -11,6 +11,7 @@ 4.4 #include "ProcrContext.h" 4.5 #include "inter_VMS_requests.h" 4.6 #include "vmalloc.h" 4.7 +#include <assert.h> 4.8 4.9 4.10 4.11 @@ -22,7 +23,8 @@ 4.12 inline void 4.13 handleTransferFree( InterVMSCoreReqst *masterReq, VirtProcr *masterPr ) 4.14 { 4.15 - VMS__free( masterReq->freePtr ); 4.16 + assert(((MallocPrologAllocated*)masterReq->freePtr-1)->procrID == masterPr->coreAnimatedBy); 4.17 + VMS__free( masterReq->freePtr); 4.18 } 4.19 4.20
5.1 --- a/vmalloc.c Mon Sep 19 18:43:08 2011 +0200 5.2 +++ b/vmalloc.c Wed Sep 21 11:51:29 2011 +0200 5.3 @@ -14,18 +14,25 @@ 5.4 #include <string.h> 5.5 #include <math.h> 5.6 5.7 +#define NDEBUG 5.8 +#include <assert.h> 5.9 + 5.10 #include "VMS.h" 5.11 #include "vmalloc.h" 5.12 #include "Histogram/Histogram.h" 5.13 5.14 #define MAX_UINT64 0xFFFFFFFFFFFFFFFF 5.15 5.16 + 5.17 + 5.18 inline void 5.19 sendFreeReqst_lib(int receiverID, void *ptrToFree, VirtProcr *animPr); 5.20 5.21 inline void 5.22 sendFreeReqst_master(int receiverID, void *ptrToFree); 5.23 5.24 +void VMS__check_free_list(MallocArrays *freeLists); 5.25 + 5.26 //A MallocProlog is a head element if the HigherInMem variable is NULL 5.27 //A Chunk is free if the prevChunkInFreeList variable is NULL 5.28 5.29 @@ -54,14 +61,21 @@ 5.30 removedChunk->nextChunkInFreeList->prevChunkInFreeList = 5.31 (MallocProlog*)container; 5.32 5.33 + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); 5.34 + 5.35 if(*container == NULL) 5.36 { 5.37 if(containerIdx < 64) 5.38 + { 5.39 + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); 5.40 freeLists->bigChunksSearchVector[0] &= ~((uint64)1 << containerIdx); 5.41 + } 5.42 else 5.43 + { 5.44 + assert((freeLists->bigChunksSearchVector[1] & ((uint64)1 << (containerIdx-64))) != 0); 5.45 freeLists->bigChunksSearchVector[1] &= ~((uint64)1 << (containerIdx-64)); 5.46 + } 5.47 } 5.48 - 5.49 return removedChunk; 5.50 } 5.51 5.52 @@ -103,14 +117,21 @@ 5.53 5.54 //The last element in the list points to the container. If the container points 5.55 //to NULL the container is empty 5.56 - if(*((void**)(chunk->prevChunkInFreeList)) == NULL && getChunkSize(chunk) >= BIG_LOWER_BOUND); 5.57 + if(((*((void**)(chunk->prevChunkInFreeList))) == NULL) && (getChunkSize(chunk) >= BIG_LOWER_BOUND)) 5.58 { 5.59 + assert((*((void**)(chunk->prevChunkInFreeList))) == NULL); 5.60 //Find the approppiate container because we do not know it 5.61 uint64 containerIdx = ((uintptr_t)chunk->prevChunkInFreeList - (uintptr_t)freeLists->bigChunks) >> 3; 5.62 if(containerIdx < (uint64)64) 5.63 + { 5.64 + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); 5.65 freeLists->bigChunksSearchVector[0] &= ~((uint64)1 << containerIdx); 5.66 + } 5.67 if(containerIdx < 128 && containerIdx >=64) 5.68 + { 5.69 + assert((freeLists->bigChunksSearchVector[1] & ((uint64)1 << (containerIdx-64))) != 0); 5.70 freeLists->bigChunksSearchVector[1] &= ~((uint64)1 << (containerIdx-64)); 5.71 + } 5.72 5.73 } 5.74 } 5.75 @@ -183,7 +204,7 @@ 5.76 } 5.77 containerIdx += 64; 5.78 } 5.79 - containerIdx--; 5.80 + containerIdx--; // ffsl index starts at 1 5.81 5.82 5.83 foundChunk = removeChunk(freeLists, containerIdx); 5.84 @@ -199,6 +220,8 @@ 5.85 freeLists->bigChunksSearchVector[0] |= ((uint64)1 << containerIdx); 5.86 else 5.87 freeLists->bigChunksSearchVector[1] |= ((uint64)1 << (containerIdx-64)); 5.88 + assert(freeLists->bigChunks[containerIdx] == foundChunk); 5.89 + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << containerIdx)) != 0); 5.90 foundChunk = newChunk; 5.91 } 5.92 5.93 @@ -280,6 +303,7 @@ 5.94 addIntervalToHist( startStamp, endStamp, _VMSMasterEnv->mallocTimeHist ); 5.95 #endif 5.96 //======================================================================== 5.97 + assert(getChunkSize((MallocProlog*)returnChunk)>=sizeRequested); 5.98 5.99 //skip over the prolog by adding its size to the pointer return 5.100 return returnChunk + 1; 5.101 @@ -334,8 +358,8 @@ 5.102 InterVMSCoreReqst *freeReqst = VMS__malloc(sizeof(InterVMSCoreReqst)); 5.103 freeReqst->freePtr = ptrToFree; 5.104 freeReqst->secondReqType = transfer_free_ptr; 5.105 - 5.106 - sendInterMasterReqst(receiverID, (InterMasterReqst*)freeReqst); 5.107 + 5.108 + VMS__sendInterMasterReqst(receiverID, (InterMasterReqst*)freeReqst); 5.109 } 5.110 5.111 /* 5.112 @@ -357,6 +381,18 @@ 5.113 VMS__send_VMSSem_request( (void*)&reqData, animPr ); 5.114 } 5.115 5.116 +void VMS__check_free_list(MallocArrays *freeLists) 5.117 +{ 5.118 + int idx; 5.119 + for(idx=0; idx< freeLists->containerCount; idx++) 5.120 + { 5.121 + if(freeLists->bigChunks[idx]) 5.122 + assert((freeLists->bigChunksSearchVector[0] & ((uint64)1 << idx)) != 0); 5.123 + if((freeLists->bigChunksSearchVector[0] & ((uint64)1 << idx))) 5.124 + assert(freeLists->bigChunks[idx] != NULL); 5.125 + } 5.126 +} 5.127 + 5.128 /* 5.129 * This is sequential code, meant to only be called from the Master, not from 5.130 * any slave VPs. 5.131 @@ -411,7 +447,8 @@ 5.132 freeLists->bigChunksSearchVector[0] |= (uint64)1 << containerIdx; 5.133 else 5.134 freeLists->bigChunksSearchVector[1] |= (uint64)1 << (containerIdx-64); 5.135 - } 5.136 + assert((freeLists->bigChunksSearchVector[0] & (uint64)1 << containerIdx) != 0); 5.137 + } 5.138 5.139 //============================= MEASUREMENT STUFF ======================== 5.140 #ifdef MEAS__TIME_MALLOC 5.141 @@ -457,7 +494,7 @@ 5.142 5.143 firstChunk->nextLowerInMem = NULL; 5.144 firstChunk->nextHigherInMem = (MallocProlog*)((uintptr_t)firstChunk + 5.145 - MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE - sizeof(MallocProlog*)); 5.146 + MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE - sizeof(MallocProlog)); 5.147 firstChunk->nextChunkInFreeList = NULL; 5.148 //previous element in the queue is the container 5.149 firstChunk->prevChunkInFreeList = (MallocProlog*)&freeLists->bigChunks[container-2]; 5.150 @@ -465,9 +502,15 @@ 5.151 freeLists->bigChunks[container-2] = firstChunk; 5.152 //Insert into bit search list 5.153 if(container <= 65) 5.154 + { 5.155 freeLists->bigChunksSearchVector[0] = ((uint64)1 << (container-2)); 5.156 + freeLists->bigChunksSearchVector[1] = 0; 5.157 + } 5.158 else 5.159 + { 5.160 + freeLists->bigChunksSearchVector[0] = 0; 5.161 freeLists->bigChunksSearchVector[1] = ((uint64)1 << (container-66)); 5.162 + } 5.163 5.164 //Create dummy chunk to mark the top of stack this is of course 5.165 //never freed
