/* Allocate aligned memory (heap) starting on page boundary */ static unsigned char * my_memalign(int length, unsigned char ** wrkBuffp, const struct opts_t * op) { size_t psz; unsigned char * res; #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) psz = sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */ #elif defined(SG_LIB_WIN32) psz = win_pagesize(); #else psz = 4096; /* give up, pick likely figure */ #endif #ifdef HAVE_POSIX_MEMALIGN { int err; void * wp = NULL; err = posix_memalign(&wp, psz, length); if (err || (NULL == wp)) { pr2serr("posix_memalign: error [%d], out of memory?\n", err); return NULL; } memset(wp, 0, length); if (wrkBuffp) *wrkBuffp = (unsigned char *)wp; res = (unsigned char *)wp; if (op->verbose > 3) pr2serr("%s: posix, len=%d, wrkBuffp=%p, psz=%d, rp=%p\n", __func__, length, (void *)*wrkBuffp, (int)psz, (void *)res); return res; } #else { unsigned char * wrkBuff; wrkBuff = (unsigned char*)calloc(length + psz, 1); if (NULL == wrkBuff) { if (wrkBuffp) *wrkBuffp = NULL; return NULL; } else if (wrkBuffp) *wrkBuffp = wrkBuff; res = (unsigned char *)(((uintptr_t)wrkBuff + psz - 1) & (~(psz - 1))); if (op->verbose > 3) pr2serr("%s: hack, len=%d, wrkBuffp=%p, psz=%d, rp=%p\n", __func__, length, (void *)*wrkBuffp, (int)psz, (void *)res); return res; } #endif }
/* Allocate aligned memory (heap) starting on page boundary */ static unsigned char * my_memalign(int length, unsigned char ** wrkBuffp) { size_t psz; #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) psz = sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */ #elif defined(SG_LIB_WIN32) psz = win_pagesize(); #else psz = 4096; /* give up, pick likely figure */ #endif #ifdef HAVE_POSIX_MEMALIGN { int err; void * wp = NULL; err = posix_memalign(&wp, psz, length); if (err || (NULL == wp)) { fprintf(stderr, "posix_memalign: error [%d], out of memory?\n", err); return NULL; } memset(wp, 0, length); if (wrkBuffp) *wrkBuffp = (unsigned char *)wp; return (unsigned char *)wp; } #else { unsigned char * wrkBuff; wrkBuff = (unsigned char*)calloc(length + psz, 1); if (NULL == wrkBuff) { if (wrkBuffp) *wrkBuffp = NULL; return NULL; } else if (wrkBuffp) *wrkBuffp = wrkBuff; return (unsigned char *)(((uintptr_t)wrkBuff + psz - 1) & (~(psz - 1))); } #endif }