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: