diff options
Diffstat (limited to 'private/ntos/afd/spinlock.txt')
-rw-r--r-- | private/ntos/afd/spinlock.txt | 440 |
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: + + |