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