blob: ec05733a977589235f7e8e9a08b9d25dda63ce23 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/common/surfaces/scoped_surface_id_allocator.h"
#include <utility>
#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
namespace viz {
ScopedSurfaceIdAllocator::ScopedSurfaceIdAllocator(
base::OnceCallback<void()> allocation_task)
: allocation_task_(std::move(allocation_task)) {}
ScopedSurfaceIdAllocator::ScopedSurfaceIdAllocator(
ParentLocalSurfaceIdAllocator* allocator,
base::OnceCallback<void()> allocation_task)
: allocator_(allocator), allocation_task_(std::move(allocation_task)) {
// If you hit this DCHECK, it is because you are attempting to allow multiple
// suppressions to be in flight at the same time.
DCHECK(!allocator->is_allocation_suppressed_);
allocator->is_allocation_suppressed_ = true;
}
ScopedSurfaceIdAllocator::ScopedSurfaceIdAllocator(
ScopedSurfaceIdAllocator&& other)
: allocator_(std::move(other.allocator_)),
allocation_task_(std::move(other.allocation_task_)) {
other.allocator_ = nullptr;
DCHECK(other.allocation_task_.is_null());
}
ScopedSurfaceIdAllocator& ScopedSurfaceIdAllocator::operator=(
ScopedSurfaceIdAllocator&& other) {
ScopedSurfaceIdAllocator temp(std::move(other));
swap(*this, temp);
return *this;
}
ScopedSurfaceIdAllocator::~ScopedSurfaceIdAllocator() {
if (allocator_) {
DCHECK(allocator_->is_allocation_suppressed_);
allocator_->is_allocation_suppressed_ = false;
}
if (allocation_task_)
std::move(allocation_task_).Run();
}
void swap(ScopedSurfaceIdAllocator& first, ScopedSurfaceIdAllocator& second) {
using std::swap; // to enable ADL
swap(first.allocator_, second.allocator_);
swap(first.allocation_task_, second.allocation_task_);
}
} // namespace viz