aconfig: move cache_ as a memeber

provider_ object relies on cache_ vector to be alive, but the order
of destruction between these objects at exit are not guaranteed.
This can lead to crash at the exit especially on ASAN build.
By putting cache_ as a member it is guaranteed that cache_ is not
destructed until provider_ is destructed.

Test: m ; m AconfigDemoActivity
Test: atest aconfig.test
Test: observe no crash on _hwasan build
Change-Id: If9e23e99c501bf8f06fcab003622948b9e730352
This commit is contained in:
Wonsik Kim 2023-11-17 16:23:08 -08:00
parent ca355c09a2
commit d4d952f9d2
3 changed files with 7 additions and 15 deletions

View file

@ -151,12 +151,9 @@ mod tests {
#ifdef __cplusplus
#include <memory>
#include <vector>
namespace com::android::aconfig::test {
extern std::vector<int8_t> cache_;
class flag_provider_interface {
public:
virtual ~flag_provider_interface() = default;
@ -359,6 +356,7 @@ void com_android_aconfig_test_reset_flags();
const PROD_SOURCE_FILE_EXPECTED: &str = r#"
#include "com_android_aconfig_test.h"
#include <server_configurable_flags/get_flags.h>
#include <vector>
namespace com::android::aconfig::test {
@ -407,10 +405,10 @@ namespace com::android::aconfig::test {
return cache_[2];
}
private:
std::vector<int8_t> cache_ = std::vector<int8_t>(3, -1);
};
std::vector<int8_t> cache_ = std::vector<int8_t>(3, -1);
std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>();
}

View file

@ -18,16 +18,9 @@
#ifdef __cplusplus
#include <memory>
{{ if not for_test- }}
#include <vector>
{{ -endif }}
namespace {cpp_namespace} \{
{{ if not for_test- }}
extern std::vector<int8_t> cache_;
{{ -endif }}
class flag_provider_interface \{
public:
virtual ~flag_provider_interface() = default;

View file

@ -5,6 +5,8 @@
{{ if for_test }}
#include <unordered_map>
#include <string>
{{ -else- }}
#include <vector>
{{ endif }}
namespace {cpp_namespace} \{
@ -69,16 +71,15 @@ namespace {cpp_namespace} \{
{{ -endif }}
}
{{ endfor }}
private:
std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1);
};
std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1);
{{ -endif }}
std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>();
}