void MemoryPool_Extend( MemoryPool *memPool ) { int i = 0; char **newPool; assert( memPool ); memPool->numMemChunks++; memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks ); assert( memPool->chunks ); memPool->chunks[memPool->numMemChunks-1].memory = (char*)Memory_Alloc_Bytes_Unnamed( memPool->elementSize * memPool->delta, "int" ); memset( memPool->chunks[memPool->numMemChunks-1].memory, 0, memPool->elementSize * memPool->delta ); memPool->chunks[memPool->numMemChunks-1].numFree = memPool->delta; memPool->chunks[memPool->numMemChunks-1].maxFree = memPool->delta; newPool = (char**)Memory_Alloc_Bytes_Unnamed( sizeof(char*) * (memPool->numElements+memPool->delta), "char*" ); assert( newPool ); memcpy( newPool+memPool->delta, memPool->pool, sizeof(char*)*memPool->numElements ); for( i=0; i<memPool->delta; i++ ){ newPool[i] = &(memPool->chunks[memPool->numMemChunks-1].memory[i*memPool->elementSize]); } Memory_Free( memPool->pool ); memPool->pool = newPool; memPool->numElements+=memPool->delta; memPool->numElementsFree=memPool->delta; if( memPool->callbackFunc ){ memPool->callbackFunc( memPool->callbackFuncArg ); } }
void _RefinedRegionsGeometry_AddRefinedRegion( void* refinedRegionsGeometry, Index dim, double regionStart, double regionEnd, unsigned int refinementFactor ) { RefinedRegionsGeometry* self = (RefinedRegionsGeometry*)refinedRegionsGeometry; if ( self->refinedRegionCounts[dim] == self->refinedRegionSizes[dim] ) { self->refinedRegionSizes[dim] += self->refinedRegionDeltas[dim]; self->refinedRegions[dim] = Memory_Realloc( self->refinedRegions[dim], self->refinedRegionSizes[dim] * sizeof(RefinedRegion) ); } self->refinedRegions[dim][self->refinedRegionCounts[dim]].regionStart = regionStart; self->refinedRegions[dim][self->refinedRegionCounts[dim]].regionEnd = regionEnd; self->refinedRegions[dim][self->refinedRegionCounts[dim]].refinementFactor = refinementFactor; /* Following 2 values are set to zero until real vals calculated later */ self->refinedRegions[dim][self->refinedRegionCounts[dim]].numElements = 0; self->refinedRegions[dim][self->refinedRegionCounts[dim]].elementLength = 0.0; self->refinedRegionCounts[dim]++; }
void _ParticleShadowSync_BeginReceiveOfIncomingParticles( ParticleCommHandler* pCommHandler ) { ParticleShadowSync *self = (ParticleShadowSync*)pCommHandler; ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout ); ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo; long incomingViaShadowArrayBytes = 0; Neighbour_Index nbr_I; Processor_Index proc_I; int i = 0; char* recvLocation = NULL; self->particlesArrivingFromNbrShadowCellsHandles = Memory_Alloc_Array_Unnamed( MPI_Request*, procNbrInfo->procNbrCnt ); for( i=0; i<procNbrInfo->procNbrCnt; i++ ){ self->particlesArrivingFromNbrShadowCellsHandles[i] = Memory_Alloc_Array_Unnamed( MPI_Request, 1 ); } self->swarm->shadowParticles = Memory_Realloc( self->swarm->shadowParticles, self->swarm->particleExtensionMgr->finalSize*(self->swarm->shadowParticleCount) ); recvLocation = (char*)self->swarm->shadowParticles; for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) { if ( self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] != 0 ) { proc_I = procNbrInfo->procNbrTbl[nbr_I]; /* start non-blocking recv of particles */ incomingViaShadowArrayBytes = self->swarm->particleExtensionMgr->finalSize * self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I]; /*printf( "receiving %ld bytes\n", incomingViaShadowArrayBytes );*/ (void)MPI_Irecv( recvLocation, incomingViaShadowArrayBytes, MPI_BYTE, proc_I, SHADOW_PARTICLES, self->swarm->comm, self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] ); recvLocation += incomingViaShadowArrayBytes; } } }
void MemoryPool_Shrink( MemoryPool *memPool ) { int i = 0; Bool deleteFlag = (Bool)0; int chunkIdx = 0; char **newPool = (char**)0; int eCounter = 0; assert( memPool ); if( memPool->numElementsFree < memPool->delta ){ return; } for( i=0; i<memPool->numMemChunks; i++ ) { if( memPool->chunks[i].numFree == memPool->chunks[i].maxFree ){ deleteFlag = True; chunkIdx = i; break; } } if( deleteFlag ){ int numObjs = 0; numObjs = memPool->chunks[chunkIdx].maxFree*memPool->elementSize; newPool = (char**)Memory_Alloc_Bytes_Unnamed( sizeof(char*) * (memPool->numElements-memPool->chunks[chunkIdx].maxFree), "char*" ); eCounter = 0; for( i=0; i<memPool->numElements; i++ ){ if( (memPool->pool[i] >= memPool->chunks[chunkIdx].memory) && (memPool->pool[i] < (memPool->chunks[chunkIdx].memory+numObjs)) ){ } else{ newPool[eCounter++] = memPool->pool[i]; } } Memory_Free( memPool->pool ); memPool->pool = newPool; memPool->numElements-=memPool->chunks[chunkIdx].maxFree; memPool->numElementsFree-=memPool->chunks[chunkIdx].maxFree; Memory_Free( memPool->chunks[chunkIdx].memory ); memPool->chunks[chunkIdx].memory = (char*)NULL; if( chunkIdx == (memPool->numMemChunks-1) ){ memPool->numMemChunks--; if( memPool->numMemChunks>0 ){ memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks ); assert( memPool->chunks ); } } else{ memcpy( &(memPool->chunks[chunkIdx]), &(memPool->chunks[chunkIdx+1]), sizeof(MemChunk)*(memPool->numMemChunks - (chunkIdx+1)) ); memPool->numMemChunks--; memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks ); assert( memPool->chunks ); } } if( memPool->callbackFunc ){ memPool->callbackFunc( memPool->callbackFuncArg ); } }