33e044fb16
Previously, DM destroyed a large number of non-trivial objects at shutdown time. Because no shutdown order is promised across translation units by the standard, this can lead to bugs which only reproduce capriciously, at the whim of the linker. http://go/totw/110#the-fix-safe-initialization-no-destruction "Destruction issues are usually solved by defining your static data in such a way that the destructor never runs. The most common way to do this is to heap allocate the static object - pointers don't have destructors." http://go/cstyle#decision_on_destruction "Global and static variables that use dynamic initialization or have non-trivial destructors create complexity that can easily lead to hard- to-find bugs. Dynamic initialization is not ordered across translation units, and neither is destruction (except that destruction happens in reverse order of initialization). When one initialization refers to another variable with static storage duration, it is possible that this causes an object to be accessed before its lifetime has begun (or after its lifetime has ended). Moreover, when a program starts threads that are not joined at exit, those threads may attempt to access objects after their lifetime has ended if their destructor has already run." Change-Id: I54eedcd813295a23923deb925b0ca2adfff69f7d Reviewed-on: https://skia-review.googlesource.com/c/skia/+/297872 Auto-Submit: John Stiles <johnstiles@google.com> Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Mike Klein <mtklein@google.com> |
||
---|---|---|
.. | ||
DM.cpp | ||
DMGpuTestProcs.cpp | ||
DMJsonWriter.cpp | ||
DMJsonWriter.h | ||
DMSrcSink.cpp | ||
DMSrcSink.h |