/* * Allocates chunk of memory. * Filters out invalid sizes. * Rounds the size up to the next multiple of 4. * Obtains a chunk of at least the desired size. */ PmReturn_t heap_getChunk(uint16_t requestedsize, uint8_t **r_pchunk) { PmReturn_t retval; uint16_t adjustedsize; /* Ensure size request is valid */ if (requestedsize > HEAP_MAX_LIVE_CHUNK_SIZE) { PM_RAISE(retval, PM_RET_EX_MEM); return retval; } else if (requestedsize < HEAP_MIN_CHUNK_SIZE) { requestedsize = HEAP_MIN_CHUNK_SIZE; } /* * Round up the size to a multiple of 4 bytes. * This maintains alignment on 32-bit platforms (required). */ adjustedsize = ((requestedsize + 3) & ~3); /* Attempt to get a chunk */ retval = heap_getChunkImpl(adjustedsize, r_pchunk); #ifdef HAVE_GC /* Perform GC if out of memory, gc is enabled and not in native session */ if ((retval == PM_RET_EX_MEM) && (pmHeap.auto_gc == C_TRUE) && (gVmGlobal.nativeframe.nf_active == C_FALSE)) { retval = heap_gcRun(); PM_RETURN_IF_ERROR(retval); /* Attempt to get a chunk */ retval = heap_getChunkImpl(adjustedsize, r_pchunk); } #endif /* HAVE_GC */ /* Ensure that the pointer is 4-byte aligned */ if (retval == PM_RET_OK) { C_ASSERT(((intptr_t)*r_pchunk & 3) == 0); } return retval; }
/* * Allocates chunk of memory. * Filters out invalid sizes. * Rounds the size up to the next multiple of 4. * Obtains a chunk of at least the desired size. */ PmReturn_t heap_getChunk(uint16_t requestedsize, uint8_t **r_pchunk) { PmReturn_t retval; uint16_t adjustedsize; /* Ensure size request is valid */ if (requestedsize > HEAP_MAX_CHUNK_SIZE) { PM_RAISE(retval, PM_RET_EX_MEM); return retval; } if (requestedsize < HEAP_MIN_CHUNK_SIZE) { requestedsize = HEAP_MIN_CHUNK_SIZE; } /* * Round up the size to a multiple of 4 bytes. * This maintains alignment on 32-bit platforms (required). */ adjustedsize = ((requestedsize + 3) & ~3); /* Attempt to get a chunk */ retval = heap_getChunkImpl(adjustedsize, r_pchunk); /* Perform GC if out of memory and auto-gc is enabled */ if ((retval == PM_RET_EX_MEM) && (pmHeap.auto_gc == C_TRUE)) { retval = heap_gcRun(); PM_RETURN_IF_ERROR(retval); /* Attempt to get a chunk */ retval = heap_getChunkImpl(adjustedsize, r_pchunk); } /* Ensure that the pointer is 4-byte aligned */ if (retval == PM_RET_OK) { C_ASSERT(((int)*r_pchunk & 3) == 0); } return retval; }