[ros-diffs] [cgutman] 44021: - Stop using the TCPLock to protect all entries into the IP lib - Instead use TCPLock only to protect entries into oskittcp

cgutman at svn.reactos.org cgutman at svn.reactos.org
Sat Nov 7 21:41:58 CET 2009


Author: cgutman
Date: Sat Nov  7 21:41:57 2009
New Revision: 44021

URL: http://svn.reactos.org/svn/reactos?rev=44021&view=rev
Log:
 - Stop using the TCPLock to protect all entries into the IP lib
 - Instead use TCPLock only to protect entries into oskittcp

Modified:
    trunk/reactos/drivers/network/tcpip/include/lock.h
    trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
    trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c
    trunk/reactos/drivers/network/tcpip/tcpip/lock.c
    trunk/reactos/drivers/network/tcpip/tcpip/mocklock.c
    trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
    trunk/reactos/lib/drivers/ip/transport/tcp/event.c
    trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c

Modified: trunk/reactos/drivers/network/tcpip/include/lock.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/include/lock.h?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/drivers/network/tcpip/include/lock.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/include/lock.h [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -13,8 +13,7 @@
 extern VOID TcpipAcquireFastMutex( PFAST_MUTEX Mutex );
 extern VOID TcpipReleaseFastMutex( PFAST_MUTEX Mutex );
 extern VOID TcpipRecursiveMutexInit( PRECURSIVE_MUTEX RecMutex );
-extern VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex,
-				      BOOLEAN ToWrite );
+extern VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex );
 extern VOID TcpipRecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex );
 
 #endif/*_LOCK_H*/

Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -352,8 +352,6 @@
 
   /* Get associated connection endpoint file object. Quit if none exists */
 
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
   TranContext = IrpSp->FileObject->FsContext;
   if (!TranContext) {
     TI_DbgPrint(MID_TRACE, ("Bad transport context.\n"));
@@ -384,8 +382,6 @@
   }
 
 done:
-  TcpipRecursiveMutexLeave( &TCPLock );
-
   if (Status != STATUS_PENDING) {
       DispDataRequestComplete(Irp, Status, 0);
   } else
@@ -464,8 +460,6 @@
 
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
   DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters;
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   /* Get associated connection endpoint file object. Quit if none exists */
 
@@ -492,8 +486,6 @@
       Irp );
 
 done:
-   TcpipRecursiveMutexLeave( &TCPLock );
-
    if (Status != STATUS_PENDING) {
        DispDataRequestComplete(Irp, Status, 0);
    } else
@@ -526,8 +518,6 @@
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
 
   /* Get associated connection endpoint file object. Quit if none exists */
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   TranContext = IrpSp->FileObject->FsContext;
   if (TranContext == NULL)
@@ -593,8 +583,6 @@
   }
 
 done:
-  TcpipRecursiveMutexLeave( &TCPLock );
-
   if (Status != STATUS_PENDING) {
       DispDataRequestComplete(Irp, Status, 0);
   } else
@@ -621,19 +609,15 @@
   PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters;
   PTRANSPORT_CONTEXT TranContext;
   PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
 
   TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
 
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
   Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters;
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   TranContext = IrpSp->FileObject->FsContext;
   if (!TranContext) {
     TI_DbgPrint(MID_TRACE, ("Bad transport context.\n"));
-    TcpipRecursiveMutexLeave(&TCPLock);
     return STATUS_INVALID_PARAMETER;
   }
 
@@ -651,7 +635,6 @@
             (FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) +
              sizeof(TDI_ADDRESS_IP))) {
           TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n"));
-          TcpipRecursiveMutexLeave(&TCPLock);
           return STATUS_BUFFER_TOO_SMALL;
         }
 
@@ -670,7 +653,6 @@
 			RtlZeroMemory(
 				&Address->Address[0].Address[0].sin_zero,
 				sizeof(Address->Address[0].Address[0].sin_zero));
-			TcpipRecursiveMutexLeave(&TCPLock);
 			return STATUS_SUCCESS;
 
           case TDI_CONNECTION_FILE:
@@ -681,12 +663,10 @@
 			RtlZeroMemory(
 				&Address->Address[0].Address[0].sin_zero,
 				sizeof(Address->Address[0].Address[0].sin_zero));
-			TcpipRecursiveMutexLeave(&TCPLock);
 			return STATUS_SUCCESS;
 
           default:
             TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n"));
-            TcpipRecursiveMutexLeave(&TCPLock);
             return STATUS_INVALID_PARAMETER;
         }
       }
