[haiku-commits] Change in haiku[master]: Locale Kit: move catalog add-ons loading to early initialization

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 22 Jan 2021 20:13:33 +0000

From Adrien Destugues <pulkomandy@xxxxxxxxx>:

Adrien Destugues has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/3661 ;)


Change subject: Locale Kit: move catalog add-ons loading to early initialization
......................................................................

Locale Kit: move catalog add-ons loading to early initialization

The catalog loading has been done lazily since forever (this code was
imported from OpenTracker). It results in a race condition as explained
in #16670.

Moving the catalog loading earlier in the locale loading process avoids
this problem, since load_add_on is called before the locale roster lock
is used.

This should fix #16670.
---
M src/kits/locale/LocaleRoster.cpp
M src/kits/locale/LocaleRosterData.cpp
M src/kits/locale/MutableLocaleRoster.cpp
3 files changed, 10 insertions(+), 8 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/61/3661/1

diff --git a/src/kits/locale/LocaleRoster.cpp b/src/kits/locale/LocaleRoster.cpp
index dee3807..226c368 100644
--- a/src/kits/locale/LocaleRoster.cpp
+++ b/src/kits/locale/LocaleRoster.cpp
@@ -446,7 +446,7 @@
                CatalogAddOnInfo* info
                        = 
(CatalogAddOnInfo*)fData->fCatalogAddOnInfos.ItemAt(i);

-               if (!info->MakeSureItsLoaded() || !info->fLanguagesFunc)
+               if (!info->fLanguagesFunc)
                        continue;

                info->fLanguagesFunc(languageList, sigPattern, langPattern,
diff --git a/src/kits/locale/LocaleRosterData.cpp 
b/src/kits/locale/LocaleRosterData.cpp
index 0859805..42608ae 100644
--- a/src/kits/locale/LocaleRosterData.cpp
+++ b/src/kits/locale/LocaleRosterData.cpp
@@ -402,8 +402,12 @@
                                                CatalogAddOnInfo* addOnInfo
                                                        = new(std::nothrow) 
CatalogAddOnInfo(dent->d_name,
                                                                
addOnFolderName, priority);
-                                               if (addOnInfo)
-                                                       
fCatalogAddOnInfos.AddItem((void*)addOnInfo);
+                                               if (addOnInfo) {
+                                                       if 
(addOnInfo->MakeSureItsLoaded())
+                                                               
fCatalogAddOnInfos.AddItem((void*)addOnInfo);
+                                                       else
+                                                               delete 
addOnInfo;
+                                               }
                                        }
                                }
                                // Bump the dirent-pointer by length of the 
dirent just handled:
diff --git a/src/kits/locale/MutableLocaleRoster.cpp 
b/src/kits/locale/MutableLocaleRoster.cpp
index 3771e1e..f5d42f0 100644
--- a/src/kits/locale/MutableLocaleRoster.cpp
+++ b/src/kits/locale/MutableLocaleRoster.cpp
@@ -150,8 +150,7 @@
        for (int32 i = 0; i < count; ++i) {
                CatalogAddOnInfo* info = (CatalogAddOnInfo*)
                        fData->fCatalogAddOnInfos.ItemAt(i);
-               if (info->fName.ICompare(type) != 0 || 
!info->MakeSureItsLoaded()
-                       || !info->fCreateFunc)
+               if (info->fName.ICompare(type) != 0 || !info->fCreateFunc)
                        continue;

                BCatalogData* catalog = info->fCreateFunc(signature, language);
@@ -189,7 +188,7 @@
                CatalogAddOnInfo* info = (CatalogAddOnInfo*)
                        fData->fCatalogAddOnInfos.ItemAt(i);

-               if (!info->MakeSureItsLoaded() || !info->fInstantiateFunc)
+               if (!info->fInstantiateFunc)
                        continue;
                BMessage languages;
                if (language != NULL) {
@@ -277,8 +276,7 @@
        for (int32 i = 0; i < count; ++i) {
                CatalogAddOnInfo* info = (CatalogAddOnInfo*)
                        fData->fCatalogAddOnInfos.ItemAt(i);
-               if (info->MakeSureItsLoaded()
-                       && info->fInstantiateFunc
+               if (info->fInstantiateFunc
                                == BPrivate::DefaultCatalog::Instantiate) {
                        defaultCatalogInfo = info;
                        break;

--
To view, visit https://review.haiku-os.org/c/haiku/+/3661
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: If07054077f7dde41cb342a43af2abe8422239b05
Gerrit-Change-Number: 3661
Gerrit-PatchSet: 1
Gerrit-Owner: Adrien Destugues <pulkomandy@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: Locale Kit: move catalog add-ons loading to early initialization - Gerrit