absl::Cleanup is a helper to run arbitrary code when the absl::Cleanup
object goes out of scope, which is useful for executing cleanup code or
ensuring something always runs. The current //base equivalent is
base::ScopedClosureRunner, which executes a base::OnceClosure when the
runner object goes out of scope.
Compared to base::ScopedClosureRunner, there are several benefits to
using absl::Cleanup:
- works with capturing lambdas, which are often much more concise than
base::BindOnce()
- requires no heap allocations
- less impact on binary size since absl::Cleanup instantiates fewer
templates
This CL is part of a project-wide cleanup to migrate to absl::Cleanup
where appropriate. The general criteria for migrating usages of
base::ScopedCLosureRunner:
- The cleanup scoper must not escape block scope, e.g. it is not
returned from the function, passed to another function, or bound into
a callback.
- The cleanup scoper's type does not need to be named, e.g. the scoper
construction can use CTAD:
absl::Cleanup run_at_exit = [] { RestoreSettings(original); };
Note: having to write absl::Cleanup<decltype(lambda)> as a type is
often a sign that absl::Cleanup is not a good fit for how the code is
currently structured.
- The cleanup scoper is not simply running a base::OnceClosure.
Bug: 339492604
Change-Id: Ic09233219ede932a5b4d6890fe294e6dfef86e5f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5530333
Reviewed-by: Ayu Ishii <ayui@chromium.org>
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1298928}