/* Reserves vmem from vmem tracker and allocates memory by calling malloc/calloc */ static void *gp_malloc_internal(int64 sz1, int64 sz2, bool ismalloc) { int64 sz = sz1; void *ret = NULL; if(!ismalloc) sz *= sz2; Assert(sz >=0 && sz <= 0x7fffffff); MemoryAllocationStatus stat = VmemTracker_ReserveVmem(sz); if (MemoryAllocation_Success == stat) { if(ismalloc) { ret = malloc(sz); } else { ret = calloc(sz1, sz2); } #ifdef USE_TEST_UTILS if (gp_simex_init && gp_simex_run && gp_simex_class == SimExESClass_OOM && ret) { SimExESSubClass subclass = SimEx_CheckInject(); if (subclass == SimExESSubClass_OOM_ReturnNull) { free(ret); ret = NULL; } } #endif if(!ret) { VmemTracker_ReleaseVmem(sz); gp_failed_to_alloc(MemoryFailure_SystemMemoryExhausted, 0, sz); return NULL; } return ret; } gp_failed_to_alloc(stat, 0, sz); return NULL; }
/* * Check for simulation of network error */ static bool injectErrorNet() { if (gp_simex_init && gp_simex_run && gp_simex_class == SimExESClass_SysError) { SimExESSubClass subclass = SimEx_CheckInject(); if (subclass == SimExESSubClass_SysError_Net) { errno = NET_ERRNO; return true; } } return false; }
/* Reallocates memory, respecting vmem protection, if enabled */ void *gp_realloc(void *ptr, int64 sz, int64 newsz) { Assert(!gp_mp_inited || MemoryProtection_IsOwnerThread()); void *ret = NULL; if(!gp_mp_inited) { ret = realloc(ptr, newsz); return ret; } int64 size_diff = (newsz - sz); if(newsz <= sz || MemoryAllocation_Success == VmemTracker_ReserveVmem(size_diff)) { ret = realloc(ptr, newsz); #ifdef USE_TEST_UTILS if (gp_simex_init && gp_simex_run && gp_simex_class == SimExESClass_OOM && ret) { SimExESSubClass subclass = SimEx_CheckInject(); if (subclass == SimExESSubClass_OOM_ReturnNull) { free(ret); ret = NULL; } } #endif if(!ret) { Assert(0 < size_diff); VmemTracker_ReleaseVmem(size_diff); gp_failed_to_alloc(MemoryFailure_SystemMemoryExhausted, 0, sz); return NULL; } return ret; } return NULL; }