/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2013-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#pragma once
-#include <folly/Traits.h>
-#include <folly/functional/Invoke.h>
-
+#include <cassert>
+#include <cerrno>
#include <cstddef>
#include <cstdlib>
#include <exception>
#include <type_traits>
#include <utility>
+#include <folly/Traits.h>
+#include <folly/functional/Invoke.h>
+#include <folly/portability/Config.h>
+#include <folly/portability/Malloc.h>
+
namespace folly {
+#if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || \
+ (defined(__ANDROID__) && (__ANDROID_API__ > 15)) || \
+ (defined(__APPLE__) && \
+ (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 || \
+ __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0))
+
+inline void* aligned_malloc(size_t size, size_t align) {
+ // use posix_memalign, but mimic the behaviour of memalign
+ void* ptr = nullptr;
+ int rc = posix_memalign(&ptr, align, size);
+ return rc == 0 ? (errno = 0, ptr) : (errno = rc, nullptr);
+}
+
+inline void aligned_free(void* aligned_ptr) {
+ free(aligned_ptr);
+}
+
+#elif defined(_WIN32)
+
+inline void* aligned_malloc(size_t size, size_t align) {
+ return _aligned_malloc(size, align);
+}
+
+inline void aligned_free(void* aligned_ptr) {
+ _aligned_free(aligned_ptr);
+}
+
+#else
+
+inline void* aligned_malloc(size_t size, size_t align) {
+ return memalign(align, size);
+}
+
+inline void aligned_free(void* aligned_ptr) {
+ free(aligned_ptr);
+}
+
+#endif
+
/**
* For exception safety and consistency with make_shared. Erase me when
* we have std::make_unique().