/* * Copyright 2019 The libgav1 Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIBGAV1_SRC_UTILS_MEMORY_H_ #define LIBGAV1_SRC_UTILS_MEMORY_H_ #if defined(__ANDROID__) || defined(_MSC_VER) || defined(__MINGW32__) #include <malloc.h> #endif #include <cerrno> #include <cstddef> #include <cstdint> #include <cstdlib> #include <cstring> #include <memory> #include <new> namespace libgav1 { enum { … }; // AlignedAlloc, AlignedFree // // void* AlignedAlloc(size_t alignment, size_t size); // Allocate aligned memory. // |alignment| must be a power of 2. // Unlike posix_memalign(), |alignment| may be smaller than sizeof(void*). // Unlike aligned_alloc(), |size| does not need to be a multiple of // |alignment|. // The returned pointer should be freed by AlignedFree(). // // void AlignedFree(void* aligned_memory); // Free aligned memory. #if defined(_MSC_VER) || defined(__MINGW32__) inline void* AlignedAlloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); } inline void AlignedFree(void* aligned_memory) { _aligned_free(aligned_memory); } #else // !(defined(_MSC_VER) || defined(__MINGW32__)) inline void* AlignedAlloc(size_t alignment, size_t size) { … } inline void AlignedFree(void* aligned_memory) { … } #endif // defined(_MSC_VER) || defined(__MINGW32__) inline void Memset(uint8_t* const dst, int value, size_t count) { … } inline void Memset(uint16_t* const dst, int value, size_t count) { … } inline void Memset(int16_t* const dst, int value, size_t count) { … } struct MallocDeleter { … }; struct AlignedDeleter { … }; AlignedUniquePtr; // Allocates aligned memory for an array of |count| elements of type T. template <typename T> inline AlignedUniquePtr<T> MakeAlignedUniquePtr(size_t alignment, size_t count) { … } // A base class with custom new and delete operators. The exception-throwing // new operators are deleted. The "new (std::nothrow)" form must be used. // // The new operators return nullptr if the requested size is greater than // 0x40000000 bytes (1 GB). TODO(wtc): Make the maximum allocable memory size // a compile-time configuration macro. // // See https://en.cppreference.com/w/cpp/memory/new/operator_new and // https://en.cppreference.com/w/cpp/memory/new/operator_delete. // // NOTE: The allocation and deallocation functions are static member functions // whether the keyword 'static' is used or not. struct Allocable { … }; // A variant of Allocable that forces allocations to be aligned to // kMaxAlignment bytes. This is intended for use with classes that use // alignas() with this value. C++17 aligned new/delete are used if available, // otherwise we use AlignedAlloc/Free. struct MaxAlignedAllocable { … }; } // namespace libgav1 #endif // LIBGAV1_SRC_UTILS_MEMORY_H_