summaryrefslogtreecommitdiff
path: root/sal/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'sal/rtl')
-rw-r--r--sal/rtl/source/hash.cxx70
-rw-r--r--sal/rtl/source/hash.h10
-rw-r--r--sal/rtl/source/ustring.c8
3 files changed, 40 insertions, 48 deletions
diff --git a/sal/rtl/source/hash.cxx b/sal/rtl/source/hash.cxx
index ec5229002c4b..7caa2341ca11 100644
--- a/sal/rtl/source/hash.cxx
+++ b/sal/rtl/source/hash.cxx
@@ -36,52 +36,51 @@
#include <hash_set>
namespace {
- struct UStringHash
- {
- size_t operator()(rtl_uString * const &rString) const
- { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); }
- };
- struct UStringEqual
- {
- sal_Bool operator() ( rtl_uString * const &pStringA,
- rtl_uString * const &pStringB) const
- {
- if (pStringA == pStringB)
- return true;
- if (pStringA->length != pStringB->length)
- return false;
- return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length,
- pStringB->buffer, pStringB->length);
- }
- };
-}
-typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual,
- rtl::Allocator<rtl_uString *> > UniqueHash;
+struct UStringHash
+{
+ size_t operator()(rtl_uString * const &rString) const
+ { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); }
+};
-struct StringHashTableImpl : public UniqueHash
+struct UStringEqual
{
- StringHashTableImpl(sal_uInt32 nSize) : UniqueHash( nSize ) {}
+ sal_Bool operator() ( rtl_uString * const &pStringA,
+ rtl_uString * const &pStringB) const
+ {
+ if (pStringA == pStringB)
+ return true;
+ if (pStringA->length != pStringB->length)
+ return false;
+ return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length,
+ pStringB->buffer, pStringB->length);
+ }
};
+typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual,
+ rtl::Allocator<rtl_uString *> > StringHashTable;
+
StringHashTable *
-rtl_str_hash_new (sal_uInt32 nSize)
+getHashTable ()
{
- return new StringHashTableImpl (nSize);
+ static StringHashTable *pInternPool = NULL;
+ if (pInternPool == NULL) {
+ static StringHashTable aImpl(1024);
+ pInternPool = &aImpl;
+ }
+ return pInternPool;
}
-void
-rtl_str_hash_free (StringHashTable *pHash)
-{
- delete pHash;
}
+extern "C" {
+
rtl_uString *
-rtl_str_hash_intern (StringHashTable *pHash,
- rtl_uString *pString,
+rtl_str_hash_intern (rtl_uString *pString,
int can_return)
{
- UniqueHash::iterator aIter;
+ StringHashTable *pHash = getHashTable();
+ StringHashTable::iterator aIter;
aIter = pHash->find(pString);
if (aIter != pHash->end())
{
@@ -106,8 +105,9 @@ rtl_str_hash_intern (StringHashTable *pHash,
}
void
-rtl_str_hash_remove (StringHashTable *pHash,
- rtl_uString *pString)
+rtl_str_hash_remove (rtl_uString *pString)
{
- pHash->erase(pString);
+ getHashTable()->erase(pString);
+}
+
}
diff --git a/sal/rtl/source/hash.h b/sal/rtl/source/hash.h
index 63f3e99c8495..2aadfb33efcd 100644
--- a/sal/rtl/source/hash.h
+++ b/sal/rtl/source/hash.h
@@ -8,15 +8,11 @@
extern "C" {
#endif /* __cplusplus */
-typedef struct StringHashTableImpl StringHashTable;
+/* These functions are not multi-thread safe: */
-StringHashTable *rtl_str_hash_new (sal_uInt32 nSize);
-void rtl_str_hash_free (StringHashTable *pHash);
-rtl_uString *rtl_str_hash_intern (StringHashTable *pHash,
- rtl_uString *pString,
+rtl_uString *rtl_str_hash_intern (rtl_uString *pString,
int can_return);
-void rtl_str_hash_remove (StringHashTable *pHash,
- rtl_uString *pString);
+void rtl_str_hash_remove (rtl_uString *pString);
#if defined __cplusplus
}
diff --git a/sal/rtl/source/ustring.c b/sal/rtl/source/ustring.c
index aebd0684a50a..b0bdd2d98e73 100644
--- a/sal/rtl/source/ustring.c
+++ b/sal/rtl/source/ustring.c
@@ -761,8 +761,6 @@ getInternMutex()
return pPoolGuard;
}
-static StringHashTable *pInternPool = NULL;
-
/* returns true if we found a dup in the pool */
static void rtl_ustring_intern_internal( rtl_uString ** newStr,
rtl_uString * str,
@@ -774,9 +772,7 @@ static void rtl_ustring_intern_internal( rtl_uString ** newStr,
osl_acquireMutex( pPoolMutex );
- if (!pInternPool)
- pInternPool = rtl_str_hash_new (1024);
- *newStr = rtl_str_hash_intern (pInternPool, str, can_return);
+ *newStr = rtl_str_hash_intern (str, can_return);
osl_releaseMutex( pPoolMutex );
@@ -864,7 +860,7 @@ internRelease (rtl_uString *pThis)
pPoolMutex = getInternMutex();
osl_acquireMutex( pPoolMutex );
- rtl_str_hash_remove (pInternPool, pThis);
+ rtl_str_hash_remove (pThis);
/* May have been separately acquired */
if ( SAL_STRING_REFCOUNT(