[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - vcl/android vcl/inc vcl/source

Michael Meeks (via logerrit) logerrit at kemper.freedesktop.org
Wed Dec 11 17:07:22 UTC 2019


 vcl/android/androidinst.cxx     |   17 +++++++++++++++++
 vcl/inc/android/androidinst.hxx |    3 +++
 vcl/inc/salinst.hxx             |    3 +++
 vcl/source/app/svapp.cxx        |    5 +++++
 4 files changed, 28 insertions(+)

New commits:
commit 7241382ccc0a028c5f08304090a6344e582db068
Author:     Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Wed Dec 11 14:38:43 2019 +0000
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Wed Dec 11 18:06:33 2019 +0100

    android: add abstraction to allow us to DetachThread sensibly.
    
    If we fail to do this after runLoop - some Android VMs can get really
    upset if we quit a thread without doing this, also ensure that we
    AttachThread to new polling loop threads as we come in for good
    measure - duplicate Attach's are NOPs.
    
    Change-Id: I32454773af4e02c97df0b6c02f61b1dc74df80b0
    Reviewed-on: https://gerrit.libreoffice.org/84956
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx
index da3889145bb7..1cb11bd7c1e5 100644
--- a/vcl/android/androidinst.cxx
+++ b/vcl/android/androidinst.cxx
@@ -58,10 +58,12 @@ AndroidSalInstance *AndroidSalInstance::getInstance()
 AndroidSalInstance::AndroidSalInstance( std::unique_ptr<SalYieldMutex> pMutex )
     : SvpSalInstance( std::move(pMutex) )
 {
+    // FIXME: remove when uniPoll & runLoop is the only android entry poit.
     int res = (lo_get_javavm())->AttachCurrentThread(&m_pJNIEnv, NULL);
     LOGI("AttachCurrentThread res=%d env=%p", res, m_pJNIEnv);
 }
 
+// This is never called on Android until app exit.
 AndroidSalInstance::~AndroidSalInstance()
 {
     int res = (lo_get_javavm())->DetachCurrentThread();
@@ -79,6 +81,21 @@ bool AndroidSalInstance::AnyInput( VclInputFlags nType )
     return SvpSalInstance::s_pDefaultInstance->HasUserEvents();
 }
 
+void AndroidSalInstance::updateMainThread()
+{
+    int res = (lo_get_javavm())->AttachCurrentThread(&m_pJNIEnv, NULL);
+    LOGI("updateMainThread AttachCurrentThread res=%d env=%p", res, m_pJNIEnv);
+    SvpSalInstance::updateMainThread();
+}
+
+void AndroidSalInstance::releaseMainThread()
+{
+    int res = (lo_get_javavm())->DetachCurrentThread();
+    LOGI("releaseMainThread DetachCurrentThread res=%d", res);
+
+    SvpSalInstance::releaseMainThread();
+}
+
 class AndroidSalSystem : public SvpSalSystem {
 public:
     AndroidSalSystem() : SvpSalSystem() {}
diff --git a/vcl/inc/android/androidinst.hxx b/vcl/inc/android/androidinst.hxx
index 49758f3efd70..526174b14951 100644
--- a/vcl/inc/android/androidinst.hxx
+++ b/vcl/inc/android/androidinst.hxx
@@ -38,6 +38,9 @@ public:
 
     // mainloop pieces
     virtual bool AnyInput( VclInputFlags nType );
+
+    virtual void updateMainThread();
+    virtual void releaseMainThread();
 };
 
 #endif // INCLUDED_VCL_INC_ANDROID_ANDROIDINST_HXX
diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx
index e35cd78df4fb..6ad6133f6129 100644
--- a/vcl/inc/salinst.hxx
+++ b/vcl/inc/salinst.hxx
@@ -195,7 +195,10 @@ public:
     virtual void            jobStartedPrinterUpdate() {}
     virtual void            jobEndedPrinterUpdate() {}
 
+    /// Set the app's (somewhat) magic/main-thread to this one.
     virtual void            updateMainThread() {}
+    /// Disconnect that - good for detatching from the JavaVM on Android.
+    virtual void            releaseMainThread() {}
 
     /// get information about underlying versions
     virtual OUString        getOSVersion() { return OUString("-"); }
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index a39186647741..fed84899714c 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -1676,6 +1676,11 @@ void unregisterPollCallbacks()
     ImplSVData * pSVData = ImplGetSVData();
     if (pSVData)
     {
+        // Not hyper-elegant - but in the case of Android & unipoll we need to detach
+        // this thread from the JVM's clutches to avoid a crash closing document
+        if (pSVData->mpPollClosure && pSVData->mpDefInst)
+            pSVData->mpDefInst->releaseMainThread();
+
         // Just set mpPollClosure to null as that is what calling this means, that the callback data
         // points to an object that no longer exists. In particular, don't set
         // pSVData->mpPollCallback to nullptr as that is used to detect whether Unipoll is in use in


More information about the Libreoffice-commits mailing list