blob: be2ecb0781b348164e567b510283d3bd67da17e7 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace {
struct Empty {};
struct StackAllocatedType {
STACK_ALLOCATED();
};
static_assert(!WTF::IsStackAllocatedType<Empty>::value,
"Failed to detect STACK_ALLOCATED macro.");
static_assert(WTF::IsStackAllocatedType<StackAllocatedType>::value,
"Failed to detect STACK_ALLOCATED macro.");
} // namespace
namespace WTF {
void AtomicReadMemcpy(void* to, const void* from, size_t bytes) {
// Check alignment of |to| and |from|
DCHECK_EQ(0u, reinterpret_cast<size_t>(to) & (sizeof(size_t) - 1));
DCHECK_EQ(0u, reinterpret_cast<size_t>(from) & (sizeof(size_t) - 1));
size_t* sizet_to = reinterpret_cast<size_t*>(to);
const size_t* sizet_from = reinterpret_cast<const size_t*>(from);
for (; bytes >= sizeof(size_t);
bytes -= sizeof(size_t), ++sizet_to, ++sizet_from) {
*sizet_to = AsAtomicPtr(sizet_from)->load(std::memory_order_relaxed);
}
uint8_t* uint8t_to = reinterpret_cast<uint8_t*>(sizet_to);
const uint8_t* uint8t_from = reinterpret_cast<const uint8_t*>(sizet_from);
for (; bytes > 0; bytes -= sizeof(uint8_t), ++uint8t_to, ++uint8t_from) {
*uint8t_to = AsAtomicPtr(uint8t_from)->load(std::memory_order_relaxed);
}
DCHECK_EQ(0u, bytes);
}
void AtomicWriteMemcpy(void* to, const void* from, size_t bytes) {
// Check alignment of |to| and |from|
DCHECK_EQ(0u, reinterpret_cast<size_t>(to) & (sizeof(size_t) - 1));
DCHECK_EQ(0u, reinterpret_cast<size_t>(from) & (sizeof(size_t) - 1));
size_t* sizet_to = reinterpret_cast<size_t*>(to);
const size_t* sizet_from = reinterpret_cast<const size_t*>(from);
for (; bytes >= sizeof(size_t);
bytes -= sizeof(size_t), ++sizet_to, ++sizet_from) {
AsAtomicPtr(sizet_to)->store(*sizet_from, std::memory_order_relaxed);
}
uint8_t* uint8t_to = reinterpret_cast<uint8_t*>(sizet_to);
const uint8_t* uint8t_from = reinterpret_cast<const uint8_t*>(sizet_from);
for (; bytes > 0; bytes -= sizeof(uint8_t), ++uint8t_to, ++uint8t_from) {
AsAtomicPtr(uint8t_to)->store(*uint8t_from, std::memory_order_relaxed);
}
DCHECK_EQ(0u, bytes);
}
void AtomicMemzero(void* buf, size_t bytes) {
// Check alignment of |buf|
DCHECK_EQ(0u, reinterpret_cast<size_t>(buf) & (sizeof(size_t) - 1));
size_t* sizet_buf = reinterpret_cast<size_t*>(buf);
for (; bytes >= sizeof(size_t); bytes -= sizeof(size_t), ++sizet_buf) {
AsAtomicPtr(sizet_buf)->store(0, std::memory_order_relaxed);
}
uint8_t* uint8t_buf = reinterpret_cast<uint8_t*>(sizet_buf);
for (; bytes > 0; bytes -= sizeof(uint8_t), ++uint8t_buf) {
AsAtomicPtr(uint8t_buf)->store(0, std::memory_order_relaxed);
}
DCHECK_EQ(0u, bytes);
}
} // namespace WTF