- Use a spin lock to protect OSKit instead of a recursive mutex
[reactos.git] / reactos / lib / drivers / ip / transport / tcp / accept.c
index f44c0c9..b99c03b 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "precomp.h"
 
+/* Listener->Lock MUST be acquired */
 NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
                     PCONNECTION_ENDPOINT Connection,
                     PTDI_REQUEST_KERNEL Request ) {
@@ -26,18 +27,15 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
     WhoIsConnecting = (PTDI_CONNECTION_INFORMATION)
     Request->ReturnConnectionInformation;
 
-    TcpipRecursiveMutexEnter(&TCPLock);
-
     Status = TCPTranslateError
     ( OskitTCPAccept( Listener->SocketContext,
               &Connection->SocketContext,
+              Connection,
               &OutAddr,
               sizeof(OutAddr),
               &OutAddrLen,
               Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) );
 
-    TcpipRecursiveMutexLeave(&TCPLock);
-
     TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status));
 
     if( NT_SUCCESS(Status) && Status != STATUS_PENDING ) {
@@ -71,11 +69,14 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
 NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
     NTSTATUS Status = STATUS_SUCCESS;
     SOCKADDR_IN AddressToBind;
+    KIRQL OldIrql;
 
     ASSERT(Connection);
     ASSERT_KM_POINTER(Connection->SocketContext);
     ASSERT_KM_POINTER(Connection->AddressFile);
 
+    KeAcquireSpinLock(&Connection->Lock, &OldIrql);
+
     TI_DbgPrint(DEBUG_TCP,("TCPListen started\n"));
 
     TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
@@ -89,8 +90,6 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
 
     TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr, AddressToBind.sin_port));
 
-    TcpipRecursiveMutexEnter( &TCPLock );
-
     Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext,
                         &AddressToBind,
                         sizeof(AddressToBind) ) );
@@ -98,7 +97,7 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
     if (NT_SUCCESS(Status))
         Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog ) );
 
-    TcpipRecursiveMutexLeave( &TCPLock );
+    KeReleaseSpinLock(&Connection->Lock, OldIrql);
 
     TI_DbgPrint(DEBUG_TCP,("TCPListen finished %x\n", Status));
 
@@ -137,12 +136,17 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request,
 {
     NTSTATUS Status;
     PTDI_BUCKET Bucket;
+    KIRQL OldIrql;
 
     TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
 
+    KeAcquireSpinLock(&Listener->Lock, &OldIrql);
+
     Status = TCPServiceListeningSocket( Listener, Connection,
                        (PTDI_REQUEST_KERNEL)Request );
 
+    KeReleaseSpinLock(&Listener->Lock, OldIrql);
+
     if( Status == STATUS_PENDING ) {
         Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
 
@@ -150,8 +154,8 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request,
             Bucket->AssociatedEndpoint = Connection;
             Bucket->Request.RequestNotifyObject = Complete;
             Bucket->Request.RequestContext = Context;
-            IoMarkIrpPending((PIRP)Context);
-            ExInterlockedInsertTailList( &Listener->ListenRequest, &Bucket->Entry, &Listener->Lock );
+            ExInterlockedInsertTailList( &Listener->ListenRequest, &Bucket->Entry,
+                                         &Listener->Lock );
         } else
             Status = STATUS_NO_MEMORY;
     }