jvmfwk/inc/fwkutil.hxx                              |   20 +-----------
 jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx |    6 +--
 jvmfwk/source/elements.cxx                          |    2 -
 jvmfwk/source/framework.cxx                         |   32 ++++++++++----------
 jvmfwk/source/fwkbase.cxx                           |   18 +++++------
 jvmfwk/source/fwkutil.cxx                           |   28 +++++++++++++++++
 6 files changed, 59 insertions(+), 47 deletions(-)

New commits:
commit 1170db278db9f1067c05d5df95faf81c1ce861bc
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Mon Nov 15 21:44:42 2021 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Nov 16 12:29:38 2021 +0100

    rtl::Static->thread-safe static in jvmfwk
    
    Change-Id: I049148d82eb306e8ba7fdc9f0cc650f45b05da0c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125257
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/jvmfwk/inc/fwkutil.hxx b/jvmfwk/inc/fwkutil.hxx
index fdef421f664f..e76a92769fc1 100644
--- a/jvmfwk/inc/fwkutil.hxx
+++ b/jvmfwk/inc/fwkutil.hxx
@@ -24,8 +24,8 @@
 #include <sal/config.h>
 #include <sal/log.hxx>
 #include <rtl/bootstrap.hxx>
-#include <rtl/instance.hxx>
 #include <rtl/byteseq.hxx>
+#include <osl/mutex.hxx>
 
 namespace osl { class Mutex; }
 
@@ -40,23 +40,9 @@ OUString getLibraryLocation();
 /** provides a bootstrap class which already knows the values from the
     jvmfkwrc file.
 */
-struct Bootstrap :
-    public ::rtl::StaticWithInit< const rtl::Bootstrap *, Bootstrap > {
-        const rtl::Bootstrap * operator () () {
-            OUString sIni = getLibraryLocation() +
-#ifdef MACOSX
-                // For some reason the jvmfwk3rc file is traditionally in
-                // LIBO_URE_ETC_FOLDER
-                "/../" LIBO_URE_ETC_FOLDER
-#endif
-                SAL_CONFIGFILE("/jvmfwk3");
-            ::rtl::Bootstrap *  bootstrap = new ::rtl::Bootstrap(sIni);
-            SAL_INFO("jfw.level2", "Using configuration file " << sIni);
-            return bootstrap;
-        }
-};
+const rtl::Bootstrap * Bootstrap();
 
-struct FwkMutex: public ::rtl::Static<osl::Mutex, FwkMutex> {};
+osl::Mutex& FwkMutex();
 
 rtl::ByteSequence encodeBase16(const rtl::ByteSequence& rawData);
 rtl::ByteSequence decodeBase16(const rtl::ByteSequence& data);
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx 
b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
index 70d6e7888097..29de226211f1 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
@@ -48,7 +48,6 @@
 #include <osl/process.h>
 #include <osl/thread.hxx>
 #include <osl/file.hxx>
-#include <rtl/instance.hxx>
 #include <sal/log.hxx>
 #include <o3tl/char16_t2wchar_t.hxx>
 #include <setjmp.h>
