From: <Jak...@no...> - 2002-04-03 15:53:21
|
Hi, Yes, now I see that bug description. But I have taken most current version from cvs ... it is commented "fix invalidated iterator usage. (bug #527467)" and it is 1.34. It still causes problem int13 ;-) problem is with delete (*i) and then doing i++. other problem is that _ownsAppender.clear() and _appender.clear() are put in for loop. So they are run in thirst iteration ... In bug description they are run after for, which make sense. void Category::removeAllAppenders() { threading::ScopedLock lock(_appenderSetMutex); { for (AppenderSet::iterator i =3D _appender.begin(); i !=3D _appender.end(); i++) { // found OwnsAppenderMap::iterator i2; if (ownsAppender(*i, i2)) { delete (*i); } =20 _ownsAppender.clear(); _appender.clear(); } } } cheers, --jakub =20 =20 > -----Original Message----- > From: ext Bastiaan Bakker [ <mailto:bas...@li...> = mailto:bas...@li...] > Sent: 2. april 2002 22:48 > To: Szymanski Jakub (NET/Copenhagen) > Cc: log...@li... > Subject: Re: [Log4cpp-devel] problem with Category::removeAllAppenders > > > Hi Jakub, > > This is a known bug (#527467) and a fix has been committed to > CVS (HEAD > branch). I intend to release 0.3.1 (containing the fix) later > this week. > > Thanks, > > Bastiaan Bakker > LifeLine Networks bv > > Jak...@no... wrote: > > >Hi, > > > >I run log4cpp on VC6.0 SP5. Version 0.30 + Category and Appender > >from CVS. > > > >I have problem with Category::removeAllAppenders. > >Version 1.34 (most current in CVS). > > > >When I run testCategory (or my simple tests) I have > >Unhandled exception Access Violation > >with stack trace: > >[ ....cut ...] > >log4cpp::Category::removeAllAppenders() line 152 + 16 bytes > >main(int 1, char * * 0x004417d0) line 144 + 13 bytes > >mainCRTStartup() line 338 + 17 bytes > >KERNEL32! 77f1ba06() > > > > > >There is: > > void Category::removeAllAppenders() { > > threading::ScopedLock lock(_appenderSetMutex); > > { > > for (AppenderSet::iterator i =3D _appender.begin(); > > i !=3D _appender.end(); i++) { > > // found > > OwnsAppenderMap::iterator i2; > > if (ownsAppender(*i, i2)) { > > delete (*i); > > } > > =20 > > _ownsAppender.clear(); > > _appender.clear(); > > } > > } > > } > > > > > >Problem is with delete of current iterator. Acording to specs and > >good comment in Appender.cpp you can't use iterator after > deleteing it > >[ > > Appender::_deleteAllAppenders() > > --- cut --- > > i++; // increment iterator before delete or > iterator will be invalid. > > delete (app); > >] > > > > > >So I changed code to: > > void Category::removeAllAppenders() { > > threading::ScopedLock lock(_appenderSetMutex); > > { > > Appender* app; > > AppenderSet::iterator i2; > > > > for (AppenderSet::iterator i =3D _appender.begin(); > > i !=3D _appender.end(); ) { > > // found > > app =3D *i; > > i2 =3D i; > > i++; > > > > OwnsAppenderMap::iterator i3; > > if (ownsAppender(*i2, i3)) { > > delete app; > > } > > } > > =20 > > _ownsAppender.clear(); > > _appender.clear(); > > } > > } > > > >and it passes testCategory test. > > > >cheers, > >--jakub > > > > > > > > > > > > > >_______________________________________________ > >Log4cpp-devel mailing list > >Log...@li... > > <https://lists.sourceforge.net/lists/listinfo/log4cpp-devel> = https://lists.sourceforge.net/lists/listinfo/log4cpp-devel > > > > > >=20 |