1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2020 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi
17*6467f958SSadaf Ebrahimi #ifndef HARNESS_ALLOC_H_
18*6467f958SSadaf Ebrahimi #define HARNESS_ALLOC_H_
19*6467f958SSadaf Ebrahimi
20*6467f958SSadaf Ebrahimi #if defined(__linux__) || defined(linux) || defined(__APPLE__)
21*6467f958SSadaf Ebrahimi #if defined(__ANDROID__)
22*6467f958SSadaf Ebrahimi #include <malloc.h>
23*6467f958SSadaf Ebrahimi #else
24*6467f958SSadaf Ebrahimi #include <stdlib.h>
25*6467f958SSadaf Ebrahimi #endif
26*6467f958SSadaf Ebrahimi #endif
27*6467f958SSadaf Ebrahimi
28*6467f958SSadaf Ebrahimi #if defined(__MINGW32__)
29*6467f958SSadaf Ebrahimi #include "mingw_compat.h"
30*6467f958SSadaf Ebrahimi #endif
31*6467f958SSadaf Ebrahimi
align_malloc(size_t size,size_t alignment)32*6467f958SSadaf Ebrahimi inline void* align_malloc(size_t size, size_t alignment)
33*6467f958SSadaf Ebrahimi {
34*6467f958SSadaf Ebrahimi #if defined(_WIN32) && defined(_MSC_VER)
35*6467f958SSadaf Ebrahimi return _aligned_malloc(size, alignment);
36*6467f958SSadaf Ebrahimi #elif defined(__linux__) || defined(linux) || defined(__APPLE__)
37*6467f958SSadaf Ebrahimi void* ptr = NULL;
38*6467f958SSadaf Ebrahimi #if defined(__ANDROID__)
39*6467f958SSadaf Ebrahimi ptr = memalign(alignment, size);
40*6467f958SSadaf Ebrahimi if (ptr) return ptr;
41*6467f958SSadaf Ebrahimi #else
42*6467f958SSadaf Ebrahimi if (alignment < sizeof(void*))
43*6467f958SSadaf Ebrahimi {
44*6467f958SSadaf Ebrahimi alignment = sizeof(void*);
45*6467f958SSadaf Ebrahimi }
46*6467f958SSadaf Ebrahimi if (0 == posix_memalign(&ptr, alignment, size)) return ptr;
47*6467f958SSadaf Ebrahimi #endif
48*6467f958SSadaf Ebrahimi return NULL;
49*6467f958SSadaf Ebrahimi #elif defined(__MINGW32__)
50*6467f958SSadaf Ebrahimi return __mingw_aligned_malloc(size, alignment);
51*6467f958SSadaf Ebrahimi #else
52*6467f958SSadaf Ebrahimi #error "Please add support OS for aligned malloc"
53*6467f958SSadaf Ebrahimi #endif
54*6467f958SSadaf Ebrahimi }
55*6467f958SSadaf Ebrahimi
align_free(void * ptr)56*6467f958SSadaf Ebrahimi inline void align_free(void* ptr)
57*6467f958SSadaf Ebrahimi {
58*6467f958SSadaf Ebrahimi #if defined(_WIN32) && defined(_MSC_VER)
59*6467f958SSadaf Ebrahimi _aligned_free(ptr);
60*6467f958SSadaf Ebrahimi #elif defined(__linux__) || defined(linux) || defined(__APPLE__)
61*6467f958SSadaf Ebrahimi return free(ptr);
62*6467f958SSadaf Ebrahimi #elif defined(__MINGW32__)
63*6467f958SSadaf Ebrahimi return __mingw_aligned_free(ptr);
64*6467f958SSadaf Ebrahimi #else
65*6467f958SSadaf Ebrahimi #error "Please add support OS for aligned free"
66*6467f958SSadaf Ebrahimi #endif
67*6467f958SSadaf Ebrahimi }
68*6467f958SSadaf Ebrahimi
69*6467f958SSadaf Ebrahimi #endif // #ifndef HARNESS_ALLOC_H_
70