From 552244724c5a88fb1a9d47750450fbfa3d9badba Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Mon, 19 May 2008 08:44:57 +0000
Subject: 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
---
 src/target/target.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

(limited to 'src')

diff --git a/src/target/target.c b/src/target/target.c
index d5e4ea56..7ab7a7c6 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;
-- 
cgit v1.2.3