//===--- Malloc.h - Aligned malloc interface --------------------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file provides an implementation of C11 aligned_alloc(3) for platforms // that don't have it yet, using posix_memalign(3). // //===----------------------------------------------------------------------===// #ifndef SWIFT_BASIC_MALLOC_H #define SWIFT_BASIC_MALLOC_H #include #if defined(_WIN32) #include #else #include #endif namespace swift { inline void *AlignedAlloc(size_t size, size_t align) { #if defined(_WIN32) void *r = _aligned_malloc(size, align); assert(r && "_aligned_malloc failed"); #elif __STDC_VERSION__-0 >= 201112l // C11 supports aligned_alloc void *r = aligned_alloc(align, size); assert(r && "aligned_alloc failed"); #else // posix_memalign only accepts alignments greater than sizeof(void*). if (align < sizeof(void *)) align = sizeof(void *); void *r = nullptr; int res = posix_memalign(&r, align, size); assert(res == 0 && "posix_memalign failed"); (void)res; // Silence the unused variable warning. #endif return r; } inline void AlignedFree(void *p) { #if defined(_WIN32) _aligned_free(p); #else free(p); #endif } } // end namespace swift #endif // SWIFT_BASIC_MALLOC_H