Author: cgutman
Date: Sun Apr  5 11:23:25 2009
New Revision: 40367

URL: http://svn.reactos.org/svn/reactos?rev=40367&view=rev
Log:
 - Distinguish between cleanup and close properly
 - On cleanup, we cancel all requests
 - On close, we remove the address file from the list, free the port and 
listener (if present), then free the address file itself

Modified:
    trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c

Modified: trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c?rev=40367&r1=40366&r2=40367&view=diff
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] Sun Apr  
5 11:23:25 2009
@@ -139,11 +139,11 @@
 }
 
 
-VOID DeleteAddress(PADDRESS_FILE AddrFile)
-/*
- * FUNCTION: Deletes an address file object
- * ARGUMENTS:
- *     AddrFile = Pointer to address file object to delete
+NTSTATUS FileCloseAddress(PTDI_REQUEST Request)
+/*
+ * FUNCTION: Closes an address file object
+ * ARGUMENTS:
+ *     AddrFile = Pointer to address file object to close
  */
 {
   KIRQL OldIrql;
@@ -151,15 +151,15 @@
   PLIST_ENTRY NextEntry;
   PDATAGRAM_SEND_REQUEST SendRequest;
   PDATAGRAM_RECEIVE_REQUEST ReceiveRequest;
+  PADDRESS_FILE AddrFile = Request->Handle.AddressHandle;
 
   TI_DbgPrint(MID_TRACE, ("Called.\n"));
 
-  /* Remove address file from the global list */
-  TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
-  RemoveEntryList(&AddrFile->ListEntry);
-  TcpipReleaseSpinLock(&AddressFileListLock, OldIrql);
-
   TcpipAcquireSpinLock(&AddrFile->Lock, &OldIrql);
+
+  /* Set address file object exclusive to us */
+  AF_SET_BUSY(AddrFile);
+  AF_CLR_VALID(AddrFile);
 
   /* FIXME: Kill TCP connections on this address file object */
 
@@ -197,9 +197,9 @@
 
   TcpipReleaseSpinLock(&AddrFile->Lock, OldIrql);
 
-  (*AddrFile->Free)(AddrFile);
-
-  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+
+  return STATUS_SUCCESS;
 }
 
 
@@ -339,7 +339,7 @@
  * RETURNS:
  *     Status of operation
  */
-NTSTATUS FileCloseAddress(
+NTSTATUS FileFreeAddress(
   PTDI_REQUEST Request)
 {
   KIRQL OldIrql;
@@ -350,13 +350,10 @@
 
   AddrFile = Request->Handle.AddressHandle;
 
-  TcpipAcquireSpinLock(&AddrFile->Lock, &OldIrql);
-
-  /* Set address file object exclusive to us */
-  AF_SET_BUSY(AddrFile);
-  AF_CLR_VALID(AddrFile);
-
-  TcpipReleaseSpinLock(&AddrFile->Lock, OldIrql);
+  /* Remove address file from the global list */
+  TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
+  RemoveEntryList(&AddrFile->ListEntry);
+  TcpipReleaseSpinLock(&AddressFileListLock, OldIrql);
 
   /* Protocol specific handling */
   switch (AddrFile->Protocol) {
@@ -372,33 +369,9 @@
     UDPFreePort( AddrFile->Port );
     break;
   }
-
-  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-
-  return Status;
-}
-
-
-/*
- * FUNCTION: Closes an address file object
- * ARGUMENTS:
- *     Request = Pointer to TDI request structure for this request
- * RETURNS:
- *     Status of operation
- */
-NTSTATUS FileFreeAddress(
-  PTDI_REQUEST Request)
-{
-  PADDRESS_FILE AddrFile;
-  NTSTATUS Status = STATUS_SUCCESS;
-
-  AddrFile = Request->Handle.AddressHandle;
-
-  TI_DbgPrint(MID_TRACE, ("Called.\n"));
-
-  DeleteAddress(AddrFile);
-
-  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+
+  (*AddrFile->Free)(AddrFile);
 
   return Status;
 }

Reply via email to