<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:新細明體;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@新細明體";
panose-1:2 2 5 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi there,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I replaced it by std::call_once and std::unique_ptr, here is the patch, please kindly help to review it, thanks :-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Rynn.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">From 7efdb2e21263ff559cda8af3ec49721967ba8c60 Mon Sep 17 00:00:00 2001<o:p></o:p></p>
<p class="MsoNormal">From: Rynn Wu <rynn.wu@mediatek.com><o:p></o:p></p>
<p class="MsoNormal">Date: Fri, 8 Nov 2019 12:05:55 +0800<o:p></o:p></p>
<p class="MsoNormal">Subject: [PATCH] libcamera: replaced Meyer's singleton<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Since destroying order of Meyer's singleton is not guarantee and<o:p></o:p></p>
<p class="MsoNormal">there were some unexpected behaviors in Android platforms, it's better<o:p></o:p></p>
<p class="MsoNormal">to replace it by other ways.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Change-Id: Id2da20ea641f580cb3566f034cc9958bc391eac7<o:p></o:p></p>
<p class="MsoNormal">Signed-off-by: Rynn Wu <rynn.wu@mediatek.com><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">src/libcamera/include/ipa_manager.h | 8 ++++++++<o:p></o:p></p>
<p class="MsoNormal">src/libcamera/ipa_manager.cpp | 12 ++++++++++--<o:p></o:p></p>
<p class="MsoNormal">2 files changed, 18 insertions(+), 2 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/src/libcamera/include/ipa_manager.h b/src/libcamera/include/ipa_manager.h<o:p></o:p></p>
<p class="MsoNormal">index 126f8ba..edaedf9 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/src/libcamera/include/ipa_manager.h<o:p></o:p></p>
<p class="MsoNormal">+++ b/src/libcamera/include/ipa_manager.h<o:p></o:p></p>
<p class="MsoNormal">@@ -7,6 +7,9 @@<o:p></o:p></p>
<p class="MsoNormal">#ifndef __LIBCAMERA_IPA_MANAGER_H__<o:p></o:p></p>
<p class="MsoNormal">#define __LIBCAMERA_IPA_MANAGER_H__<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+#include <functional><o:p></o:p></p>
<p class="MsoNormal">+#include <memory><o:p></o:p></p>
<p class="MsoNormal">+#include <mutex><o:p></o:p></p>
<p class="MsoNormal">#include <vector><o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #include <ipa/ipa_interface.h><o:p></o:p></p>
<p class="MsoNormal">@@ -33,6 +36,11 @@ private:<o:p></o:p></p>
<p class="MsoNormal"> ~IPAManager();<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> int addDir(const char *libDir);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+private:<o:p></o:p></p>
<p class="MsoNormal">+ static std::unique_ptr<IPAManager, std::function<void(IPAManager*)>> singleton_;<o:p></o:p></p>
<p class="MsoNormal">+ static std::once_flag singletonFlag_;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> } /* namespace libcamera */<o:p></o:p></p>
<p class="MsoNormal">diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp<o:p></o:p></p>
<p class="MsoNormal">index f3180c0..8f60be4 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/src/libcamera/ipa_manager.cpp<o:p></o:p></p>
<p class="MsoNormal">+++ b/src/libcamera/ipa_manager.cpp<o:p></o:p></p>
<p class="MsoNormal">@@ -9,6 +9,7 @@<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #include <algorithm><o:p></o:p></p>
<p class="MsoNormal">#include <dirent.h><o:p></o:p></p>
<p class="MsoNormal">+#include <memory><o:p></o:p></p>
<p class="MsoNormal">#include <string.h><o:p></o:p></p>
<p class="MsoNormal">#include <sys/types.h><o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -79,6 +80,9 @@ IPAManager::~IPAManager()<o:p></o:p></p>
<p class="MsoNormal"> delete module;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+std::unique_ptr<IPAManager, std::function<void(IPAManager*)>> IPAManager::singleton_;<o:p></o:p></p>
<p class="MsoNormal">+std::once_flag IPAManager:: singletonFlag_;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">/**<o:p></o:p></p>
<p class="MsoNormal"> * \brief Retrieve the IPA manager instance<o:p></o:p></p>
<p class="MsoNormal"> *<o:p></o:p></p>
<p class="MsoNormal">@@ -90,8 +94,12 @@ IPAManager::~IPAManager()<o:p></o:p></p>
<p class="MsoNormal"> */<o:p></o:p></p>
<p class="MsoNormal">IPAManager *IPAManager::instance()<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">- static IPAManager ipaManager;<o:p></o:p></p>
<p class="MsoNormal">- return &ipaManager;<o:p></o:p></p>
<p class="MsoNormal">+ std::call_once(IPAManager::singletonFlag_, [](){<o:p></o:p></p>
<p class="MsoNormal">+ /* never release, give an empty customized deleter */<o:p></o:p></p>
<p class="MsoNormal">+ IPAManager::singleton_ = std::unique_ptr<IPAManager, std::function<void(IPAManager*)>>(<o:p></o:p></p>
<p class="MsoNormal">+ new IPAManager, [](IPAManager*){});<o:p></o:p></p>
<p class="MsoNormal">+ });<o:p></o:p></p>
<p class="MsoNormal">+ return IPAManager::singleton_.get();<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> /**<o:p></o:p></p>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal">2.18.0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>
<!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ********************
The information contained in this e-mail message (including any
attachments) may be confidential, proprietary, privileged, or otherwise
exempt from disclosure under applicable laws. It is intended to be
conveyed only to the designated recipient(s). Any use, dissemination,
distribution, printing, retaining or copying of this e-mail (including its
attachments) by unintended recipient(s) is strictly prohibited and may
be unlawful. If you are not an intended recipient of this e-mail, or believe
that you have received this e-mail in error, please notify the sender
immediately (by replying to this e-mail), delete any and all copies of
this e-mail (including any attachments) from your system, and do not
disclose the content of this e-mail to any other person. Thank you!
</pre><!--}-->