diff --git a/intl/unicharutil/src/nsCaseConversionImp2.cpp b/intl/unicharutil/src/nsCaseConversionImp2.cpp index d67f01e5471..2db085f6c2e 100644 --- a/intl/unicharutil/src/nsCaseConversionImp2.cpp +++ b/intl/unicharutil/src/nsCaseConversionImp2.cpp @@ -173,12 +173,14 @@ PRUnichar nsCompressedMap::Lookup( } } -nsrefcnt nsCaseConversionImp2::gInit = 0; +NS_IMPL_THREADSAFE_ISUPPORTS1(nsCaseConversionImp2, nsICaseConversion) -NS_IMPL_ISUPPORTS1(nsCaseConversionImp2, nsICaseConversion) - -static nsCompressedMap *gUpperMap = nsnull; -static nsCompressedMap *gLowerMap = nsnull; +static nsCompressedMap + gUpperMap(NS_REINTERPRET_CAST(const PRUnichar*, &gToUpper[0]), + gToUpperItems); +static nsCompressedMap + gLowerMap(NS_REINTERPRET_CAST(const PRUnichar*, &gToLower[0]), + gToLowerItems); nsresult nsCaseConversionImp2::ToUpper( PRUnichar aChar, PRUnichar* aReturn @@ -197,7 +199,7 @@ nsresult nsCaseConversionImp2::ToUpper( } else { - *aReturn = gUpperMap->Map(aChar); + *aReturn = gUpperMap.Map(aChar); } return NS_OK; } @@ -220,7 +222,7 @@ static PRUnichar FastToLower( } else { - return gLowerMap->Map(aChar); + return gLowerMap.Map(aChar); } return NS_OK; } @@ -259,7 +261,7 @@ nsresult nsCaseConversionImp2::ToTitle( } PRUnichar upper; - upper = gUpperMap->Map(aChar); + upper = gUpperMap.Map(aChar); if( 0x01C0 == ( upper & 0xFFC0)) // 0x01Cx - 0x01Fx { @@ -296,7 +298,7 @@ nsresult nsCaseConversionImp2::ToUpper( } else { - aReturn[i] = gUpperMap->Map(aChar); + aReturn[i] = gUpperMap.Map(aChar); } } return NS_OK; @@ -389,30 +391,10 @@ nsCaseConversionImp2::CaseInsensitiveCompare(const PRUnichar *aLeft, return NS_OK; } -nsCaseConversionImp2::nsCaseConversionImp2() +nsresult NS_NewCaseConversion(nsICaseConversion** oResult) { - if (gInit++ == 0) { - gUpperMap = new nsCompressedMap(NS_REINTERPRET_CAST(const PRUnichar*, &gToUpper[0]), gToUpperItems); - gLowerMap = new nsCompressedMap(NS_REINTERPRET_CAST(const PRUnichar*, &gToLower[0]), gToLowerItems); - } -} - -nsCaseConversionImp2::~nsCaseConversionImp2() -{ - if (--gInit == 0) { - delete gUpperMap; - gUpperMap = nsnull; - delete gLowerMap; - gLowerMap = nsnull; - } -} - -nsresult NS_NewCaseConversion(nsISupports** oResult) -{ - if(!oResult) - return NS_ERROR_NULL_POINTER; - *oResult = new nsCaseConversionImp2(); - if(*oResult) - NS_ADDREF(*oResult); - return (*oResult) ? NS_OK : NS_ERROR_OUT_OF_MEMORY; + NS_ENSURE_ARG_POINTER(oResult); + NS_NEWXPCOM(*oResult, nsCaseConversionImp2); + NS_IF_ADDREF(*oResult); + return *oResult ? NS_OK :NS_ERROR_OUT_OF_MEMORY; } diff --git a/intl/unicharutil/src/nsCaseConversionImp2.h b/intl/unicharutil/src/nsCaseConversionImp2.h index abd0a3f9967..415755576f1 100644 --- a/intl/unicharutil/src/nsCaseConversionImp2.h +++ b/intl/unicharutil/src/nsCaseConversionImp2.h @@ -49,8 +49,8 @@ class nsCaseConversionImp2 : public nsICaseConversion { NS_DECL_ISUPPORTS public: - nsCaseConversionImp2(); - virtual ~nsCaseConversionImp2(); + nsCaseConversionImp2() { }; + virtual ~nsCaseConversionImp2() { }; NS_IMETHOD ToUpper(PRUnichar aChar, PRUnichar* aReturn); @@ -67,8 +67,6 @@ public: PRUint32 aLen, PRBool aStartInWordBoundary = PR_TRUE); NS_IMETHOD CaseInsensitiveCompare(const PRUnichar* aLeft, const PRUnichar* aRight, PRUint32 aLength, PRInt32 *aResult); -private: - static nsrefcnt gInit; }; #endif diff --git a/intl/unicharutil/util/nsUnicharUtils.cpp b/intl/unicharutil/util/nsUnicharUtils.cpp index 464ea233636..6a074bb2577 100644 --- a/intl/unicharutil/util/nsUnicharUtils.cpp +++ b/intl/unicharutil/util/nsUnicharUtils.cpp @@ -73,26 +73,30 @@ public: }; -NS_IMPL_ISUPPORTS1(nsShutdownObserver, nsIObserver) +NS_IMPL_THREADSAFE_ISUPPORTS1(nsShutdownObserver, nsIObserver) static nsresult NS_InitCaseConversion() { - if (gCaseConv) return NS_OK; - - nsresult rv; - - rv = CallGetService(NS_UNICHARUTIL_CONTRACTID, &gCaseConv); - - if (NS_SUCCEEDED(rv)) { - nsCOMPtr obs = - do_GetService("@mozilla.org/observer-service;1", &rv); - if (NS_SUCCEEDED(rv)) { - nsShutdownObserver *observer = new nsShutdownObserver(); - if (observer) - obs->AddObserver(observer, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE); - } + if (gCaseConv) + return NS_OK; + + nsresult rv = CallGetService(NS_UNICHARUTIL_CONTRACTID, &gCaseConv); + if (NS_FAILED(rv)) { + gCaseConv = nsnull; + return rv; } - - return NS_OK; + + nsCOMPtr obs = + do_GetService("@mozilla.org/observer-service;1", &rv); + + if (NS_SUCCEEDED(rv)) { + nsCOMPtr observer; + NS_NEWXPCOM(observer, nsShutdownObserver); + if (observer) + obs->AddObserver(observer, NS_XPCOM_SHUTDOWN_OBSERVER_ID, + PR_FALSE); + } + + return NS_OK; } void