- Actually zero the select events in ZeroEvents
[reactos.git] / reactos / drivers / network / afd / afd / select.c
index 010c816..b78ee07 100644 (file)
@@ -47,8 +47,10 @@ static VOID ZeroEvents( PAFD_HANDLE HandleArray,
                 UINT HandleCount ) {
     UINT i;
 
-    for( i = 0; i < HandleCount; i++ )
+    for( i = 0; i < HandleCount; i++ ) {
        HandleArray[i].Status = 0;
+       HandleArray[i].Events = 0;
+    }
 }
 
 
@@ -194,9 +196,6 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
         }
     }
 
-    ZeroEvents( PollReq->Handles,
-               PollReq->HandleCount );
-
        KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
 
        for( i = 0; i < PollReq->HandleCount; i++ ) {
@@ -205,23 +204,16 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
            FileObject = (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle;
            FCB = FileObject->FsContext;
 
-           if( (FCB->PollState & AFD_EVENT_CLOSE) ||
-               (PollReq->Handles[i].Status & AFD_EVENT_CLOSE) ) {
-               PollReq->Handles[i].Events = 0;
-               PollReq->Handles[i].Status = AFD_EVENT_CLOSE;
-               Signalled++;
-           } else {
-                AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
-                PrintEvents( PollReq->Handles[i].Events );
-                AFD_DbgPrint(MID_TRACE,("\n"));
-
-               PollReq->Handles[i].Status =
+            AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
+            PrintEvents( PollReq->Handles[i].Events );
+            AFD_DbgPrint(MID_TRACE,("\n"));
+
+           PollReq->Handles[i].Status =
                    PollReq->Handles[i].Events & FCB->PollState;
-               if( PollReq->Handles[i].Status ) {
+           if( PollReq->Handles[i].Status ) {
                    AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
                                            FCB, FCB->PollState));
                    Signalled++;
-               }
            }
        }
 
@@ -286,7 +278,6 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
                            EventSelectInfo->EventObject,
                            EventSelectInfo->Events));
 
-    FCB->EventSelectTriggers = FCB->EventsFired = 0;
     if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
     FCB->EventSelect = NULL;
 
@@ -303,8 +294,8 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
            FCB->EventSelect = NULL;
        else
            FCB->EventSelectTriggers = EventSelectInfo->Events;
-    } else /* Work done, cancelling select */
-       Status = STATUS_SUCCESS;
+    } else
+       Status = STATUS_INVALID_PARAMETER;
 
     AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
 
@@ -370,7 +361,6 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
     PAFD_FCB FCB;
     KIRQL OldIrql;
     PAFD_POLL_INFO PollReq;
-    PKEVENT EventSelect = NULL;
 
     AFD_DbgPrint(MID_TRACE,("Called: DeviceExt %x FileObject %x\n",
                            DeviceExt, FileObject));
@@ -385,16 +375,6 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
        return;
     }
 
-    /* Not sure if i can do this at DISPATCH_LEVEL ... try it at passive */
-    AFD_DbgPrint(MID_TRACE,("Current State: %x, Events Fired: %x, "
-                           "Select Triggers %x\n",
-                           FCB->PollState, FCB->EventsFired,
-                           FCB->EventSelectTriggers));
-    if( FCB->PollState & ~FCB->EventsFired & FCB->EventSelectTriggers ) {
-       FCB->EventsFired |= FCB->PollState;
-       EventSelect = FCB->EventSelect;
-    }
-
     /* Now signal normal select irps */
     ThePollEnt = DeviceExt->Polls.Flink;
 
@@ -413,8 +393,10 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
 
     KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
 
-    AFD_DbgPrint(MID_TRACE,("Setting event %x\n", EventSelect));
-    if( EventSelect ) KeSetEvent( EventSelect, IO_NETWORK_INCREMENT, FALSE );
+    if( FCB->EventSelect && (FCB->PollState & FCB->EventSelectTriggers) ) {
+        AFD_DbgPrint(MID_TRACE,("Setting event %x\n", FCB->EventSelect));
+        KeSetEvent( FCB->EventSelect, IO_NETWORK_INCREMENT, FALSE );
+    }
 
     AFD_DbgPrint(MID_TRACE,("Leaving\n"));
 }