comparison vmalloc.c @ 136:f1374d5dbb98

set currentMasterProcrID to 0 for corrent free on shutdown
author Merten Sach <msach@mailbox.tu-berlin.de>
date Fri, 16 Sep 2011 20:13:33 +0200
parents a9b72021f053
children 99343ffe1918
comparison
equal deleted inserted replaced
22:0877c22b1191 23:314cb94c95a0
12 #include <stdlib.h> 12 #include <stdlib.h>
13 #include <stdio.h> 13 #include <stdio.h>
14 14
15 #include "VMS.h" 15 #include "VMS.h"
16 #include "Histogram/Histogram.h" 16 #include "Histogram/Histogram.h"
17
18 inline void
19 sendFreeReqst_lib(int receiverID, void *ptrToFree, VirtProcr *animPr);
20
21 inline void
22 sendFreeReqst_master(int receiverID, void *ptrToFree);
17 23
18 /*Helper function 24 /*Helper function
19 *Insert a newly generated free chunk into the first spot on the free list. 25 *Insert a newly generated free chunk into the first spot on the free list.
20 * The chunk is cast as a MallocProlog, so the various pointers in it are 26 * The chunk is cast as a MallocProlog, so the various pointers in it are
21 * accessed with C's help -- and the size of the prolog is easily added to 27 * accessed with C's help -- and the size of the prolog is easily added to
68 VMS__malloc_on_core( size_t sizeRequested, int procrID) 74 VMS__malloc_on_core( size_t sizeRequested, int procrID)
69 { MallocProlog *foundElem = NULL, *currElem, *newElem; 75 { MallocProlog *foundElem = NULL, *currElem, *newElem;
70 MallocPrologAllocated *returnElem; 76 MallocPrologAllocated *returnElem;
71 ssize_t amountExtra, sizeConsumed,sizeOfFound; 77 ssize_t amountExtra, sizeConsumed,sizeOfFound;
72 uint32 foundElemIsTopOfHeap; 78 uint32 foundElemIsTopOfHeap;
73
74 printf("Malloc on core %d\n", procrID);
75 79
76 //============================= MEASUREMENT STUFF ======================== 80 //============================= MEASUREMENT STUFF ========================
77 #ifdef MEAS__TIME_MALLOC 81 #ifdef MEAS__TIME_MALLOC
78 int32 startStamp, endStamp; 82 int32 startStamp, endStamp;
79 saveLowTimeStampCountInto( startStamp ); 83 saveLowTimeStampCountInto( startStamp );
165 { 169 {
166 VMS__free_on_core(ptrToFree, _VMSMasterEnv->currentMasterProcrID); 170 VMS__free_on_core(ptrToFree, _VMSMasterEnv->currentMasterProcrID);
167 } 171 }
168 else 172 else
169 { 173 {
170 //Request from other Core 174 sendFreeReqst_master(chunk->procrID, ptrToFree);
175
171 } 176 }
172 } 177 }
173 178
174 /* 179 /*
175 * This free is called for the plugins. It decides whether the allocation of 180 * This free is called for the plugins. It decides whether the allocation of
178 */ 183 */
179 void 184 void
180 VMS__free_in_lib(void *ptrToFree, VirtProcr *VProc) 185 VMS__free_in_lib(void *ptrToFree, VirtProcr *VProc)
181 { 186 {
182 MallocPrologAllocated *chunk = (MallocPrologAllocated*)ptrToFree - 1; 187 MallocPrologAllocated *chunk = (MallocPrologAllocated*)ptrToFree - 1;
183 printf("Free from core %d for core %d\n", VProc->coreAnimatedBy, chunk->procrID);
184 if(chunk->procrID == VProc->coreAnimatedBy) 188 if(chunk->procrID == VProc->coreAnimatedBy)
185 { 189 {
186 VMS__free_on_core(ptrToFree, VProc->coreAnimatedBy); 190 VMS__free_on_core(ptrToFree, VProc->coreAnimatedBy);
187 } 191 }
188 else 192 else
189 { 193 {
190 //Request from other Core 194 sendFreeReqst_lib(chunk->procrID, ptrToFree, VProc);
191 } 195 }
192 } 196 }
197
198 /*
199 * This is called form a masterVP and request an free from a different masterVP.
200 * The free of the request structure is done after the request is handled.
201 */
202 inline void
203 sendFreeReqst_master(int receiverID, void *ptrToFree)
204 {
205 InterVMSCoreReqst *freeReqst = VMS__malloc(sizeof(InterVMSCoreReqst));
206 freeReqst->freePtr = ptrToFree;
207 freeReqst->secondReqType = transfer_free_ptr;
208
209 sendInterMasterReqst(receiverID, (InterMasterReqst*)freeReqst);
210 }
211
212 /*
213 * This is called if the free is called from the plugin. This requests an inter
214 * master request from his master.
215 */
216 inline void
217 sendFreeReqst_lib(int receiverID, void *ptrToFree, VirtProcr *animPr )
218 {
219 VMSSemReq reqData;
220 InterVMSCoreReqst *freeReqst = VMS__malloc(sizeof(InterVMSCoreReqst));
221 freeReqst->freePtr = ptrToFree;
222 freeReqst->secondReqType = transfer_free_ptr;
223
224 reqData.reqType = interMasterReqst;
225 reqData.receiverID = receiverID;
226 reqData.data = (void*)freeReqst;
227
228 VMS__send_VMSSem_request( (void*)&reqData, animPr );
229 }
193 230
194 /*This is sequential code -- only to be called from the Master 231 /*This is sequential code -- only to be called from the Master
195 * When free, subtract the size of prolog from pointer, then cast it to a 232 * When free, subtract the size of prolog from pointer, then cast it to a
196 * MallocProlog. Then check the nextLower and nextHigher chunks to see if 233 * MallocProlog. Then check the nextLower and nextHigher chunks to see if
197 * one or both are also free, and coalesce if so, and if neither free, then 234 * one or both are also free, and coalesce if so, and if neither free, then
365 void 402 void
366 VMS__free_in_ext( void *ptrToFree ) 403 VMS__free_in_ext( void *ptrToFree )
367 { 404 {
368 //just risk system-stack faults until get this figured out 405 //just risk system-stack faults until get this figured out
369 free( ptrToFree ); 406 free( ptrToFree );
370
371 //TODO: fix this -- so
372 } 407 }
373 408
374 409
375 /*Designed to be called from the main thread outside of VMS, during init 410 /*Designed to be called from the main thread outside of VMS, during init
376 */ 411 */
416 451
417 452
418 /*Designed to be called from the main thread outside of VMS, during cleanup 453 /*Designed to be called from the main thread outside of VMS, during cleanup
419 */ 454 */
420 void 455 void
421 VMS_ext__free_free_list( MallocProlog* freeListHeads[] ) 456 VMS_ext__free_free_list( MallocProlog* freeListHead)
422 { 457 {
423 //stashed a ptr to the one and only bug chunk malloc'd from OS in the 458 //stashed a ptr to the one and only bug chunk malloc'd from OS in the
424 // free list head's next lower in mem pointer 459 // free list head's next lower in mem pointer
425 int i; 460 free( freeListHead->nextLowerInMem );
426 for(i=0; i<NUM_CORES; i++)
427 {
428 free( freeListHeads[i]->nextLowerInMem );
429 }
430 //don't free the head -- it'll be in an array eventually -- free whole 461 //don't free the head -- it'll be in an array eventually -- free whole
431 // array when all the free lists linked from it have already been freed 462 // array when all the free lists linked from it have already been freed
432 } 463 }
433 464