Date: Sat, 6 Nov 2010 11:31:20 +0100 (CET) From: Barbara <barbara.xxx1975@libero.it> To: <freebsd-current@freebsd.org> Cc: dudu@dudu.ro Subject: libstc++ (?) problem on CURRENT? Message-ID: <13873405.926621289039480757.JavaMail.defaultUser@defaultHost>
next in thread | raw e-mail | index | archive | help
>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 i= t >> 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=20 just >> wondering why the same c++ code is working on 8_STABLE and it's segfault= ing=20 on >> CURRENT, considering also that AFAIK the gcc version in both the base=20 systems >> is the same. >> >> In the part of the code causing the crash, a std::map is read with an=20 iterator >> in a for loop, and if a condition is met, an entry is erased. >> The following is the bt I'm getting: >> #0 =C2=A00x29e36247 in kill () from /lib/libc.so.7 >> #1 =C2=A00x29e361a6 in raise () from /lib/libc.so.7 >> #2 =C2=A00x282424f6 in XRE_LockProfileDirectory () from >> =C2=A0 =C2=A0 =C2=A0 =C2=A0/usr/local/lib/firefox3/libxul.so >> #3 =C2=A0<signal handler called> >> #4 =C2=A00x29c8f1b2 in std::_Rb_tree_increment () from >> =C2=A0 =C2=A0 =C2=A0 =C2=A0/usr/lib/libstdc++.so.6 #5 =C2=A00x2ef92402 i= n >> =C2=A0 =C2=A0 =C2=A0 =C2=A0IcedTeaPluginUtilities::invalidateInstance ()= from >> =C2=A0 =C2=A0 =C2=A0 =C2=A0/usr/local/openjdk6/jre/lib/IcedTeaPlugin.so >> ... >> >> I wrote a "patch" for the IcedTea plugin, replacing the for loop with a= =20 while >> and increasing the iterator before erasing from the map, and it seems=20 working. >> Then I wrote a simple program that do something similar to IcedTea, so= =20 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.htm= l >> >> You can find the patch and the sample code in the discussion above, anyw= ay=20 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 =3D cars.begin(); iter !=3D cars.end(); ) { > if ((*iter).second =3D=3D modelName) > cars.erase(iter++); > else > ++iter; >} >-- and here -- > >In this example, you first increment the iterator and then erase its >previous value. > So there is a bug in my source code! Well, I'm not surprised. I'm trying to report the code in icedtea here, extracting it from the patch= so=20 I hope it's accurate enough: std::map<void*,NPP>::iterator iterator;=20 for (iterator =3D instance_map->begin(); iterator !=3D instance_map->en= d();=20 iterator++) { if ((*iterator).second =3D=3D instance) { instance_map->erase((*iterator).first); } } So, do you think, like Ed Schouten said, that there is a bug in the source= =20 code but it's just exposed on CURRENT? Is that code bad too? Thanks Barbara
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?13873405.926621289039480757.JavaMail.defaultUser>