- Check that all pins have been closed when the last filter reference is gone
[reactos.git] / reactos / lib / drivers / ip / network / memtrack.c
1 #define MEMTRACK_NO_POOL
2 #include "precomp.h"
3
4
5 #if DBG
6 #define TRACK_TAG TAG('T','r','C','K')
7
8 static LIST_ENTRY AllocatedObjectsList;
9 static KSPIN_LOCK AllocatedObjectsLock;
10 static NPAGED_LOOKASIDE_LIST AllocatedObjectsLookasideList;
11
12 VOID TrackingInit() {
13 TcpipInitializeSpinLock( &AllocatedObjectsLock );
14 InitializeListHead( &AllocatedObjectsList );
15 ExInitializeNPagedLookasideList(&AllocatedObjectsLookasideList,
16 NULL,
17 NULL,
18 0,
19 sizeof(ALLOCATION_TRACKER),
20 TRACK_TAG,
21 0 );
22 }
23
24 VOID ShowTrackedThing( PCHAR What, PALLOCATION_TRACKER Thing, BOOLEAN ForceShow ) {
25
26 if (ForceShow)
27 {
28 DbgPrint("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
29 What,
30 Thing->Thing,
31 ((PCHAR)&Thing->Tag)[3],
32 ((PCHAR)&Thing->Tag)[2],
33 ((PCHAR)&Thing->Tag)[1],
34 ((PCHAR)&Thing->Tag)[0],
35 Thing->FileName,
36 Thing->LineNo);
37 }
38 else
39 {
40 TI_DbgPrint(MAX_TRACE,
41 ("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
42 What,
43 Thing->Thing,
44 ((PCHAR)&Thing->Tag)[3],
45 ((PCHAR)&Thing->Tag)[2],
46 ((PCHAR)&Thing->Tag)[1],
47 ((PCHAR)&Thing->Tag)[0],
48 Thing->FileName,
49 Thing->LineNo));
50 }
51 }
52
53 VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
54 PALLOCATION_TRACKER TrackedThing =
55 ExAllocateFromNPagedLookasideList( &AllocatedObjectsLookasideList );
56
57 KIRQL OldIrql;
58 PLIST_ENTRY Entry;
59 PALLOCATION_TRACKER ThingInList;
60
61 if (!TrackedThing) return;
62
63 TrackedThing->Tag = Tag;
64 TrackedThing->Thing = Thing;
65 TrackedThing->FileName = FileName;
66 TrackedThing->LineNo = LineNo;
67
68 ShowTrackedThing( "Alloc", TrackedThing, FALSE );
69
70 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
71 Entry = AllocatedObjectsList.Flink;
72 while( Entry != &AllocatedObjectsList ) {
73 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
74 if( ThingInList->Thing == Thing ) {
75 RemoveEntryList(Entry);
76
77 ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, TRUE );
78 ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, TRUE );
79
80 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
81 ThingInList );
82
83 break;
84 }
85 Entry = Entry->Flink;
86 }
87
88 InsertHeadList( &AllocatedObjectsList, &TrackedThing->Entry );
89
90 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
91 }
92
93 VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
94 KIRQL OldIrql;
95 PLIST_ENTRY Entry;
96 PALLOCATION_TRACKER ThingInList;
97
98 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
99 Entry = AllocatedObjectsList.Flink;
100 while( Entry != &AllocatedObjectsList ) {
101 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
102 if( ThingInList->Thing == Thing ) {
103 RemoveEntryList(Entry);
104
105 ShowTrackedThing( "Free ", ThingInList, FALSE );
106
107 if ( ThingInList->Tag != Tag ) {
108 DbgPrint("UNTRACK: TAG DOES NOT MATCH (%x)\n", Thing);
109 ShowTrackedThing("Tag Mismatch (Item in list)", ThingInList, TRUE);
110 ASSERT( FALSE );
111 }
112
113 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
114 ThingInList );
115
116 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
117
118 return;
119 }
120 Entry = Entry->Flink;
121 }
122 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
123
124 DbgPrint("[Double Free] Thing %08x %c%c%c%c (%s:%d)\n",
125 Thing,
126 ((PCHAR)&Tag)[3],
127 ((PCHAR)&Tag)[2],
128 ((PCHAR)&Tag)[1],
129 ((PCHAR)&Tag)[0],
130 File,
131 Line);
132
133 ASSERT( FALSE );
134 }
135
136 VOID TrackDumpFL( PCHAR File, ULONG Line ) {
137 KIRQL OldIrql;
138 PLIST_ENTRY Entry;
139 PALLOCATION_TRACKER Thing;
140
141 TI_DbgPrint(MAX_TRACE,("Dump: %s:%d\n", File, Line));
142
143 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
144 Entry = AllocatedObjectsList.Flink;
145 while( Entry != &AllocatedObjectsList ) {
146 Thing = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
147 ShowTrackedThing( "Dump ", Thing, FALSE );
148 Entry = Entry->Flink;
149 }
150 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
151 }
152
153 #endif /* DBG */