From 4c4d83fa6e7adaa3dcbe4dd804da4b9067a118e2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 5 Apr 2009 07:23:25 +0000 Subject: [PATCH] - 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 svn path=/trunk/; revision=40367 --- .../drivers/network/tcpip/tcpip/fileobjs.c | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c index ff1b591ac45..7c7ccef34d0 100644 --- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c @@ -139,11 +139,11 @@ VOID ControlChannelFree( } -VOID DeleteAddress(PADDRESS_FILE AddrFile) +NTSTATUS FileCloseAddress(PTDI_REQUEST Request) /* - * FUNCTION: Deletes an address file object + * FUNCTION: Closes an address file object * ARGUMENTS: - * AddrFile = Pointer to address file object to delete + * AddrFile = Pointer to address file object to close */ { KIRQL OldIrql; @@ -151,16 +151,16 @@ VOID DeleteAddress(PADDRESS_FILE AddrFile) 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 */ /* Return pending requests with error */ @@ -197,9 +197,9 @@ VOID DeleteAddress(PADDRESS_FILE AddrFile) TcpipReleaseSpinLock(&AddrFile->Lock, OldIrql); - (*AddrFile->Free)(AddrFile); - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + + return STATUS_SUCCESS; } @@ -339,7 +339,7 @@ NTSTATUS FileOpenAddress( * RETURNS: * Status of operation */ -NTSTATUS FileCloseAddress( +NTSTATUS FileFreeAddress( PTDI_REQUEST Request) { KIRQL OldIrql; @@ -350,13 +350,10 @@ NTSTATUS FileCloseAddress( 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 @@ NTSTATUS FileCloseAddress( 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")); + (*AddrFile->Free)(AddrFile); return Status; }