commit | 9118ac819a67b9da728a7b057bf0b3671102ebee | [log] [tgz] |
---|---|---|
author | Daniele Di Proietto <ddiproietto@google.com> | Wed Aug 02 14:47:29 2023 +0000 |
committer | Daniele Di Proietto <ddiproietto@google.com> | Wed Aug 02 14:55:28 2023 +0000 |
tree | 40c51c18b7023399e4d2070d10c654c607674bc8 | |
parent | e78b30d80b733d50944df18358efaae7cba6ea3f [diff] |
ipc: Remove wrong DeferredBase constructor. DeferredBase had a constructor that accepted a Deferred<T> and moved its callback to the new DeferredBase. The problem with moving an std::function is that what's left in the original is unspecified (but valid): a copy of the original callback could be stuck there and it could be called when the formal parameter (a copy) would be destroyed. With this commit, we use the non inline DeferredBase(DeferredBase&&) move constructor (it works, since Deferred<T> is a DeferredBase). There's actually already a comment in deferred.cc that explains that: ``` // Can't just use "= default" here because the default move operator for // std::function doesn't necessarily swap and hence can leave a copy of the // bind state around, which is undesirable. ``` Since the problem is based on unspecified behavior, we only managed to trigger it in CI in conjuction with https://r.android.com/2686526 This also seems to reduce the binary size of the libperfetto_c.so by a couple of kilobytes. Change-Id: I787cd4a5f1722f7c83492bd3581b2c9e8e7f56f0
Perfetto is a production-grade open-source stack for performance instrumentation and trace analysis. It offers services and libraries and for recording system-level and app-level traces, native + java heap profiling, a library for analyzing traces using SQL and a web-based UI to visualize and explore multi-GB traces.
See https://perfetto.dev/docs or the /docs/ directory for documentation.