blob: d89197ee04eca1a310738a48c8b9a2cdad02b9f5 [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 "src/ui/scenic/lib/utils/sequential_fence_signaller.h"
#include "src/lib/fxl/logging.h"
namespace utils {
void SequentialFenceSignaller::AddFence(zx::event fence, uint64_t sequence_number) {
if (sequence_number >= first_unfinished_sequence_number_) {
pending_fences_.push({sequence_number, std::move(fence)});
} else {
// Signal the fence immediately if its sequence number has already been
// marked finished.
fence.signal(0u, ZX_EVENT_SIGNALED);
}
}
void SequentialFenceSignaller::AddFences(fidl::VectorPtr<zx::event> fences,
uint64_t sequence_number) {
for (size_t i = 0; i < fences->size(); ++i) {
AddFence(std::move(fences->at(i)), sequence_number);
}
}
void SequentialFenceSignaller::SignalFencesUpToAndIncluding(uint64_t sequence_number) {
// Iterate through the pending fences until you hit something that is
// greater than |sequence_number|.
while (!pending_fences_.empty() && pending_fences_.top().sequence_number <= sequence_number) {
pending_fences_.top().fence.signal(0u, ZX_EVENT_SIGNALED);
pending_fences_.pop();
}
first_unfinished_sequence_number_ =
std::max(sequence_number + 1, first_unfinished_sequence_number_);
};
} // namespace utils