- In Win32 DBG is defined to 0 for a non-debug build and to 1 for a debug build....
[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 ULONG TagsToShow[MEMTRACK_MAX_TAGS_TO_TRACK] = { 0 };
12
13 VOID TrackTag( ULONG Tag ) {
14 UINT i;
15
16 for( i = 0; TagsToShow[i]; i++ );
17 TagsToShow[i] = Tag;
18 }
19
20 VOID TrackingInit() {
21 TcpipInitializeSpinLock( &AllocatedObjectsLock );
22 InitializeListHead( &AllocatedObjectsList );
23 ExInitializeNPagedLookasideList(&AllocatedObjectsLookasideList,
24 NULL,
25 NULL,
26 0,
27 sizeof(ALLOCATION_TRACKER),
28 TRACK_TAG,
29 0 );
30 }
31
32 VOID ShowTrackedThing( PCHAR What, PALLOCATION_TRACKER Thing, BOOLEAN ForceShow ) {
33
34 if (ForceShow)
35 {
36 DbgPrint("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
37 What,
38 Thing->Thing,
39 ((PCHAR)&Thing->Tag)[3],
40 ((PCHAR)&Thing->Tag)[2],
41 ((PCHAR)&Thing->Tag)[1],
42 ((PCHAR)&Thing->Tag)[0],
43 Thing->FileName,
44 Thing->LineNo);
45 }
46 else
47 {
48 TI_DbgPrint(MAX_TRACE,
49 ("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
50 What,
51 Thing->Thing,
52 ((PCHAR)&Thing->Tag)[3],
53 ((PCHAR)&Thing->Tag)[2],
54 ((PCHAR)&Thing->Tag)[1],
55 ((PCHAR)&Thing->Tag)[0],
56 Thing->FileName,
57 Thing->LineNo));
58 }
59 }
60
61 VOID TrackWithTag( ULONG Tag, PVOID Thing, PCHAR FileName, ULONG LineNo ) {
62 PALLOCATION_TRACKER TrackedThing =
63 ExAllocateFromNPagedLookasideList( &AllocatedObjectsLookasideList );
64
65 KIRQL OldIrql;
66 PLIST_ENTRY Entry;
67 PALLOCATION_TRACKER ThingInList;
68
69 if (!TrackedThing) return;
70
71 TrackedThing->Tag = Tag;
72 TrackedThing->Thing = Thing;
73 TrackedThing->FileName = FileName;
74 TrackedThing->LineNo = LineNo;
75
76 ShowTrackedThing( "Alloc", TrackedThing, FALSE );
77
78 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
79 Entry = AllocatedObjectsList.Flink;
80 while( Entry != &AllocatedObjectsList ) {
81 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
82 if( ThingInList->Thing == Thing ) {
83 RemoveEntryList(Entry);
84
85 TI_DbgPrint(MAX_TRACE,("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing));
86 ShowTrackedThing( "Double Alloc (Item in list)", ThingInList, FALSE );
87 ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing, FALSE );
88
89 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
90 ThingInList );
91
92 break;
93 }
94 Entry = Entry->Flink;
95 }
96
97 InsertHeadList( &AllocatedObjectsList, &TrackedThing->Entry );
98
99 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
100 }
101
102 BOOLEAN ShowTag( ULONG Tag ) {
103 UINT i;
104
105 for( i = 0; TagsToShow[i] && TagsToShow[i] != Tag; i++ );
106
107 return TagsToShow[i] ? TRUE : FALSE;
108 }
109
110 VOID UntrackFL( PCHAR File, ULONG Line, PVOID Thing, ULONG Tag ) {
111 KIRQL OldIrql;
112 PLIST_ENTRY Entry;
113 PALLOCATION_TRACKER ThingInList;
114
115 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
116 Entry = AllocatedObjectsList.Flink;
117 while( Entry != &AllocatedObjectsList ) {
118 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
119 if( ThingInList->Thing == Thing ) {
120 RemoveEntryList(Entry);
121
122 ShowTrackedThing( "Free ", ThingInList, FALSE );
123
124 if ( ThingInList->Tag != Tag ) {
125 DbgPrint("UNTRACK: TAG DOES NOT MATCH (%x)\n", Thing);
126 ShowTrackedThing("Tag Mismatch (Item in list)", ThingInList, TRUE);
127 ASSERT( FALSE );
128 }
129
130 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList,
131 ThingInList );
132
133 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
134
135 /* TrackDumpFL( File, Line ); */
136 return;
137 }
138 Entry = Entry->Flink;
139 }
140 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
141 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing);
142 ASSERT( FALSE );
143 }
144
145 VOID TrackDumpFL( PCHAR File, ULONG Line ) {
146 KIRQL OldIrql;
147 PLIST_ENTRY Entry;
148 PALLOCATION_TRACKER Thing;
149
150 TI_DbgPrint(MAX_TRACE,("Dump: %s:%d\n", File, Line));
151
152 TcpipAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
153 Entry = AllocatedObjectsList.Flink;
154 while( Entry != &AllocatedObjectsList ) {
155 Thing = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
156 ShowTrackedThing( "Dump ", Thing, FALSE );
157 Entry = Entry->Flink;
158 }
159 TcpipReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
160 }
161
162 #endif /* DBG */