From: Bastiaan B. <bas...@li...> - 2002-04-04 19:46:45
|
Hi, Yes, I see the stupid bug now, a misplaced '}'. Thanks for reporting it! Bastiaan Jak...@no... wrote: >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 = _appender.begin(); > i != _appender.end(); i++) { > // found > OwnsAppenderMap::iterator i2; > if (ownsAppender(*i, i2)) { > delete (*i); > } > > _ownsAppender.clear(); > _appender.clear(); > } > } > } > > >cheers, >--jakub > > > > > >>-----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 = _appender.begin(); >>> i != _appender.end(); i++) { >>> // found >>> OwnsAppenderMap::iterator i2; >>> if (ownsAppender(*i, i2)) { >>> delete (*i); >>> } >>> >>> _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 = _appender.begin(); >>> i != _appender.end(); ) { >>> // found >>> app = *i; >>> i2 = i; >>> i++; >>> >>> OwnsAppenderMap::iterator i3; >>> if (ownsAppender(*i2, i3)) { >>> delete app; >>> } >>> } >>> >>> _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 >>> >> >> > > |