[Libreoffice-commits] core.git: jvmfwk/plugins

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Fri May 15 21:29:49 UTC 2020


 jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx |   69 +++++++++-----------
 1 file changed, 33 insertions(+), 36 deletions(-)

New commits:
commit dd372b444f1f1821048e197768d5095e6204a102
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Fri May 15 20:30:12 2020 +0200
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Fri May 15 23:29:12 2020 +0200

    Avoid any false GCC -Wclobbered
    
    ...by moving the code that calls JNI_CreateJavaVM and the setjmp that it may
    longjmp to (from abort_handler that may be called from within JNI_CreateJavaVM)
    into its own small function.  That way, no local variables in
    jfw_plugin_startJavaVirtualMachine should produce any such false "variable might
    be clobbered by ‘longjmp’ or ‘vfork’" GCC warnings any longer, and all the
    workarounds to silence such warnings can be removed.
    
    Change-Id: I6de134628e8efbf2d67fcd83a9cc2623b55762a7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94330
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
index 6397cda3c045..46f5cfba1281 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
@@ -200,6 +200,36 @@ extern "C" void JNICALL abort_handler()
     }
 }
 
+typedef jint JNICALL JNI_CreateVM_Type(JavaVM **, JNIEnv **, void *);
+
+int createJvm(
+    JNI_CreateVM_Type * pCreateJavaVM, JavaVM ** pJavaVM, JNIEnv ** ppEnv, JavaVMInitArgs * vm_args)
+{
+    /* We set a global flag which is used by the abort handler in order to
+       determine whether it is  should use longjmp to get back into this function.
+       That is, the abort handler determines if it is on the same stack as this function
+       and then jumps back into this function.
+    */
+    g_bInGetJavaVM = 1;
+    jint err;
+    memset( jmp_jvm_abort, 0, sizeof(jmp_jvm_abort));
+    int jmpval= setjmp( jmp_jvm_abort );
+    /* If jmpval is not "0" then this point was reached by a longjmp in the
+       abort_handler, which was called indirectly by JNI_CreateVM.
+    */
+    if( jmpval == 0)
+    {
+        //returns negative number on failure
+        err= pCreateJavaVM(pJavaVM, ppEnv, vm_args);
+        g_bInGetJavaVM = 0;
+    }
+    else
+        // set err to a positive number, so as or recognize that an abort (longjmp)
+        //occurred
+        err= 1;
+    return err;
+}
+
 /** helper function to check Java version requirements
 
     This function checks if the Java version of the given VendorBase
@@ -587,12 +617,8 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
     assert(pInfo != nullptr);
     assert(ppVm != nullptr);
     assert(ppEnv != nullptr);
-    // unless guard is volatile the following warning occurs on gcc:
-    // warning: variable 't' might be clobbered by `longjmp' or `vfork'
-    volatile osl::MutexGuard guard(PluginMutex::get());
-    // unless errorcode is volatile the following warning occurs on gcc:
-    // warning: variable 'errorcode' might be clobbered by `longjmp' or `vfork'
-    volatile javaPluginError errorcode = javaPluginError::NONE;
+    osl::MutexGuard guard(PluginMutex::get());
+    javaPluginError errorcode = javaPluginError::NONE;
 #ifdef MACOSX
     rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath( pInfo->sLocation );
     if ( !aVendorInfo.is() || aVendorInfo->compareVersions( pInfo->sVersion ) < 0 )
@@ -644,7 +670,6 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
     osl_setEnvironment(OUString("JAVA_HOME").pData, sPathLocation.pData);
 #endif
 
-    typedef jint JNICALL JNI_CreateVM_Type(JavaVM **, JNIEnv **, void *);
     OUString sSymbolCreateJava("JNI_CreateJavaVM");
 
     JNI_CreateVM_Type * pCreateJavaVM =
@@ -763,29 +788,8 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
     vm_args.nOptions= options.size(); //TODO overflow
     vm_args.ignoreUnrecognized= JNI_TRUE;
 
-    /* We set a global flag which is used by the abort handler in order to
-       determine whether it is  should use longjmp to get back into this function.
-       That is, the abort handler determines if it is on the same stack as this function
-       and then jumps back into this function.
-    */
-    g_bInGetJavaVM = 1;
-    jint err;
     JavaVM * pJavaVM = nullptr;
-    memset( jmp_jvm_abort, 0, sizeof(jmp_jvm_abort));
-    int jmpval= setjmp( jmp_jvm_abort );
-    /* If jmpval is not "0" then this point was reached by a longjmp in the
-       abort_handler, which was called indirectly by JNI_CreateVM.
-    */
-    if( jmpval == 0)
-    {
-        //returns negative number on failure
-        err= pCreateJavaVM(&pJavaVM, ppEnv, &vm_args);
-        g_bInGetJavaVM = 0;
-    }
-    else
-        // set err to a positive number, so as or recognize that an abort (longjmp)
-        //occurred
-        err= 1;
+    jint err = createJvm(pCreateJavaVM, &pJavaVM, ppEnv, &vm_args);
 
     if(err != 0)
     {
@@ -818,14 +822,7 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
 #endif
 
     return errorcode;
-#if defined __GNUC__ && !defined __clang__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wclobbered"
-#endif
 }
-#if defined __GNUC__ && !defined __clang__
-#pragma GCC diagnostic pop
-#endif
 
 javaPluginError jfw_plugin_existJRE(const JavaInfo *pInfo, bool *exist)
 {


More information about the Libreoffice-commits mailing list