diff options
Diffstat (limited to 'libprocessgroup')
-rw-r--r-- | libprocessgroup/Android.bp | 1 | ||||
-rw-r--r-- | libprocessgroup/cgroup_map.cpp | 6 | ||||
-rw-r--r-- | libprocessgroup/task_profiles.cpp | 6 |
3 files changed, 9 insertions, 4 deletions
diff --git a/libprocessgroup/Android.bp b/libprocessgroup/Android.bp index d97f09fad..07cbce987 100644 --- a/libprocessgroup/Android.bp +++ b/libprocessgroup/Android.bp @@ -45,5 +45,6 @@ cc_library { cflags: [ "-Wall", "-Werror", + "-Wexit-time-destructors", ], } diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp index 995162186..b3b497f68 100644 --- a/libprocessgroup/cgroup_map.cpp +++ b/libprocessgroup/cgroup_map.cpp @@ -336,8 +336,10 @@ CgroupMap::~CgroupMap() { } CgroupMap& CgroupMap::GetInstance() { - static CgroupMap instance; - return instance; + // Deliberately leak this object to avoid a race between destruction on + // process exit and concurrent access from another thread. + static auto* instance = new CgroupMap; + return *instance; } bool CgroupMap::LoadRcFile() { diff --git a/libprocessgroup/task_profiles.cpp b/libprocessgroup/task_profiles.cpp index f1fbcdebe..9362c0387 100644 --- a/libprocessgroup/task_profiles.cpp +++ b/libprocessgroup/task_profiles.cpp @@ -284,8 +284,10 @@ bool TaskProfile::ExecuteForTask(int tid) const { } TaskProfiles& TaskProfiles::GetInstance() { - static TaskProfiles instance; - return instance; + // Deliberately leak this object to avoid a race between destruction on + // process exit and concurrent access from another thread. + static auto* instance = new TaskProfiles; + return *instance; } TaskProfiles::TaskProfiles() { |