Stuck in a 'for' loop in _Watchdog_Insert.
Gedare Bloom
gedare at gwmail.gwu.edu
Fri May 21 01:38:41 UTC 2010
I had a similar bug but it was because I was changing some code in
task management. I had interrupts enabled between when a task was
killed and the task's watchdog was removed from the chain. This
caused corruption of the watchdog chain. Maybe you have some similar
situation?
-Gedare
On Thu, May 20, 2010 at 11:13 AM, Nick Thomas <nick.thomas at pixsan.com> wrote:
>
>> Nick,
>>
>> unfortunately you do not provide real information about the system you
>> are using. So it is really difficult to help you :-(
>>
>
> Hi Thomas,
>
> The system I am using is RTEMS 4.7.1. It's code in watchdoginsert.c,
> watchdogadjust.c and watchdogtickle.c, these are all in cpukit/score/src.
> So, they are not specific to any hardware.
>
> There is already a comment in _Watchdog_Tickle in watchdogtickle.c which
> says this:
>
> /*
> * For some reason, on rare occasions the_watchdog->delta_interval
> * of the head of the watchdog chain is 0. Before this test was
> * added, on these occasions an event (which usually was supposed
> * to have a timeout of 1 tick would have a delta_interval of 0, which
> * would be decremented to 0xFFFFFFFF by the unprotected
> * "the_watchdog->delta_interval--;" operation.
> * This would mean the event would not timeout, and also the chain would
> * be blocked, because a timeout with a very high number would be at the
> * head, rather than at the end.
> * The test "if (the_watchdog->delta_interval != 0)"
> * here prevents this from occuring.
> *
> * We were not able to categorically identify the situation that causes
> * this, but proved it to be true empirically. So this check causes
> * correct behaviour in this circumstance.
> *
> * The belief is that a race condition exists whereby an event at the head
> * of the chain is removed (by a pending ISR or higher priority task)
> * during the _ISR_Flash( level ); in _Watchdog_Insert, but the watchdog
> * to be inserted has already had its delta_interval adjusted to 0, and
> * so is added to the head of the chain with a delta_interval of 0.
> *
> * Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
> */
>
> This describes pretty much the behavior I am seeing, i.e.
> the_watchdog->delta_interval == 0.
>
> However, contrary to the above comments - removing the _ISR_Flash( level )
> call from _Watchdog_Insert doesn't fix the issue.
>
> I understand why I am stuck in this 'for' loop when this happens, but I
> don't understand why this code doesn't break out of it when we get to the
> end of the linked list:
>
> if ( delta_interval == 0 || !_Watchdog_Next( after ) )
> break;
>
> i.e. why doesn't !_Watchdog_Next( after ) return NULL at the end of the
> list?
>
> For some reason it points back to itself!!!!! So the for loop is still
> engaged.
>
>
> Regards
>
> Nick
>
>
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users
>
More information about the users
mailing list