@@ -701,7 +681,6 @@
             (FIELD_OFFSET(TDI_CONNECTION_INFORMATION, RemoteAddress) +
              sizeof(PVOID))) {
           TI_DbgPrint(MID_TRACE, ("MDL buffer too small (ptr).\n"));
-          TcpipRecursiveMutexLeave(&TCPLock);
           return STATUS_BUFFER_TOO_SMALL;
         }
 
@@ -721,24 +700,18 @@
 
           default:
             TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n"));
-            TcpipRecursiveMutexLeave(&TCPLock);
             return STATUS_INVALID_PARAMETER;
         }
 
         if (!Endpoint) {
           TI_DbgPrint(MID_TRACE, ("No connection object.\n"));
-          TcpipRecursiveMutexLeave(&TCPLock);
           return STATUS_INVALID_PARAMETER;
         }
 
-        Status = TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE );
-
-        TcpipRecursiveMutexLeave(&TCPLock);
-        return Status;
+        return TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE );
       }
   }
 
-  TcpipRecursiveMutexLeave(&TCPLock);
   return STATUS_NOT_IMPLEMENTED;
 }
 
@@ -763,8 +736,6 @@
 
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
   ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters);
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   TranContext = IrpSp->FileObject->FsContext;
   if (TranContext == NULL)
@@ -801,8 +772,6 @@
     }
 
 done:
-  TcpipRecursiveMutexLeave( &TCPLock );
-
   if (Status != STATUS_PENDING) {
       DispDataRequestComplete(Irp, Status, BytesReceived);
   } else
@@ -835,8 +804,6 @@
 
   IrpSp     = IoGetCurrentIrpStackLocation(Irp);
   DgramInfo = (PTDI_REQUEST_KERNEL_RECEIVEDG)&(IrpSp->Parameters);
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   TranContext = IrpSp->FileObject->FsContext;
   if (TranContext == NULL)
@@ -879,8 +846,6 @@
     }
 
 done:
-   TcpipRecursiveMutexLeave( &TCPLock );
-
    if (Status != STATUS_PENDING) {
        DispDataRequestComplete(Irp, Status, BytesReceived);
    } else
@@ -912,8 +877,6 @@
 
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
   SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters);
-
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
   TranContext = IrpSp->FileObject->FsContext;
   if (TranContext == NULL)
@@ -955,8 +918,6 @@
     }
 
 done:
-   TcpipRecursiveMutexLeave( &TCPLock );
-
    if (Status != STATUS_PENDING) {
        DispDataRequestComplete(Irp, Status, BytesSent);
    } else
@@ -988,8 +949,6 @@
 
     IrpSp       = IoGetCurrentIrpStackLocation(Irp);
     DgramInfo   = (PTDI_REQUEST_KERNEL_SENDDG)&(IrpSp->Parameters);
-
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
 
     TranContext = IrpSp->FileObject->FsContext;
     if (TranContext == NULL)
@@ -1037,8 +996,6 @@
     }
 
 done:
-    TcpipRecursiveMutexLeave( &TCPLock );
-
     if (Status != STATUS_PENDING) {
         DispDataRequestComplete(Irp, Status, Irp->IoStatus.Information);
     } else

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=44021&r1=44020&r2=44021&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] Sat Nov  7 21:41:57 2009
@@ -382,9 +382,7 @@
   case IPPROTO_TCP:
     TCPFreePort( AddrFile->Port );
     if( AddrFile->Listener ) {
-            TcpipRecursiveMutexEnter(&TCPLock, TRUE);
 	    TCPClose( AddrFile->Listener );
-            TcpipRecursiveMutexLeave(&TCPLock);
 	    exFreePool( AddrFile->Listener );
     }
     break;
@@ -425,9 +423,7 @@
 
   if( !Connection ) return STATUS_NO_MEMORY;
 
-  TcpipRecursiveMutexEnter(&TCPLock, TRUE);
   Status = TCPSocket( Connection, AF_INET, SOCK_STREAM, IPPROTO_TCP );
-  TcpipRecursiveMutexLeave(&TCPLock);
 
   if( !NT_SUCCESS(Status) ) {
       TCPFreeConnectionEndpoint( Connection );
@@ -500,9 +496,7 @@
   RemoveEntryList(&Connection->ListEntry);
   TcpipReleaseSpinLock(&ConnectionEndpointListLock, OldIrql);
 
-  TcpipRecursiveMutexEnter( &TCPLock, TRUE );
   TCPClose( Connection );
-  TcpipRecursiveMutexLeave( &TCPLock );
 
   TCPFreeConnectionEndpoint(Connection);
 

Modified: trunk/reactos/drivers/network/tcpip/tcpip/lock.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip/lock.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/lock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/lock.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -48,7 +48,7 @@
     RecursiveMutexInit( RecMutex );
 }
 
-VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) {
+VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex ) {
     //TI_DbgPrint(DEBUG_LOCK,("Locking\n"));
     RecursiveMutexEnter( RecMutex );
 }

Modified: trunk/reactos/drivers/network/tcpip/tcpip/mocklock.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip/mocklock.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/mocklock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/mocklock.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -48,8 +48,7 @@
 VOID TcpipRecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) {
 }
 
-UINT TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOL ToWrite ) {
-    return 0;
+VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex ) {
 }
 
 VOID TcpipRecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) {

Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tcp/accept.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -19,14 +19,14 @@
     PTA_IP_ADDRESS RequestAddressReturn;
     PTDI_CONNECTION_INFORMATION WhoIsConnecting;
 
-    ASSERT_LOCKED(&TCPLock);
-
     /* Unpack TDI info -- We need the return connection information
      * struct to return the address so it can be filtered if needed
      * by WSAAccept -- The returned address will be passed on to
      * userland after we complete this irp */
     WhoIsConnecting = (PTDI_CONNECTION_INFORMATION)
     Request->ReturnConnectionInformation;
+
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     Status = TCPTranslateError
     ( OskitTCPAccept( Listener->SocketContext,
@@ -35,6 +35,8 @@
               sizeof(OutAddr),
               &OutAddrLen,
               Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) );
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
 
@@ -70,8 +72,6 @@
     NTSTATUS Status = STATUS_SUCCESS;
     SOCKADDR_IN AddressToBind;
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
     ASSERT(Connection);
     ASSERT_KM_POINTER(Connection->SocketContext);
     ASSERT_KM_POINTER(Connection->AddressFile);
@@ -88,6 +88,8 @@
     AddressToBind.sin_port = Connection->AddressFile->Port;
 
     TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr, AddressToBind.sin_port));
+
+    TcpipRecursiveMutexEnter( &TCPLock );
 
     Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext,
                         &AddressToBind,
@@ -138,12 +140,8 @@
 
     TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
     Status = TCPServiceListeningSocket( Listener, Connection,
                        (PTDI_REQUEST_KERNEL)Request );
-
-    TcpipRecursiveMutexLeave( &TCPLock );
 
     if( Status == STATUS_PENDING ) {
         Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );

Modified: trunk/reactos/lib/drivers/ip/transport/tcp/event.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tcp/event.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/event.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/event.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -44,7 +44,15 @@
 
     Connection->SignalState |= NewState;
 
+    TcpipRecursiveMutexLeave(&TCPLock);
+
+    /* We must not be locked when handling signalled connections 
+     * because a completion could trigger another IOCTL which
+     * would cause a deadlock
+     */
     NewState = HandleSignalledConnection(Connection);
+
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     KeAcquireSpinLock(&SignalledConnectionsLock, &OldIrql);
     if ((NewState == 0 || NewState == SEL_FIN) &&

Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c?rev=44021&r1=44020&r2=44021&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Sat Nov  7 21:41:57 2009
@@ -27,8 +27,6 @@
     PLIST_ENTRY Entry;
     PIRP Irp;
     PMDL Mdl;
-
-    ASSERT_LOCKED(&TCPLock);
 
     TI_DbgPrint(MID_TRACE,("Handling signalled state on %x (%x)\n",
                            Connection, Connection->SocketContext));
@@ -337,7 +335,7 @@
                     UINT Family, UINT Type, UINT Proto ) {
     NTSTATUS Status;
 
-    ASSERT_LOCKED(&TCPLock);
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("Called: Connection %x, Family %d, Type %d, "
                            "Proto %d\n",
@@ -353,6 +351,8 @@
 
     TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
                            Connection->SocketContext));
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     return Status;
 }
@@ -370,7 +370,7 @@
                            IPPacket->TotalSize,
                            IPPacket->HeaderSize));
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+    TcpipRecursiveMutexEnter( &TCPLock );
 
     OskitTCPReceiveDatagram( IPPacket->Header,
                              IPPacket->TotalSize,
@@ -447,12 +447,13 @@
             PsTerminateSystemThread(Status);
         }
 
