15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/aligned_memory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <malloc.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* AlignedAlloc(size_t size, size_t alignment) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(size, 0U); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(alignment & (alignment - 1), 0U); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(alignment % sizeof(void*), 0U); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* ptr = NULL; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(COMPILER_MSVC) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = _aligned_malloc(size, alignment); 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Android technically supports posix_memalign(), but does not expose it in 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// the current version of the library headers used by Chrome. Luckily, 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// memalign() on Android returns pointers which can safely be used with 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// free(), so we can use it instead. Issue filed to document this: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/android/issues/detail?id=35391 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_ANDROID) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = memalign(alignment, size); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (posix_memalign(&ptr, alignment, size)) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = NULL; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since aligned allocations may fail for non-memory related reasons, force a 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crash if we encounter a failed allocation; maintaining consistent behavior 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a normal allocation failure in Chrome. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ptr) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "If you crashed here, your aligned allocation is incorrect: " 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "size=" << size << ", alignment=" << alignment; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sanity check alignment just to be safe. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(reinterpret_cast<uintptr_t>(ptr) & (alignment - 1), 0U); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ptr; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 47