|
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
>>>
>>
>>
>
>
|