Index: B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/core/complib/user/cl_timer.c
===================================================================
--- B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/core/complib/user/cl_timer.c	(revision 5977)
+++ B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/core/complib/user/cl_timer.c	(revision 5978)
@@ -33,25 +33,27 @@
 
 #include "complib/cl_timer.h"
 
-
 static void CALLBACK
 __timer_callback( 
 	IN cl_timer_t* const p_timer,
 	IN BOOLEAN timer_signalled )
 {
 	/* timer_signalled is always TRUE, and has no value. */
+	
+	DWORD thread_id = GetCurrentThreadId();
 	CL_ASSERT( timer_signalled );
+
 	UNUSED_PARAM( timer_signalled );
 
+	CL_ASSERT(thread_id!=0);
+
 	p_timer->timeout_time = 0;
-	p_timer->thread_id = GetCurrentThreadId();
+	p_timer->thread_id = thread_id;
 
 	(p_timer->pfn_callback)( (void*)p_timer->context );
 
-	p_timer->thread_id = 0;
 }
 
-
 void
 cl_timer_construct(
 	IN	cl_timer_t* const	p_timer )
@@ -76,7 +78,8 @@
 
 	p_timer->pfn_callback = pfn_callback;
 	p_timer->context = context;
-	return( CL_SUCCESS );
+	return cl_spinlock_init(&p_timer->spinlock);
+	
 }
 
 
@@ -97,6 +100,8 @@
 {
 	CL_ASSERT( p_timer );
 
+	cl_spinlock_acquire(&p_timer->spinlock);
+	
 	cl_timer_stop( p_timer );
 
 	p_timer->timeout_time = cl_get_time_stamp() + (((uint64_t)time_ms) * 1000);
@@ -104,9 +109,12 @@
 	if( !CreateTimerQueueTimer( &p_timer->h_timer, NULL, __timer_callback,
 		p_timer, time_ms, 0, WT_EXECUTEINIOTHREAD ) )
 	{
+		
+		cl_spinlock_release(&p_timer->spinlock);
 		return( CL_ERROR );
 	}
 	
+	cl_spinlock_release(&p_timer->spinlock);
 	return( CL_SUCCESS );
 }
 
@@ -117,26 +125,34 @@
 	IN	const uint32_t		time_ms )
 {
 	uint64_t		timeout_time;
+	cl_status_t		status;
 
 	CL_ASSERT( p_timer );
 	CL_ASSERT( p_timer->pfn_callback );
 
+	cl_spinlock_acquire(&p_timer->spinlock);
+
 	/* Calculate the timeout time in the timer object. */
 	timeout_time = cl_get_time_stamp() + (((uint64_t)time_ms) * 1000);
 
 	/* Only pull in the timeout time. */
-	if( p_timer->timeout_time && p_timer->timeout_time < timeout_time )
+	if( p_timer->timeout_time && p_timer->timeout_time < timeout_time ) {
+		cl_spinlock_release(&p_timer->spinlock);
 		return( CL_SUCCESS );
+	}
 
-	return cl_timer_start( p_timer, time_ms );
+	status = cl_timer_start( p_timer, time_ms );
+	
+	cl_spinlock_release(&p_timer->spinlock);
+	return status;
 }
 
-
 void
 cl_timer_stop(
 	IN	cl_timer_t* const	p_timer )
 {
 	CL_ASSERT( p_timer );
+	cl_spinlock_acquire(&p_timer->spinlock);
 
 	if( p_timer->h_timer && p_timer->thread_id != GetCurrentThreadId() )
 	{
@@ -145,6 +161,8 @@
 		p_timer->h_timer = NULL;
 	}
 	p_timer->timeout_time = 0;
+	
+	cl_spinlock_release(&p_timer->spinlock);
 }
 
 
Index: B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/complib/cl_timer.h
===================================================================
--- B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/complib/cl_timer.h	(revision 5977)
+++ B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/complib/cl_timer.h	(revision 5978)
@@ -45,8 +45,8 @@
 
 
 #include <complib/cl_types.h>
+#include <complib/cl_spinlock.h>
 
-
 /****h* Component Library/Timer
 * NAME
 *	Timer
Index: B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/user/complib/cl_timer_osd.h
===================================================================
--- B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/user/complib/cl_timer_osd.h	(revision 5977)
+++ B:/users/tzachid/MLNX_WinOF-2_1_1/MLNX_WinOF-2_1_1/inc/user/complib/cl_timer_osd.h	(revision 5978)
@@ -47,8 +47,9 @@
 	const void				*context;
 	uint64_t				timeout_time;
 	DWORD					thread_id;
+	cl_spinlock_t			spinlock;
 
 } cl_timer_t;
 
 
-#endif	// _CL_TIMER_OSD_H_
\ No newline at end of file
+#endif	// _CL_TIMER_OSD_H_
