blob: 662acabdf50b6b191a12e6759b17919c1560e33e [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_
12#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_
13
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000014// The functions declared here
15// 1) Allocates block of aligned memory.
16// 2) Re-calculates a pointer such that it is aligned to a higher or equal
17// address.
18// Note: alignment must be a power of two. The alignment is in bytes.
19
niklase@google.com470e71d2011-07-07 08:21:25 +000020#include <stddef.h>
21
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000022#include "system_wrappers/interface/scoped_ptr.h"
23
24namespace webrtc {
25
26// Returns a pointer to the first boundry of |alignment| bytes following the
27// address of |ptr|.
28// Note that there is no guarantee that the memory in question is available.
29// |ptr| has no requirements other than it can't be NULL.
30void* GetRightAlign(const void* ptr, size_t alignment);
31
32// Allocates memory of |size| bytes aligned on an |alignment| boundry.
33// The return value is a pointer to the memory. Note that the memory must
34// be de-allocated using AlignedFree.
35void* AlignedMalloc(size_t size, size_t alignment);
36// De-allocates memory created using the AlignedMalloc() API.
henrike@webrtc.org46d40732012-10-03 16:50:37 +000037void AlignedFree(void* mem_block);
38
39// Templated versions to facilitate usage of aligned malloc without casting
40// to and from void*.
41template<typename T>
42T* GetRightAlign(const T* ptr, size_t alignment) {
43 return reinterpret_cast<T*>(GetRightAlign(reinterpret_cast<const void*>(ptr),
44 alignment));
45}
46template<typename T>
47T* AlignedMalloc(size_t size, size_t alignment) {
48 return reinterpret_cast<T*>(AlignedMalloc(size, alignment));
49}
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000050
51// Scoped pointer to AlignedMalloc-memory.
52template<typename T>
53struct Allocator {
54 typedef scoped_ptr_malloc<T, AlignedFree> scoped_ptr_aligned;
55};
56
57} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000058
59#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_