From 2cff1e217ba0df94fc50a30c8d49dc848c294ac6 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Tue, 13 Aug 2024 18:39:57 -0400
Subject: Reduce UI draw stalls from LLSpellChecker singleton via simpleton

---
 indra/llui/llspellcheck.cpp | 17 +++++------------
 indra/llui/llspellcheck.h   |  9 ++++-----
 indra/llui/llui.cpp         |  3 +++
 3 files changed, 12 insertions(+), 17 deletions(-)

(limited to 'indra/llui')

diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp
index 16ffd352cf..e15616a16b 100644
--- a/indra/llui/llspellcheck.cpp
+++ b/indra/llui/llspellcheck.cpp
@@ -42,19 +42,13 @@ static const std::string DICT_FILE_USER = "user_dictionaries.xml";
 LLSpellChecker::settings_change_signal_t LLSpellChecker::sSettingsChangeSignal;
 
 LLSpellChecker::LLSpellChecker()
-    : mHunspell(NULL)
 {
+    // Load initial dictionary information
+    refreshDictionaryMap();
 }
 
 LLSpellChecker::~LLSpellChecker()
 {
-    delete mHunspell;
-}
-
-void LLSpellChecker::initSingleton()
-{
-    // Load initial dictionary information
-    refreshDictionaryMap();
 }
 
 bool LLSpellChecker::checkSpelling(const std::string& word) const
@@ -300,8 +294,7 @@ void LLSpellChecker::initHunspell(const std::string& dict_language)
 {
     if (mHunspell)
     {
-        delete mHunspell;
-        mHunspell = NULL;
+        mHunspell.reset();
         mDictLanguage.clear();
         mDictFile.clear();
         mIgnoreList.clear();
@@ -322,11 +315,11 @@ void LLSpellChecker::initHunspell(const std::string& dict_language)
         const std::string filename_dic = dict_entry["name"].asString() + ".dic";
         if ( (gDirUtilp->fileExists(user_path + filename_aff)) && (gDirUtilp->fileExists(user_path + filename_dic)) )
         {
-            mHunspell = new Hunspell((user_path + filename_aff).c_str(), (user_path + filename_dic).c_str());
+            mHunspell = std::make_unique<Hunspell>((user_path + filename_aff).c_str(), (user_path + filename_dic).c_str());
         }
         else if ( (gDirUtilp->fileExists(app_path + filename_aff)) && (gDirUtilp->fileExists(app_path + filename_dic)) )
         {
-            mHunspell = new Hunspell((app_path + filename_aff).c_str(), (app_path + filename_dic).c_str());
+            mHunspell = std::make_unique<Hunspell>((app_path + filename_aff).c_str(), (app_path + filename_dic).c_str());
         }
         if (!mHunspell)
         {
diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h
index e4d8a12ef1..9df2f94085 100644
--- a/indra/llui/llspellcheck.h
+++ b/indra/llui/llspellcheck.h
@@ -34,12 +34,12 @@
 
 class Hunspell;
 
-class LLSpellChecker : public LLSingleton<LLSpellChecker>
+class LLSpellChecker : public LLSimpleton<LLSpellChecker>
 {
-    LLSINGLETON(LLSpellChecker);
+public:
+    LLSpellChecker();
     ~LLSpellChecker();
 
-public:
     void addToCustomDictionary(const std::string& word);
     void addToIgnoreList(const std::string& word);
     bool checkSpelling(const std::string& word) const;
@@ -47,7 +47,6 @@ public:
 protected:
     void addToDictFile(const std::string& dict_path, const std::string& word);
     void initHunspell(const std::string& dict_language);
-    void initSingleton() override;
 
 public:
     typedef std::list<std::string> dict_list_t;
@@ -77,7 +76,7 @@ public:
     static boost::signals2::connection setSettingsChangeCallback(const settings_change_signal_t::slot_type& cb);
 
 protected:
-    Hunspell*   mHunspell;
+    std::unique_ptr<Hunspell>   mHunspell;
     std::string mDictLanguage;
     std::string mDictFile;
     dict_list_t mDictSecondary;
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 8d46422c09..e36dae3955 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -54,6 +54,7 @@
 #include "llmenubutton.h"
 #include "llloadingindicator.h"
 #include "llwindow.h"
+#include "llspellcheck.h"
 
 // for registration
 #include "llfiltereditor.h"
@@ -157,6 +158,7 @@ mRootView(NULL),
 mHelpImpl(NULL)
 {
     LLRender2D::createInstance(image_provider);
+    LLSpellChecker::createInstance();
 
     if ((get_ptr_in_map(mSettingGroups, std::string("config")) == NULL) ||
         (get_ptr_in_map(mSettingGroups, std::string("floater")) == NULL) ||
@@ -198,6 +200,7 @@ mHelpImpl(NULL)
 
 LLUI::~LLUI()
 {
+    LLSpellChecker::deleteSingleton();
     LLRender2D::deleteSingleton();
 }
 
-- 
cgit v1.2.3