@@ -100,8 +99,6 @@ using namespace jfw_plugin;
 
 namespace {
 
-struct PluginMutex: public ::rtl::Static<osl::Mutex, PluginMutex> {};
-
 #if defined(UNX) && !defined(ANDROID)
 OString getPluginJarPath(
     std::u16string_view sVendor,
@@ -616,10 +613,11 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
     JavaVM ** ppVm,
     JNIEnv ** ppEnv)
 {
+    static osl::Mutex aPluginMutex;
     assert(pInfo != nullptr);
     assert(ppVm != nullptr);
     assert(ppEnv != nullptr);
-    osl::MutexGuard guard(PluginMutex::get());
+    osl::MutexGuard guard(aPluginMutex);
     javaPluginError errorcode = javaPluginError::NONE;
 #ifdef MACOSX
     rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath( 
pInfo->sLocation );
diff --git a/jvmfwk/source/elements.cxx b/jvmfwk/source/elements.cxx
index f5bdce32696d..c48f942ef8e8 100644
--- a/jvmfwk/source/elements.cxx
+++ b/jvmfwk/source/elements.cxx
@@ -961,7 +961,7 @@ void 
MergedSettings::getVmParametersArray(std::vector<OUString> * parParams)
     const
 {
     assert(parParams != nullptr);
-    osl::MutexGuard guard(FwkMutex::get());
+    osl::MutexGuard guard(FwkMutex());
 
     *parParams = m_vmParams;
 }
diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx
index ad1f636f00d0..40bbf629a36f 100644
--- a/jvmfwk/source/framework.cxx
+++ b/jvmfwk/source/framework.cxx
@@ -58,7 +58,7 @@ javaFrameworkError 
jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI
     assert(pparInfo != nullptr);
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
 
         jfw::VendorSettings aVendorSettings;
         std::vector<std::unique_ptr<JavaInfo>> vecInfo;
@@ -137,7 +137,7 @@ javaFrameworkError jfw_startVM(
 
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
 
         //We keep this pointer so we can determine if a VM has already
         //been created.
@@ -298,7 +298,7 @@ javaFrameworkError 
jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         std::unique_ptr<JavaInfo> aCurrentInfo;
@@ -436,7 +436,7 @@ javaFrameworkError 
jfw_getSelectedJRE(std::unique_ptr<JavaInfo> *ppInfo)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
 
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
         {
@@ -480,7 +480,7 @@ javaFrameworkError 
jfw_getSelectedJRE(std::unique_ptr<JavaInfo> *ppInfo)
 
 bool jfw_isVMRunning()
 {
-    osl::MutexGuard guard(jfw::FwkMutex::get());
+    osl::MutexGuard guard(jfw::FwkMutex());
     return g_pJavaVM != nullptr;
 }
 
@@ -490,7 +490,7 @@ javaFrameworkError jfw_getJavaInfoByPath(OUString const & 
pPath, std::unique_ptr
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
 
         jfw::VendorSettings aVendorSettings;
 
@@ -526,7 +526,7 @@ javaFrameworkError jfw_setSelectedJRE(JavaInfo const *pInfo)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         //check if pInfo is the selected JRE
@@ -556,7 +556,7 @@ javaFrameworkError jfw_setEnabled(bool bEnabled)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
 
@@ -592,7 +592,7 @@ javaFrameworkError jfw_getEnabled(bool *pbEnabled)
     {
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         jfw::MergedSettings settings;
         *pbEnabled = settings.getEnabled();
     }
@@ -610,7 +610,7 @@ javaFrameworkError 
jfw_setVMParameters(std::vector<OUString> const & arOptions)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         jfw::NodeJava node(jfw::NodeJava::USER);
@@ -631,7 +631,7 @@ javaFrameworkError 
jfw_getVMParameters(std::vector<OUString> * parOptions)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
 
@@ -651,7 +651,7 @@ javaFrameworkError jfw_setUserClassPath(OUString const & 
pCp)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         jfw::NodeJava node(jfw::NodeJava::USER);
@@ -672,7 +672,7 @@ javaFrameworkError jfw_getUserClassPath(OUString * ppCP)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         const jfw::MergedSettings settings;
@@ -691,7 +691,7 @@ javaFrameworkError jfw_addJRELocation(OUString const & 
sLocation)
     javaFrameworkError errcode = JFW_E_NONE;
     try
     {
-        osl::MutexGuard guard(jfw::FwkMutex::get());
+        osl::MutexGuard guard(jfw::FwkMutex());
         if (jfw::getMode() == jfw::JFW_MODE_DIRECT)
             return JFW_E_DIRECT_MODE;
         jfw::NodeJava node(jfw::NodeJava::USER);
@@ -730,12 +730,12 @@ javaFrameworkError jfw_existJRE(const JavaInfo *pInfo, 
bool *exist)
 
 void jfw_lock()
 {
-    jfw::FwkMutex::get().acquire();
+    jfw::FwkMutex().acquire();
 }
 
 void jfw_unlock()
 {
-    jfw::FwkMutex::get().release();
+    jfw::FwkMutex().release();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/jvmfwk/source/fwkbase.cxx b/jvmfwk/source/fwkbase.cxx
index fc2223fd842e..0af34a443f3c 100644
--- a/jvmfwk/source/fwkbase.cxx
+++ b/jvmfwk/source/fwkbase.cxx
@@ -69,7 +69,7 @@ OString getVendorSettingsPath(OUString const & sURL)
 OUString getParam(OUString const & name)
 {
     OUString retVal;
-    bool b = Bootstrap::get()->getFrom(name, retVal);
+    bool b = Bootstrap()->getFrom(name, retVal);
     SAL_INFO(
         "jfw",
         "Using bootstrap parameter " << name << " = \"" << retVal << "\""
@@ -221,7 +221,7 @@ VersionInfo 
VendorSettings::getVersionInformation(std::u16string_view sVendor) c
     {
         OUString sName = UNO_JAVA_JFW_PARAMETER + OUString::number(i);
         OUString sValue;
-        if (Bootstrap::get()->getFrom(sName, sValue))
+        if (Bootstrap()->getFrom(sName, sValue))
         {
             OString sParam =
                 OUStringToOString(sValue, osl_getThreadTextEncoding());
@@ -250,7 +250,7 @@ OString BootParams::getClasspath()
 {
     OString sClassPath;
     OUString sCP;
-    if (Bootstrap::get()->getFrom( UNO_JAVA_JFW_CLASSPATH, sCP ))
+    if (Bootstrap()->getFrom( UNO_JAVA_JFW_CLASSPATH, sCP ))
     {
         sClassPath = OUStringToOString(sCP, PathEncoding());
         SAL_INFO(
@@ -260,7 +260,7 @@ OString BootParams::getClasspath()
     }
 
     OUString sEnvCP;
-    if (Bootstrap::get()->getFrom( UNO_JAVA_JFW_ENV_CLASSPATH, sEnvCP ))
+    if (Bootstrap()->getFrom( UNO_JAVA_JFW_ENV_CLASSPATH, sEnvCP ))
     {
         char * pCp = getenv("CLASSPATH");
         if (pCp)
@@ -279,7 +279,7 @@ OString BootParams::getClasspath()
 OUString BootParams::getVendorSettings()
 {
     OUString sVendor;
-    if (Bootstrap::get()->getFrom(UNO_JAVA_JFW_VENDOR_SETTINGS, sVendor))
+    if (Bootstrap()->getFrom(UNO_JAVA_JFW_VENDOR_SETTINGS, sVendor))
     {
         //check the value of the bootstrap variable
         jfw::FileStatus s = checkFileURL(sVendor);
@@ -316,8 +316,8 @@ OUString BootParams::getJREHome()
 {
     OUString sJRE;
     OUString sEnvJRE;
-    bool bJRE = Bootstrap::get()->getFrom(UNO_JAVA_JFW_JREHOME, sJRE);
-    bool bEnvJRE = Bootstrap::get()->getFrom(UNO_JAVA_JFW_ENV_JREHOME, 
sEnvJRE);
+    bool bJRE = Bootstrap()->getFrom(UNO_JAVA_JFW_JREHOME, sJRE);
+    bool bEnvJRE = Bootstrap()->getFrom(UNO_JAVA_JFW_ENV_JREHOME, sEnvJRE);
 
     if (bJRE && bEnvJRE)
     {
@@ -370,7 +370,7 @@ OUString BootParams::getJREHome()
 OUString BootParams::getClasspathUrls()
 {
     OUString sParams;
-    Bootstrap::get()->getFrom( UNO_JAVA_JFW_CLASSPATH_URLS, sParams);
+    Bootstrap()->getFrom( UNO_JAVA_JFW_CLASSPATH_URLS, sParams);
     SAL_INFO(
         "jfw.level2",
         "Using bootstrap parameter " UNO_JAVA_JFW_CLASSPATH_URLS " = "
@@ -388,7 +388,7 @@ JFW_MODE getMode()
         //check if either of the "direct mode" bootstrap variables is set
         bool bDirectMode = true;
         OUString sValue;
-        const rtl::Bootstrap * aBoot = Bootstrap::get();
+        const rtl::Bootstrap * aBoot = Bootstrap();
         if (!aBoot->getFrom(UNO_JAVA_JFW_JREHOME, sValue))
         {
             if (!aBoot->getFrom(UNO_JAVA_JFW_ENV_JREHOME, sValue))
diff --git a/jvmfwk/source/fwkutil.cxx b/jvmfwk/source/fwkutil.cxx
index a3be17ea1d48..ee083f064926 100644
--- a/jvmfwk/source/fwkutil.cxx
+++ b/jvmfwk/source/fwkutil.cxx
@@ -41,6 +41,34 @@ using namespace osl;
 namespace jfw
 {
 
+/** provides a bootstrap class which already knows the values from the
+    jvmfkwrc file.
+*/
+const rtl::Bootstrap* Bootstrap()
+{
+    static const rtl::Bootstrap* SINGLETON = []()
+        {
+            OUString sIni = getLibraryLocation() +
+#ifdef MACOSX
+                // For some reason the jvmfwk3rc file is traditionally in
+                // LIBO_URE_ETC_FOLDER
+                "/../" LIBO_URE_ETC_FOLDER
+#endif
+                SAL_CONFIGFILE("/jvmfwk3");
+            ::rtl::Bootstrap *  bootstrap = new ::rtl::Bootstrap(sIni);
+            SAL_INFO("jfw.level2", "Using configuration file " << sIni);
+            return bootstrap;
+        }();
+    return SINGLETON;
+};
+
+osl::Mutex& FwkMutex()
+{
+    static osl::Mutex SINGLETON;
+    return SINGLETON;
+}
+
+
 rtl::ByteSequence encodeBase16(const rtl::ByteSequence& rawData)
 {
     static const char EncodingTable[] =

Reply via email to