[ros-diffs] [cgutman] 36442: - Use timers so the code is much more simple and works better

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Sep 24 01:59:44 CEST 2008


Author: cgutman
Date: Tue Sep 23 18:59:43 2008
New Revision: 36442

URL: http://svn.reactos.org/svn/reactos?rev=36442&view=rev
Log:
 - Use timers so the code is much more simple and works better

Modified:
    branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c

Modified: branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c
URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c?rev=36442&r1=36441&r2=36442&view=diff
==============================================================================
--- branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c [iso-8859-1] (original)
+++ branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c [iso-8859-1] Tue Sep 23 18:59:43 2008
@@ -635,24 +635,20 @@
 }
 
 VOID STDCALL
-HangTimer( PVOID Context )
-{
-  PLOGICAL_ADAPTER Adapter = Context;
-  BOOLEAN AddressingReset;
-
-  while (Adapter->NdisMiniportBlock.PnPDeviceState == NdisPnPDeviceStarted)
-  {
-    AddressingReset = FALSE;
-
-    NdisMSleep(Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000000);
-
-    if (MiniCheckForHang(Adapter))
-        MiniReset(Adapter, &AddressingReset);
-
-    /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
-  }
-
-  PsTerminateSystemThread(STATUS_SUCCESS);
+MiniportHangDpc(
+        PKDPC Dpc,
+        PVOID DeferredContext,
+        PVOID SystemArgument1,
+        PVOID SystemArgument2)
+{
+  PLOGICAL_ADAPTER Adapter = DeferredContext;
+  BOOLEAN AddressingReset = FALSE;
+
+
+  if (MiniCheckForHang(Adapter))
+      MiniReset(Adapter, &AddressingReset);
+
+  /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
 }
 
 
@@ -1442,9 +1438,8 @@
   PNDIS_CONFIGURATION_PARAMETER ConfigParam;
   NDIS_HANDLE ConfigHandle;
   ULONG Size;
-  HANDLE HangTimerHandle;
-  
-/* FIXME - KIRQL OldIrql; */
+  LARGE_INTEGER Timeout;
+  /* FIXME - KIRQL OldIrql; */
 
   /*
    * Prepare wrapper context used by HW and configuration routines.
@@ -1663,9 +1658,10 @@
   Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
 
-  PsCreateSystemThread(&HangTimerHandle, THREAD_ALL_ACCESS, 0, 0, 0,
-                       HangTimer, Adapter);
-  ZwClose(HangTimerHandle);
+  Timeout.QuadPart = (LONGLONG)Adapter->NdisMiniportBlock.CheckForHangSeconds * -1000000;
+  KeSetTimerEx(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer, Timeout,
+               Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000,
+               &Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc);
 
   /* Put adapter in adapter list for this miniport */
   ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock);
@@ -1721,6 +1717,8 @@
 
   Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped;
+
+  KeCancelTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer);
 
   return STATUS_SUCCESS;
 }
@@ -1908,7 +1906,9 @@
   Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
 
-  KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, (PVOID)Adapter);
+  KeInitializeTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer);
+  KeInitializeDpc(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc, MiniportHangDpc, Adapter);
+  KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, Adapter);
 
   DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 



More information about the Ros-diffs mailing list