From: Martin Sevior (msevior@mccubbin.ph.unimelb.edu.au)
Date: Sun Mar 17 2002 - 05:12:14 GMT
CVS: ----------------------------------------------------------------------
CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS: src/other/spell/xp/spell_manager.cpp
CVS: src/other/spell/xp/spell_manager.h
CVS: ----------------------------------------------------------------------
Work around contains() bug in m_map.contains() of ispell hashes.
This is the ugly work around. AbiWord no longer hangs for me though.
Cheers
Martin
On Sun, 17 Mar 2002, Martin Sevior wrote:
> Do this:
>
> Open the release notes in abiword. Then open the 0.99.3 change log in
> another abiword view. Then remove one toolbar from the current view.
>
> AbiWord hangs while it spawns an infinite number of spellchecker
> instances.
>
> I traced the bug to spell_manager.cpp:
>
> In method: requestDictionary(const char * szLang)
>
> There is the code:
>
> // first look up the entry in the hashtable
> if (m_map.contains (szLang, 0))
> {
> return (SpellCheckerClass *)m_map.pick (szLang);
> }
>
> // not found, so insert it
> checker = new SpellCheckerClass ();
>
> if (checker->requestDictionary (szLang))
> {
> m_map.insert (szLang, (void *)checker);
> m_lastDict = checker;
> m_nLoadedDicts++;
> return checker;
> }
>
>
> So the code looks for the dictionary in the hash map otherwise it makes a
> new instances and saves it to be found the next time through. OK This
> should all work right?
>
> NO!
>
> the contains() method of hash map is buggy. It sometimes works and
> sometimes doesn't. I disabled it once before in xap_Dictionary.cpp. Here
> is the code trail....
>
> //
> // This original code does not work. I believe it is a bug in the hash table.
> //
> #if 0
> char * key = (char*) calloc(len+1, sizeof(char));
> if (!key)
> {
> UT_DEBUGMSG(("mem failure looking up word in
> dictionary\n"));
> FREEP(key);
> return false;
> }
> UT_uint32 i =0;
> for (i = 0; i < len; i++)
> {
> key[i] = (char) static_cast<unsigned char>( pWord[i]);
> xxx_UT_DEBUGMSG(("isword key[%d] = %c %d
> \n",i,key[i],key[i]));
> if(key[i] == 0)
> break;
> }
> key[i] = 0;
> char * key2 = UT_strdup(key);
> bool contains = m_hashWords.contains (key2, NULL);
> FREEP(key);
> FREEP(key2);
> return contains;
> #else
>
>
> contains( , ) fails here too.
>
> I've done a grep through the source and found the contains method is used
> elsewhere in AbiWord.
>
>
> So please, whoever is repsonible the hashtable, fix the
> contains(..) method!!!
>
> I'll work around the bug in spellcheck using vectors again. But please fix
> the hash map code!!!
>
> Thank you
>
>
> Martin
>
>
>
This archive was generated by hypermail 2.1.4 : Sun Mar 17 2002 - 00:19:04 GMT