-        TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+        TcpipRecursiveMutexEnter( &TCPLock );
         TimerOskitTCP( Next == NextFast, Next == NextSlow );
+        TcpipRecursiveMutexLeave( &TCPLock );
+
         if (Next == NextSlow) {
             DrainSignals();
         }
-        TcpipRecursiveMutexLeave( &TCPLock );
 
         Current = Next;
         if (10 <= Current) {
@@ -496,7 +497,7 @@
         return Status;
     }
 
-    TcpipRecursiveMutexEnter(&TCPLock, TRUE);
+    TcpipRecursiveMutexEnter(&TCPLock);
     RegisterOskitTCPEventHandlers( &EventHandlers );
     InitOskitTCP();
     TcpipRecursiveMutexLeave(&TCPLock);
@@ -544,7 +545,9 @@
 
     TCPInitialized = FALSE;
 
+    TcpipRecursiveMutexEnter(&TCPLock);
     DeinitOskitTCP();
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     PortsShutdown( &TCPPorts );
 
@@ -597,8 +600,6 @@
 
     TI_DbgPrint(DEBUG_TCP,("TCPConnect: Called\n"));
 
-    ASSERT_LOCKED(&TCPLock);
-
     Status = AddrBuildAddress
         ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress,
          &RemoteAddress,
@@ -623,6 +624,8 @@
     AddressToConnect.sin_family = AF_INET;
     AddressToBind = AddressToConnect;
     AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address;
+
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     Status = TCPTranslateError
         ( OskitTCPBind( Connection->SocketContext,
@@ -655,6 +658,8 @@
         }
     }
 
+    TcpipRecursiveMutexLeave(&TCPLock);
+
     return Status;
 }
 
@@ -671,11 +676,15 @@
 
     TI_DbgPrint(DEBUG_TCP,("started\n"));
 
+    TcpipRecursiveMutexEnter(&TCPLock);
+
     if (Flags & TDI_DISCONNECT_RELEASE)
         Status = TCPTranslateError(OskitTCPDisconnect(Connection->SocketContext));
 
     if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
         Status = TCPTranslateError(OskitTCPShutdown(Connection->SocketContext, FWRITE | FREAD));
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("finished %x\n", Status));
 
@@ -688,15 +697,17 @@
 
     TI_DbgPrint(DEBUG_TCP,("TCPClose started\n"));
 
-    ASSERT_LOCKED(&TCPLock);
-
     /* Make our code remove all pending IRPs */
     Connection->SignalState |= SEL_FIN;
     HandleSignalledConnection(Connection);
 
+    TcpipRecursiveMutexEnter(&TCPLock);
+
     Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) );
     if (Status == STATUS_SUCCESS)
         Connection->SocketContext = NULL;
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("TCPClose finished %x\n", Status));
 
@@ -719,13 +730,13 @@
     TI_DbgPrint(DEBUG_TCP,("Called for %d bytes (on socket %x)\n",
                            ReceiveLength, Connection->SocketContext));
 
-    ASSERT_LOCKED(&TCPLock);
-
     ASSERT_KM_POINTER(Connection->SocketContext);
 
     NdisQueryBuffer( Buffer, &DataBuffer, &DataLen );
 
     TI_DbgPrint(DEBUG_TCP,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen));
+
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     Status = TCPTranslateError
         ( OskitTCPRecv
@@ -734,6 +745,8 @@
             DataLen,
             &Received,
             ReceiveFlags ) );
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received));
 
@@ -787,11 +800,14 @@
     TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext = %x\n",
                            Connection->SocketContext));
 
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     Status = TCPTranslateError
         ( OskitTCPSend( Connection->SocketContext,
                         (OSK_PCHAR)BufferData, SendLength,
                         &Sent, 0 ) );
+
+    TcpipRecursiveMutexLeave(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCP,("OskitTCPSend: %x, %d\n", Status, Sent));
 
@@ -850,11 +866,14 @@
     PTA_IP_ADDRESS AddressIP = (PTA_IP_ADDRESS)Address;
     NTSTATUS Status;
 
-    ASSERT_LOCKED(&TCPLock);
+    TcpipRecursiveMutexEnter(&TCPLock);
 
     Status = TCPTranslateError(OskitTCPGetAddress(Connection->SocketContext,
                                                   &LocalAddress, &LocalPort,
                                                   &RemoteAddress, &RemotePort));
+
+    TcpipRecursiveMutexLeave(&TCPLock);
+
     if (!NT_SUCCESS(Status))
         return Status;
 




More information about the Ros-diffs mailing list