changeset 25678:3418d3729a51

use exisitng mutex in octave_qt_link for changing gui preferences (bug #54369) * main-window.cc (construct_octave_qt_link): signal gui_preference_signal and related slot wihtout mutex as argument; (gui_preference): mutex not passed via arguments, use lock/unlock and wake_all of m_octave_qt_link instead * main-window.h: slot gui_preference wihtout mutex as argument * octave-qt-link.cc (do_gui_preference): no new mutex required, signal gui_preference_signal without mutex pointer, use internal lock, wait and unlock * octave-qt-link.h: gui_preference_signal without mutey pointer
author Torsten <mttl@mailbox.org>
date Thu, 26 Jul 2018 20:04:17 +0200
parents 5401dfadd2f6
children 4596a80cbc18
files libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qt-link.cc libgui/src/octave-qt-link.h
diffstat 4 files changed, 19 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/main-window.cc	Thu Jul 26 19:52:28 2018 +0200
+++ b/libgui/src/main-window.cc	Thu Jul 26 20:04:17 2018 +0200
@@ -1984,10 +1984,9 @@
 
         connect (m_octave_qt_link,
                  SIGNAL (gui_preference_signal (const QString&, const QString&,
-                                                QMutex*, QString*)),
-                 this,
-                 SLOT (gui_preference (const QString&, const QString&,
-                                       QMutex*, QString*)));
+                                                QString*)),
+                 this, SLOT (gui_preference (const QString&, const QString&,
+                                             QString*)));
 
         connect (m_octave_qt_link,
                  SIGNAL (edit_file_signal (const QString&)),
@@ -2494,19 +2493,23 @@
   }
 
   void main_window::gui_preference (const QString& key, const QString& value,
-                                    QMutex* wait_for_gui, QString* read_value)
+                                    QString* read_value)
   {
     QSettings *settings = resource_manager::get_settings ();
-
     *read_value = settings->value (key).toString ();
 
+    // Wait for worker to suspend
+    m_octave_qt_link->lock ();
+
     if (! value.isEmpty ())
       {
         settings->setValue (key, QVariant (value));
         emit settings_changed (settings);
       }
 
-    wait_for_gui->unlock ();    // data is ready, resume worker threat
+    // We are done: Unlock and wake the worker thread
+    m_octave_qt_link->unlock ();
+    m_octave_qt_link->wake_all ();
   }
 
   void main_window::save_workspace_callback (const std::string& file)
--- a/libgui/src/main-window.h	Thu Jul 26 19:52:28 2018 +0200
+++ b/libgui/src/main-window.h	Thu Jul 26 20:04:17 2018 +0200
@@ -241,7 +241,7 @@
                                    const QString& multimode);
 
     void gui_preference (const QString& key, const QString& value,
-                         QMutex* wait_for_gui, QString* read_value);
+                         QString* read_value);
     void handle_show_doc (const QString& file);
     void handle_register_doc (const QString& file);
     void handle_unregister_doc (const QString& file);
--- a/libgui/src/octave-qt-link.cc	Thu Jul 26 19:52:28 2018 +0200
+++ b/libgui/src/octave-qt-link.cc	Thu Jul 26 20:04:17 2018 +0200
@@ -576,22 +576,18 @@
   std::string octave_qt_link::do_gui_preference (const std::string& key,
                                                  const std::string& value)
   {
-    QMutex wait_for_gui;
     QString pref_value;
 
+    // Lock the mutex before signaling
+    lock ();
+
     // Emit the signal for changing or getting a preference
     emit gui_preference_signal (QString::fromStdString (key),
-                                QString::fromStdString (value),
-                                &wait_for_gui, &pref_value);
+                                QString::fromStdString (value), &pref_value);
 
-    // Unlock and lock the mutex (make sure it is locked without being blocked)
-    wait_for_gui.unlock ();
-    wait_for_gui.lock ();
-
-    // Try to lock it again, thus waiting for the unlock of the gui after
-    // reading/changing desired preference. A timeout of 3 s for not being
-    // blocked forever if something goes wrong
-    wait_for_gui.tryLock (3000);
+    // Wait for the GUI and unlock when resumed
+    wait ();
+    unlock ();
 
     return pref_value.toStdString ();
   }
--- a/libgui/src/octave-qt-link.h	Thu Jul 26 19:52:28 2018 +0200
+++ b/libgui/src/octave-qt-link.h	Thu Jul 26 20:04:17 2018 +0200
@@ -195,8 +195,7 @@
 
     void show_preferences_signal (void);
 
-    void gui_preference_signal (const QString&, const QString&,
-                                QMutex*, QString*);
+    void gui_preference_signal (const QString&, const QString&, QString*);
 
     void show_doc_signal (const QString& file);