From patchwork Fri Nov 8 04:22:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?UnlubiBXdSAo5ZCz6IKy5oGpKQ==?= X-Patchwork-Id: 2294 Return-Path: Received: from mailgw01.mediatek.com (unknown [210.61.82.183]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 98E4461373 for ; Fri, 8 Nov 2019 05:22:43 +0100 (CET) X-UUID: 2807a044bbe7423a968ff0bb323d5b5a-20191108 DomainKey-Signature: a=rsa-sha1; q=dns; c=simple; s=DK; d=mediatek.com; h=X-UUID:From:Subject:Thread-Topic:Thread-Index:Date:Message-ID:Accept-Language:Content-Language:X-MS-Has-Attach:X-MS-TNEF-Correlator:x-dg-ref:x-ms-exchange-transport-fromentityheader:x-originating-ip:Content-Type:MIME-Version; b=C569qrZ7Wg06jbOjsEQnqfn+KOuMY4lvpSc3bzCwU8l9w64ZrJqaksRALwby7JupCnSyZyJ5gqfVp8MQKDqXXbPMRk6dd7UO7e/rc8GY3vt31Pac6+1zy51kbqAZY4241vqcTpcoHk5770uAzck3NIDr7sHrHoiOSWW7t2TUbRU=; X-UUID: 2807a044bbe7423a968ff0bb323d5b5a-20191108 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1405119247; Fri, 08 Nov 2019 12:22:36 +0800 Received: from mtkmbs07n1.mediatek.inc (172.21.101.16) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Fri, 8 Nov 2019 12:22:33 +0800 Received: from mtkmbs07n1.mediatek.inc ([fe80::70f1:d3df:c909:49f2]) by mtkmbs07n1.mediatek.inc ([fe80::70f1:d3df:c909:49f2%18]) with mapi id 15.00.1395.000; Fri, 8 Nov 2019 12:22:33 +0800 From: =?big5?b?UnlubiBXdSAop2SofK6mKQ==?= To: "libcamera-devel@lists.libcamera.org" Thread-Topic: [PATCH 1/1] libcamera: replaced Meyer's singleton Thread-Index: AdWV7BDaGrd3SKe3QCCnzy8M3pI6Yw== Date: Fri, 8 Nov 2019 04:22:33 +0000 Message-ID: <39c4470d6fa04c17828f49a9afc8ffd9@mtkmbs07n1.mediatek.inc> Accept-Language: en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: x-dg-ref: PG1ldGE+PGF0IG5tPSJib2R5Lmh0bWwiIHA9ImM6XHVzZXJzXG10azEwMDExXGFwcGRhdGFccm9hbWluZ1wwOWQ4NDliNi0zMmQzLTRhNDAtODVlZS02Yjg0YmEyOWUzNWJcbXNnc1xtc2ctNjFiNjVjYzYtMDFkZi0xMWVhLTljZDQtNWNmMzcwNjRlYjA1XGFtZS10ZXN0XDYxYjY1Y2M4LTAxZGYtMTFlYS05Y2Q0LTVjZjM3MDY0ZWIwNWJvZHkuaHRtbCIgc3o9Ijk1OTciIHQ9IjEzMjE3NjYwNTUyNjk5NzQ3OCIgaD0iYWEyY1hkdlZzR3hwMVhXaElOU0hjU283NDgwPSIgaWQ9IiIgYmw9IjAiIGJvPSIxIi8+PC9tZXRhPg== x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [172.21.101.239] MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 08 Nov 2019 12:14:59 +0100 Subject: [libcamera-devel] [PATCH 1/1] libcamera: replaced Meyer's singleton X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Nov 2019 04:22:44 -0000 Hi there, I found a Meyer’s singleton in IPAManager, basically Meyer’s singleton is supposed to be removed since it causes some unexpected exceptions in Android platforms while destroying the process. I replaced it by std::call_once and std::unique_ptr, here is the patch, please kindly help to review it, thanks :-) Rynn. From 7efdb2e21263ff559cda8af3ec49721967ba8c60 Mon Sep 17 00:00:00 2001 From: Rynn Wu Date: Fri, 8 Nov 2019 12:05:55 +0800 Subject: [PATCH] libcamera: replaced Meyer's singleton Since destroying order of Meyer's singleton is not guarantee and there were some unexpected behaviors in Android platforms, it's better to replace it by other ways. Change-Id: Id2da20ea641f580cb3566f034cc9958bc391eac7 Signed-off-by: Rynn Wu --- src/libcamera/include/ipa_manager.h | 8 ++++++++ src/libcamera/ipa_manager.cpp | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) } +std::unique_ptr> IPAManager::singleton_; +std::once_flag IPAManager:: singletonFlag_; + /** * \brief Retrieve the IPA manager instance * @@ -90,8 +94,12 @@ IPAManager::~IPAManager() */ IPAManager *IPAManager::instance() { - static IPAManager ipaManager; - return &ipaManager; + std::call_once(IPAManager::singletonFlag_, [](){ + /* never release, give an empty customized deleter */ + IPAManager::singleton_ = std::unique_ptr>( + new IPAManager, [](IPAManager*){}); + }); + return IPAManager::singleton_.get(); } /** -- 2.18.0 diff --git a/src/libcamera/include/ipa_manager.h b/src/libcamera/include/ipa_manager.h index 126f8ba..edaedf9 100644 --- a/src/libcamera/include/ipa_manager.h +++ b/src/libcamera/include/ipa_manager.h @@ -7,6 +7,9 @@ #ifndef __LIBCAMERA_IPA_MANAGER_H__ #define __LIBCAMERA_IPA_MANAGER_H__ +#include +#include +#include #include #include @@ -33,6 +36,11 @@ private: ~IPAManager(); int addDir(const char *libDir); + +private: + static std::unique_ptr> singleton_; + static std::once_flag singletonFlag_; + }; } /* namespace libcamera */ diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp index f3180c0..8f60be4 100644 --- a/src/libcamera/ipa_manager.cpp +++ b/src/libcamera/ipa_manager.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -79,6 +80,9 @@ IPAManager::~IPAManager() delete module;