AfdSpinLock Usage ~~~~~~~~~~~~~~~~~ ACCEPT.C Function: AfdDeferAccept Protects: Endpoint->Common.VcListening.UnacceptedConnectionListHead Synopsis: Used when deferring an accept (putting a connection back on the endpoint's unaccepted connection queue). Strategy: None. Deferring accepted connections is a very low frequency operation (and is impossible in WinSock 1.1). BIND.C Function: AfdRestartGetAddress Protects: Endpoint->LocalAddress[Length] Synopsis: Used when allocating an endpoint's local address buffer to prevent multiple processors from allocating the buffer. Strategy: None. AfdGetAddress is only called during bind() and getsockname() APIs. The bind() call is certainly more interesting than getsockname(), but even bind() is only called once per socket, so it is unlikely there would be any benefit in tuning this. BLKCONN.C Function: AfdAddFreeConnection Protects: Endpoint->Common.VcListening.FreeConnectionListHead Synopsis: Used when adding free connections to the endpoint's free connection queue. Strategy: Use SLIST for free connection queue. Function: AfdFreeConnection Protects: Endpoint->Common.VcListening.FreeConnectionListHead Synopsis: Used when appending a reused connection to the endpoint's free connection queue. Strategy: Use SLIST for free connection queue. Function: AfdDereferenceConnection Protects: Connection->ReferenceCount Synopsis: Synchronizes access to reference count member. Strategy: Use InterlockedDecrement. If updated value is now zero, then acquire AfdSpinLock, and recheck the value for zero. If it's still zero, do the usual dereference stuff. This will eliminate all spinlock acquisitions on reference/ dereference except the *last* dereference. Function: AfdGetFreeConnection Protects: Endpoint->Common.VcListening.FreeConnectionListHead Synopsis: Used when removing a free connection from the endpoint's free connection queue. Strategy: Use SLIST for free connection queue. Function: AfdGetReturnedConnection Protects: Endpoint->Common.VcListening.ReturnedConnectionListHead Synopsis: Used when scanning the returned connection queue for a specific sequence number. Strategy: None (for now). Function: AfdReferenceConnection Protects: Connection->ReferenceCount Synopsis: Synchronizes access to reference count member. Strategy: Use InterlockedIncrement instead. BLKENDP.C Function: AfdFreeQueuedConnections Protects: Endpoint->Common.VcListening.UnacceptedConnectionListHead Synopsis: Used when puring the endpoint's unaccepted connection queue. Strategy: None (for now). Function: AfdDereferenceEndpoint Protects: Endpoint->ReferenceCount Synopsis: Synchronizes access to reference count member. Strategy: Use InterlockedDecrement. If updated value is now zero, then acquire AfdSpinLock, and recheck the value for zero. If it's still zero, do the usual dereference stuff. This will eliminate all spinlock acquisitions on reference/ dereference except the *last* dereference. Function: AfdReferenceEndpoint Protects: Endpoint->ReferenceCount Synopsis: Synchronizes access to reference count member. Strategy: Use InterlockedIncrement instead. CLOSE.C Function: AfdCleanup Protects: Synopsis: Strategy: CONNECT.C Function: AfdSetupConnectDataBuffers Protects: Endpoint->ConnectDataBuffers Synopsis: Used to guard connect data buffers when they're moved from an endpoint to a connection. Strategy: Do the "double compare" trick to avoid acquiring the spinlock if there are no connect data buffers on the endpoint. Function: AfdRestartConnect Protects: Connection->ConnectDataBuffers Synopsis: Used to guard connect data buffers after a connect completes. Strategy: Do the "double compare" trick to avoid acquiring the spinlock if there are no connect data buffers on the connection. DISCONN.C Function: AfdPartialDisconnect(1) Protects: Endpoint->DisconnectMode Synopsis: Used to guard the disconnect mode bits when shutting down a datagram endpoint. Strategy: Test a Bunch-O-Bits in the endpoint, and only if at least one of these is nonzero acquire the spinlock, then proceed with the current tests. Function: AfdPartialDisconnect(2) Protects: Connection->Common.Bufferring.Receive[Expedited]BytesTaken Synopsis: Used to guard access to the byte counters in the connection when receives are shutdown so that the connection can be aborted if necessary. Strategy: None (for now). Function: AfdDisconnectEventHandler Protects: Connection->ConnectDataBuffers Synopsis: Used to guard disconnect data buffers when a disconnect indication is received. Strategy: Do the "double compare" trick to avoid acquiring the spinlock if there are no connect data buffers on the connection. Function: AfdBeginAbort Protects: Bunch-O-Stuff Synopsis: Strategy: Function: AfdBeginDisconnect Protects: Bunch-O-Stuff, including disconnect buffers Synopsis: Strategy: Function: AfdRestartDisconnect Protects: DisconnectContext->DisconnectListEntry Synopsis: Guards access to AfdDisconnectListHead Strategy: AfdDisconnectListHead no longer used. Nuke it! LISTEN.C Function: AfdWaitForListen Protects: Synopsis: Strategy: Function: AfdCancelWaitForListen Protects: Synopsis: Strategy: Function: AfdConnectEventHandler Protects: Synopsis: Strategy: Function: AfdRestartAccept Protects: Synopsis: Strategy: MISC.C Function: AfdInsertNewEndpointInList Protects: Synopsis: Strategy: Function: AfdRemoveEndpointFromList Protects: Synopsis: Strategy: Function: AfdInterlockedRemoveEntryList Protects: Synopsis: Strategy: Function: AfdGetConnectData Protects: Synopsis: Strategy: Function: AfdSetConnectData Protects: Synopsis: Strategy: Function: AfdQueueWorkItem Protects: Synopsis: Strategy: Function: AfdDoWork Protects: Synopsis: Strategy: POLL.C Function: AfdPoll Protects: Synopsis: Strategy: Function: AfdCancelPoll Protects: Synopsis: Strategy: Function: AfdIndicatePollEvent Protects: Synopsis: Strategy: Function: AfdTimeoutPoll Protects: Synopsis: Strategy: RECEIVE.C Function: AfdReceive Protects: Synopsis: Strategy: Function: AfdRestartReceive Protects: Synopsis: Strategy: Function: AfdReceiveEventHandler Protects: Synopsis: Strategy: Function: AfdReceiveExpeditedEventHandler Protects: Synopsis: Strategy: Function: AfdQueryReceiveInformation Protects: Synopsis: Strategy: SEND.C Function: AfdRestartBufferSend Protects: Connection->VcDisconnectIrp Synopsis: Used to grab the disconnect IRP off a connection. Strategy: Use InterlockedExchange. Will require changes to blkconn!AfdFreeConnection. AfdBufferSpinLock Usage ~~~~~~~~~~~~~~~~~~~~~~~ BUFFER.C Function: AfdGetBuffer Protects: Afd{Small|Medium|Large}BufferListHead Synopsis: Serializes access to the various buffer lists. Strategy: Use DaveC's SLIST instead. We'll still need the spinlock for PPC. Function: AfdReturnBuffer Protects: Afd{Small|Medium|Large}BufferListHead Synopsis: Serializes access to the various buffer lists. Strategy: Use DaveC's SLIST instead. We'll still need the spinlock for PPC. Endpoint->SpinLock Usage ~~~~~~~~~~~~~~~~~~~~~~~~ ACCEPT.C Function: AfdAcceptCore Protects: Synopsis: Strategy: BLKCONN.C Function: AfdAddConnectedReference Protects: Connection->ConnectedReferenceAdded Synopsis: Strategy: Function: AfdDeleteConnectedReference Protects: Synopsis: Strategy: CLOSE.C Function: AfdCleanup Protects: Endpoint->{Receive|Peek}DatagramIrpListHead, Endpoint->Vc{Receive|Send}IrpListHead, Connection->CleanupBegun, Endpoint->TransmitIrp Synopsis: Strategy: CONNECT.C Function: AfdDoDatagramConnect Protects: Endpoint->Common.Datagram.RemoteAddress[Length] Synopsis: Strategy: Function: AfdRestartConnect Protects: Connection->ConnectedReferenceAdded Synopsis: Strategy: Function: AfdEnabledFailedConnectEvent Protects: Endpoint->EventsEnabled Synopsis: Strategy: DISCONN.C Function: AfdDisconnectEventHandler Protects: Connection->Vc{Receive|Send}IrpListHead, Connection->VcByteCounts Synopsis: Strategy: Function: AfdBeginAbort Protects: Connection->Vc{Receive|Send}IrpListHead, Synopsis: Strategy: Function: AfdRestartAbort Protects: Connection->Vc{Receive|Send}IrpListHead, Synopsis: Strategy: EVENTSEL.C Function: AfdEventSelect Protects: Endpoint->EventSelectStuff Synopsis: Strategy: Function: AfdEnumNetworkEvents Protects: Endpoint->EventSelectStuff Synopsis: Strategy: FASTIO.C Function: Protects: Synopsis: Strategy: POLL.C Function: Protects: Synopsis: Strategy: RECEIVE.C Function: Protects: Synopsis: Strategy: RECVDG.C Function: Protects: Synopsis: Strategy: RECVVC.C Function: Protects: Synopsis: Strategy: SEND.C Function: Protects: Synopsis: Strategy: TRANFILE.C Function: Protects: Synopsis: Strategy: