Date: Sat, 6 Nov 2010 11:32:21 +0100 From: Vlad Galu <dudu@dudu.ro> To: Barbara <barbara.xxx1975@libero.it> Cc: freebsd-current@freebsd.org Subject: Re: libstc++ (?) problem on CURRENT? Message-ID: <AANLkTimDMAAXQL92e4-OTnAn8ij%2BO_dw%2B5L5JoiL5rq6@mail.gmail.com> In-Reply-To: <AANLkTinn3O6pud1agZSfFSD1zzAJaYosjD4ze4cdBH=Z@mail.gmail.com> References: <19821003.923081289037424002.JavaMail.defaultUser@defaultHost> <AANLkTinn3O6pud1agZSfFSD1zzAJaYosjD4ze4cdBH=Z@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Nov 6, 2010 at 11:11 AM, Vlad Galu <dudu@dudu.ro> wrote: > On Sat, Nov 6, 2010 at 10:57 AM, Barbara <barbara.xxx1975@libero.it> wrote: >> >> I had a problem running the IcedTea java plugin on CURRENT i386, while it >> works on 8_STABLE. >> But maybe it's not a problem related to the port. >> Just to be clear, I'm not looking for a solution about the port here, I'm just >> wondering why the same c++ code is working on 8_STABLE and it's segfaulting on >> CURRENT, considering also that AFAIK the gcc version in both the base systems >> is the same. >> >> In the part of the code causing the crash, a std::map is read with an iterator >> in a for loop, and if a condition is met, an entry is erased. >> The following is the bt I'm getting: >> #0 0x29e36247 in kill () from /lib/libc.so.7 >> #1 0x29e361a6 in raise () from /lib/libc.so.7 >> #2 0x282424f6 in XRE_LockProfileDirectory () from >> /usr/local/lib/firefox3/libxul.so >> #3 <signal handler called> >> #4 0x29c8f1b2 in std::_Rb_tree_increment () from >> /usr/lib/libstdc++.so.6 #5 0x2ef92402 in >> IcedTeaPluginUtilities::invalidateInstance () from >> /usr/local/openjdk6/jre/lib/IcedTeaPlugin.so >> ... >> >> I wrote a "patch" for the IcedTea plugin, replacing the for loop with a while >> and increasing the iterator before erasing from the map, and it seems working. >> Then I wrote a simple program that do something similar to IcedTea, so there >> is no need to build the whole java/openjdk6 port to do some testing. >> Running it on 8_STABLE it works, on CURRENT it crashes. >> You can find more details in this discussion on the freebsd-java ml: >> http://lists.freebsd.org/pipermail/freebsd-java/2010-November/008978.html >> >> You can find the patch and the sample code in the discussion above, anyway I'm >> reporting them here too: >> icedtea patch: >> http://pastebin.com/b2KKFNSG >> test case: >> http://pastebin.com/Amk4UJ0g > > You appear to invalidate the iterator inside the loop and then > increment it. Do the following: > > -- cut here -- > for (iter = cars.begin(); iter != cars.end(); ) { > if ((*iter).second == modelName) > cars.erase(iter++); > else > ++iter; > } > -- and here -- > > In this example, you first increment the iterator and then erase its > previous value. Or, better yet: cars.erase("punto"); I see no reason in iterating through the whole map unless you want to relate the deletion to the matched type, in which case you should use the previous example. -- Good, fast & cheap. Pick any two.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTimDMAAXQL92e4-OTnAn8ij%2BO_dw%2B5L5JoiL5rq6>
