[NDIS]
authorCameron Gutman <aicommander@gmail.com>
Sun, 6 Jun 2010 19:18:19 +0000 (19:18 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 6 Jun 2010 19:18:19 +0000 (19:18 +0000)
- Only dequeue the timer in the DPC if the Period is 0 (which means that it's NOT a periodic timer so we only get called once)
- Attempt to dequeue the timer before inserting it so we don't end up with multiple copies of the same timer on the timer queue if somebody calls NdisMSet(Periodic)Timer twice

svn path=/trunk/; revision=47636

reactos/drivers/network/ndis/ndis/time.c

index 0872ee7..d03acb9 100644 (file)
@@ -95,7 +95,7 @@ NdisInitializeTimer(
   KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext);
 }
 
-VOID DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
+BOOLEAN DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
 {
   PNDIS_MINIPORT_TIMER CurrentTimer;
 
@@ -104,6 +104,8 @@ VOID DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
   if (Timer->Miniport->TimerQueue == Timer)
   {
       Timer->Miniport->TimerQueue = Timer->NextDeferredTimer;
+      Timer->NextDeferredTimer = NULL;
+      return TRUE;
   }
   else
   {
@@ -113,11 +115,12 @@ VOID DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
           if (CurrentTimer->NextDeferredTimer == Timer)
           {
               CurrentTimer->NextDeferredTimer = Timer->NextDeferredTimer;
-              return;
+              Timer->NextDeferredTimer = NULL;
+              return TRUE;
           }
           CurrentTimer = CurrentTimer->NextDeferredTimer;
       }
-      ASSERT(FALSE);
+      return FALSE;
   }
 }
 
@@ -161,8 +164,8 @@ MiniTimerDpcFunction(PKDPC Dpc,
                                SystemArgument1,
                                SystemArgument2);
 
-  /* FIXME: We can't call this if we have a periodic timer */
-  //DequeueMiniportTimer(Timer);
+  /* Only dequeue if the timer has a period of 0 */
+  if (!Timer->Timer.Period) DequeueMiniportTimer(Timer);
 }
 
 \f
@@ -227,6 +230,9 @@ NdisMSetPeriodicTimer(
   /* relative delays are negative, absolute are positive; resolution is 100ns */
   Timeout.QuadPart = Int32x32To64(MillisecondsPeriod, -10000);
 
+  /* Dequeue the timer if it is queued already */
+  DequeueMiniportTimer(Timer);
+
   /* Add the timer at the head of the timer queue */
   Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
   Timer->Miniport->TimerQueue = Timer;
@@ -262,6 +268,9 @@ NdisMSetTimer(
   /* relative delays are negative, absolute are positive; resolution is 100ns */
   Timeout.QuadPart = Int32x32To64(MillisecondsToDelay, -10000);
 
+  /* Dequeue the timer if it is queued already */
+  DequeueMiniportTimer(Timer);
+
   /* Add the timer at the head of the timer queue */
   Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
   Timer->Miniport->TimerQueue = Timer;