aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-19 08:44:57 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-19 08:44:57 +0000
commit552244724c5a88fb1a9d47750450fbfa3d9badba (patch)
tree878e4319539620bc12f0bb4675401125ff796ef3 /src
parente2ebed86bf2aff904d9b89765771e03bd8e74433 (diff)
downloadriscv-openocd-552244724c5a88fb1a9d47750450fbfa3d9badba.zip
riscv-openocd-552244724c5a88fb1a9d47750450fbfa3d9badba.tar.gz
riscv-openocd-552244724c5a88fb1a9d47750450fbfa3d9badba.tar.bz2
Michael Fischer found and Edgar Grimberg fixed generic crash in timers reproduceable with at91fr40008
git-svn-id: svn://svn.berlios.de/openocd/trunk@663 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/target/target.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/target/target.c b/src/target/target.c
index d5e4ea5..7ab7a7c 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -748,21 +748,24 @@ static int target_call_timer_callbacks_check_time(int checktime)
(((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
|| (now.tv_sec > callback->when.tv_sec)))
{
- callback->callback(callback->priv);
- if (callback->periodic)
+ if(callback->callback != NULL)
{
- int time_ms = callback->time_ms;
- callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
- time_ms -= (time_ms % 1000);
- callback->when.tv_sec = now.tv_sec + time_ms / 1000;
- if (callback->when.tv_usec > 1000000)
+ callback->callback(callback->priv);
+ if (callback->periodic)
{
- callback->when.tv_usec = callback->when.tv_usec - 1000000;
- callback->when.tv_sec += 1;
+ int time_ms = callback->time_ms;
+ callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
+ time_ms -= (time_ms % 1000);
+ callback->when.tv_sec = now.tv_sec + time_ms / 1000;
+ if (callback->when.tv_usec > 1000000)
+ {
+ callback->when.tv_usec = callback->when.tv_usec - 1000000;
+ callback->when.tv_sec += 1;
+ }
}
+ else
+ target_unregister_timer_callback(callback->callback, callback->priv);
}
- else
- target_unregister_timer_callback(callback->callback, callback->priv);
}
callback = next_callback;