summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/nbf/spnlckdb.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/tdi/nbf/spnlckdb.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/private/ntos/tdi/nbf/spnlckdb.c b/private/ntos/tdi/nbf/spnlckdb.c
new file mode 100644
index 000000000..485431ad5
--- /dev/null
+++ b/private/ntos/tdi/nbf/spnlckdb.c
@@ -0,0 +1,156 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ spnlckdb.c
+
+Abstract:
+
+ This module contains code which allows debugging of spinlock related NBF
+ problems. Most of this code is conditional on the manifest constant
+ NBF_LOCKS.
+
+Author:
+
+ David Beaver 13-Feb-1991
+ (From Chuck Lenzmeier, Jan 1991)
+
+Environment:
+
+ Kernel mode
+
+Revision History:
+
+--*/
+
+#include "precomp.h"
+#pragma hdrstop
+
+#ifdef NBF_LOCKS
+
+KSPIN_LOCK NbfGlobalLock = NULL;
+PKTHREAD NbfGlobalLockOwner = NULL;
+ULONG NbfGlobalLockRecursionCount = 0;
+ULONG NbfGlobalLockMaxRecursionCount = 0;
+KIRQL NbfGlobalLockPreviousIrql = (KIRQL)-1;
+BOOLEAN NbfGlobalLockPrint = 1;
+
+#define PRINT_ERR if ( (NbfGlobalLockPrint & 1) != 0 ) DbgPrint
+#define PRINT_INFO if ( (NbfGlobalLockPrint & 2) != 0 ) DbgPrint
+
+VOID
+NbfAcquireSpinLock(
+ IN PKSPIN_LOCK Lock,
+ OUT PKIRQL OldIrql,
+ IN PSZ LockName,
+ IN PSZ FileName,
+ IN ULONG LineNumber
+ )
+{
+ KIRQL previousIrql;
+
+ PKTHREAD currentThread = KeGetCurrentThread( );
+
+ if ( NbfGlobalLockOwner == currentThread ) {
+
+ ASSERT( Lock != NULL ); // else entering NBF with lock held
+
+ ASSERT( NbfGlobalLockRecursionCount != 0 );
+ NbfGlobalLockRecursionCount++;
+ if ( NbfGlobalLockRecursionCount > NbfGlobalLockMaxRecursionCount ) {
+ NbfGlobalLockMaxRecursionCount = NbfGlobalLockRecursionCount;
+ }
+
+ PRINT_INFO( "NBF reentered from %s/%ld, new count %ld\n",
+ FileName, LineNumber, NbfGlobalLockRecursionCount );
+
+ } else {
+
+ ASSERT( Lock == NULL ); // else missing an ENTER_NBF call
+
+ KeAcquireSpinLock( &NbfGlobalLock, &previousIrql );
+
+ ASSERT( NbfGlobalLockRecursionCount == 0 );
+ NbfGlobalLockOwner = currentThread;
+ NbfGlobalLockPreviousIrql = previousIrql;
+ NbfGlobalLockRecursionCount = 1;
+
+ PRINT_INFO( "NBF entered from %s/%ld\n", FileName, LineNumber );
+
+ }
+
+ ASSERT( KeGetCurrentIrql() == DISPATCH_LEVEL );
+
+ return;
+
+} // NbfAcquireSpinLock
+
+VOID
+NbfReleaseSpinLock(
+ IN PKSPIN_LOCK Lock,
+ IN KIRQL OldIrql,
+ IN PSZ LockName,
+ IN PSZ FileName,
+ IN ULONG LineNumber
+ )
+{
+ PKTHREAD currentThread = KeGetCurrentThread( );
+ KIRQL previousIrql;
+
+ ASSERT( NbfGlobalLockOwner == currentThread );
+ ASSERT( NbfGlobalLockRecursionCount != 0 );
+ ASSERT( KeGetCurrentIrql() == DISPATCH_LEVEL );
+
+ if ( --NbfGlobalLockRecursionCount == 0 ) {
+
+ ASSERT( Lock == NULL ); // else not exiting NBF, but releasing lock
+
+ NbfGlobalLockOwner = NULL;
+ previousIrql = NbfGlobalLockPreviousIrql;
+ NbfGlobalLockPreviousIrql = (KIRQL)-1;
+
+ PRINT_INFO( "NBF exited from %s/%ld\n", FileName, LineNumber );
+
+ KeReleaseSpinLock( &NbfGlobalLock, previousIrql );
+
+ } else {
+
+ ASSERT( Lock != NULL ); // else exiting NBF with lock held
+
+ PRINT_INFO( "NBF semiexited from %s/%ld, new count %ld\n",
+ FileName, LineNumber, NbfGlobalLockRecursionCount );
+
+ }
+
+ return;
+
+} // NbfReleaseSpinLock
+
+VOID
+NbfFakeSendCompletionHandler(
+ IN NDIS_HANDLE ProtocolBindingContext,
+ IN PNDIS_PACKET NdisPacket,
+ IN NDIS_STATUS NdisStatus
+ )
+{
+ ENTER_NBF;
+ NbfSendCompletionHandler (ProtocolBindingContext, NdisPacket, NdisStatus);
+ LEAVE_NBF;
+}
+
+VOID
+NbfFakeTransferDataComplete (
+ IN NDIS_HANDLE BindingContext,
+ IN PNDIS_PACKET NdisPacket,
+ IN NDIS_STATUS NdisStatus,
+ IN UINT BytesTransferred
+ )
+{
+ ENTER_NBF;
+ NbfTransferDataComplete (BindingContext, NdisPacket, NdisStatus, BytesTransferred);
+ LEAVE_NBF;
+}
+
+#endif // def NBF_LOCKS