1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/system_wrappers/interface/aligned_malloc.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if _WIN32
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <windows.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdint.h>
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
201d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
21c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/typedefs.h"
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
231d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.orgnamespace webrtc {
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns true if |size| and |alignment| are valid combinations.
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool CorrectUsage(size_t size, size_t alignment) {
271d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  scoped_ptr<char, AlignedFreeDeleter> scoped(
281d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org      static_cast<char*>(AlignedMalloc(size, alignment)));
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (scoped.get() == NULL) {
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uintptr_t scoped_address = reinterpret_cast<uintptr_t> (scoped.get());
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0u == scoped_address % alignment;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, GetRightAlign) {
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t size = 100;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t alignment = 32;
391d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  const size_t left_misalignment = 1;
401d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  scoped_ptr<char, AlignedFreeDeleter> scoped(
411d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org      static_cast<char*>(AlignedMalloc(size, alignment)));
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(scoped.get() != NULL);
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
441d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  const uintptr_t misaligned_address = aligned_address - left_misalignment;
451d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  const char* misaligned_ptr = reinterpret_cast<const char*>(
461d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org      misaligned_address);
471d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org  const char* realigned_ptr = GetRightAlign(misaligned_ptr, alignment);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(scoped.get(), realigned_ptr);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, IncorrectSize) {
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t incorrect_size = 0;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t alignment = 64;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(CorrectUsage(incorrect_size, alignment));
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, IncorrectAlignment) {
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t size = 100;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const size_t incorrect_alignment = 63;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_FALSE(CorrectUsage(size, incorrect_alignment));
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, AlignTo2Bytes) {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t size = 100;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t alignment = 2;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(CorrectUsage(size, alignment));
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, AlignTo32Bytes) {
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t size = 100;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t alignment = 32;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(CorrectUsage(size, alignment));
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(AlignedMalloc, AlignTo128Bytes) {
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t size = 100;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t alignment = 128;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(CorrectUsage(size, alignment));
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
801d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org
811d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org}  // namespace webrtc
821d2f5dcbb683b08a2c9ea229334c6baf8b377158andrew@webrtc.org
83