blob: b6c85160d178e779e05a9ab84efc27dbd0e01e78 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DIAGNOSTICS_WILCO_DTC_SUPPORTD_SERVICE_UTIL_H_
#define DIAGNOSTICS_WILCO_DTC_SUPPORTD_SERVICE_UTIL_H_
#include <initializer_list>
#include <base/barrier_closure.h>
#include <base/run_loop.h>
namespace diagnostics {
// Creates a RunLoop with a BarrierClosure and calls the ShutDown method
// on the passed-in |services|.
// ShutDown will be called in the order in which the |services| are provided.
// The caller is responsible for this order.
//
// Note: Do not call this function if your code is utilizing a RunLoop already.
template <typename... Services>
void ShutDownServicesInRunLoop(Services*... services) {
CHECK(!base::RunLoop::IsRunningOnCurrentThread());
base::RunLoop run_loop;
const base::Closure barrier_closure =
base::BarrierClosure(sizeof...(services), run_loop.QuitClosure());
// Braced initializer lists guarantee the execution of clauses from left to
// right [dcl.init.list 8.5.4.4].
// TODO(rbock, b/157435783): Once we have C++17, replace this with a proper
// fold expression.
(void)std::initializer_list<int>{
(services->ShutDown(base::OnceClosure(barrier_closure)), 0)...};
run_loop.Run();
}
} // namespace diagnostics
#endif // DIAGNOSTICS_WILCO_DTC_SUPPORTD_SERVICE_UTIL_H_