1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- // 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 "services/network/pending_callback_chain.h"
- #include "base/bind.h"
- namespace network {
- PendingCallbackChain::PendingCallbackChain(net::CompletionOnceCallback complete)
- : complete_(std::move(complete)) {}
- PendingCallbackChain::~PendingCallbackChain() {}
- net::CompletionOnceCallback PendingCallbackChain::CreateCallback() {
- return base::BindOnce(&PendingCallbackChain::CallbackComplete, this);
- }
- void PendingCallbackChain::AddResult(int result) {
- if (result == net::ERR_IO_PENDING)
- num_waiting_++;
- else
- SetResult(result);
- }
- int PendingCallbackChain::GetResult() const {
- if (num_waiting_ > 0)
- return net::ERR_IO_PENDING;
- return final_result_;
- }
- void PendingCallbackChain::CallbackComplete(int result) {
- DCHECK_GT(num_waiting_, 0);
- SetResult(result);
- num_waiting_--;
- if (num_waiting_ == 0)
- std::move(complete_).Run(final_result_);
- }
- void PendingCallbackChain::SetResult(int result) {
- DCHECK_NE(result, net::ERR_IO_PENDING);
- if (final_result_ == net::OK) {
- final_result_ = result;
- } else if (result != net::OK && result != final_result_) {
- // If we have two non-OK results, default to ERR_FAILED.
- final_result_ = net::ERR_FAILED;
- }
- }
- } // namespace network
|