diff options
author | Fredrik Gustafsson <[email protected]> | 2013-09-30 17:02:55 +0200 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-09-30 17:02:55 +0200 |
commit | e0ecc86e35475b434efa6cccba44074ca1040b7a (patch) | |
tree | 13f1622acea6b0af4536eb739af58a351b1fb8bf /erts/emulator/sys/unix/sys.c | |
parent | e6b5ae09d292ee0251aab875be1d3245f260b493 (diff) | |
parent | abac2eda110a33d8310c0f9cc152d91de37f731d (diff) | |
download | otp-e0ecc86e35475b434efa6cccba44074ca1040b7a.tar.gz otp-e0ecc86e35475b434efa6cccba44074ca1040b7a.tar.bz2 otp-e0ecc86e35475b434efa6cccba44074ca1040b7a.zip |
Merge branch 'maint-r16' into maint
Conflicts:
erts/vsn.mk
Diffstat (limited to 'erts/emulator/sys/unix/sys.c')
-rw-r--r-- | erts/emulator/sys/unix/sys.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c index a7ea4b2490..fdc3167c62 100644 --- a/erts/emulator/sys/unix/sys.c +++ b/erts/emulator/sys/unix/sys.c @@ -2524,6 +2524,52 @@ void erts_sys_alloc_init(void) { } +#if ERTS_HAVE_ERTS_SYS_ALIGNED_ALLOC +void *erts_sys_aligned_alloc(UWord alignment, UWord size) +{ +#ifdef HAVE_POSIX_MEMALIGN + void *ptr = NULL; + int error; + ASSERT(alignment && (alignment & ~alignment) == 0); /* power of 2 */ + error = posix_memalign(&ptr, (size_t) alignment, (size_t) size); +#if HAVE_ERTS_MSEG + if (error || !ptr) { + erts_mseg_clear_cache(); + error = posix_memalign(&ptr, (size_t) alignment, (size_t) size); + } +#endif + if (error) { + errno = error; + return NULL; + } + if (!ptr) + errno = ENOMEM; + ASSERT(!ptr || (((UWord) ptr) & (alignment - 1)) == 0); + return ptr; +#else +# error "Missing erts_sys_aligned_alloc() implementation" +#endif +} + +void erts_sys_aligned_free(UWord alignment, void *ptr) +{ + ASSERT(alignment && (alignment & ~alignment) == 0); /* power of 2 */ + free(ptr); +} + +void *erts_sys_aligned_realloc(UWord alignment, void *ptr, UWord size, UWord old_size) +{ + void *new_ptr = erts_sys_aligned_alloc(alignment, size); + if (new_ptr) { + UWord copy_size = old_size < size ? old_size : size; + sys_memcpy(new_ptr, ptr, (size_t) copy_size); + erts_sys_aligned_free(alignment, ptr); + } + return new_ptr; +} + +#endif + void *erts_sys_alloc(ErtsAlcType_t t, void *x, Uint sz) { void *res = malloc((size_t) sz); |