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