CCodecWatchdog: never destruct once constructed
Bug: 356820254
Test: presubmit
Flag: EXEMPT bugfix
Change-Id: If0c70ef504ee97e51be12324452e3182b56085ae
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index 373f86e..68f1dda 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -96,11 +96,14 @@
public:
static sp<CCodecWatchdog> getInstance() {
- static sp<CCodecWatchdog> instance(new CCodecWatchdog);
- static std::once_flag flag;
- // Call Init() only once.
- std::call_once(flag, Init, instance);
- return instance;
+ static sp<CCodecWatchdog> sInstance = [] {
+ sp<CCodecWatchdog> instance = new CCodecWatchdog;
+ // the instance should never get destructed
+ instance->incStrong((void *)CCodecWatchdog::getInstance);
+ instance->init();
+ return instance;
+ }();
+ return sInstance;
}
~CCodecWatchdog() = default;
@@ -146,11 +149,11 @@
private:
CCodecWatchdog() : mLooper(new ALooper) {}
- static void Init(const sp<CCodecWatchdog> &thiz) {
- ALOGV("Init");
- thiz->mLooper->setName("CCodecWatchdog");
- thiz->mLooper->registerHandler(thiz);
- thiz->mLooper->start();
+ void init() {
+ ALOGV("init");
+ mLooper->setName("CCodecWatchdog");
+ mLooper->registerHandler(this);
+ mLooper->start();
}
sp<ALooper> mLooper;