folly: fix sysMembarrier() with newer kernel headers
[folly.git] / folly / portability / Memory.cpp
1 /*
2  * Copyright 2017 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <folly/portability/Memory.h>
18
19 #include <folly/portability/Config.h>
20 #include <folly/portability/Malloc.h>
21
22 #include <errno.h>
23
24 namespace folly {
25 namespace detail {
26 #if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || \
27     (defined(__ANDROID__) && (__ANDROID_API__ > 15)) ||   \
28     (defined(__APPLE__) &&                                \
29      (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6 ||    \
30       __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0))
31
32 // Use posix_memalign, but mimic the behaviour of memalign
33 void* aligned_malloc(size_t size, size_t align) {
34   void* ptr = nullptr;
35   int rc = posix_memalign(&ptr, align, size);
36   if (rc == 0) {
37     return ptr;
38   }
39   errno = rc;
40   return nullptr;
41 }
42
43 void aligned_free(void* aligned_ptr) {
44   free(aligned_ptr);
45 }
46 #elif defined(_WIN32)
47
48 void* aligned_malloc(size_t size, size_t align) {
49   return _aligned_malloc(size, align);
50 }
51
52 void aligned_free(void* aligned_ptr) {
53   _aligned_free(aligned_ptr);
54 }
55 #else
56
57 void* aligned_malloc(size_t size, size_t align) {
58   return memalign(align, size);
59 }
60
61 void aligned_free(void* aligned_ptr) {
62   free(aligned_ptr);
63 }
64 #endif
65 } // namespace detail
66 } // namespace folly