summaryrefslogtreecommitdiffstats
path: root/private/ntos/afd/spinlock.txt
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/afd/spinlock.txt')
-rw-r--r--private/ntos/afd/spinlock.txt440
1 files changed, 440 insertions, 0 deletions
diff --git a/private/ntos/afd/spinlock.txt b/private/ntos/afd/spinlock.txt
new file mode 100644
index 000000000..6eea232ec
--- /dev/null
+++ b/private/ntos/afd/spinlock.txt
@@ -0,0 +1,440 @@
+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-Crap
+ Synopsis:
+ Strategy:
+
+ Function: AfdBeginDisconnect
+ Protects: Bunch-O-Crap, 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:
+
+