dda61e93bae3cf0480a04c13f72025bcbeacfcc9
[reactos.git] / reactos / drivers / lib / ip / network / memtrack.c
1 #define MEMTRACK_NO_POOL
2 #include "precomp.h"
3
4 #ifdef MEMTRACK
5
6 LIST_ENTRY AllocatedObjectsList;
7 KSPIN_LOCK AllocatedObjectsLock;
8 DWORD TagsToShow[MEMTRACK_MAX_TAGS_TO_TRACK] = { 0 };
9
10 VOID TrackTag( DWORD Tag ) {
11 UINT i;
12
13 for( i = 0; TagsToShow[i]; i++ );
14 TagsToShow[i] = Tag;
15 }
16
17 VOID TrackingInit() {
18 KeInitializeSpinLock( &AllocatedObjectsLock );
19 InitializeListHead( &AllocatedObjectsList );
20 }
21
22 VOID ShowTrackedThing( PCHAR What, PALLOCATION_TRACKER Thing,
23 PCHAR File, UINT Line ) {
24 /* if( ShowTag( Thing->Tag ) ) */
25 if( File ) {
26 DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d) (Called from %s:%d)\n",
27 What,
28 Thing->Thing,
29 ((PCHAR)&Thing->Tag)[3],
30 ((PCHAR)&Thing->Tag)[2],
31 ((PCHAR)&Thing->Tag)[1],
32 ((PCHAR)&Thing->Tag)[0],
33 Thing->FileName,
34 Thing->LineNo,
35 File, Line );
36 } else {
37 DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d)\n",
38 What,
39 Thing->Thing,
40 ((PCHAR)&Thing->Tag)[3],
41 ((PCHAR)&Thing->Tag)[2],
42 ((PCHAR)&Thing->Tag)[1],
43 ((PCHAR)&Thing->Tag)[0],
44 Thing->FileName,
45 Thing->LineNo );
46 }
47 }
48
49 VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR FileName, DWORD LineNo ) {
50 PALLOCATION_TRACKER TrackedThing =
51 ExAllocatePool( NonPagedPool, sizeof(*TrackedThing) );
52
53 KIRQL OldIrql;
54 PLIST_ENTRY Entry;
55 PALLOCATION_TRACKER ThingInList;
56
57 KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
58 Entry = AllocatedObjectsList.Flink;
59 while( Entry != &AllocatedObjectsList ) {
60 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
61 if( ThingInList->Thing == Thing ) {
62 RemoveEntryList(Entry);
63
64 KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
65 ShowTrackedThing( "Alloc", ThingInList, FileName, LineNo );
66 ExFreePool( ThingInList );
67 TrackDumpFL( FileName, LineNo );
68 DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing);
69 KeBugCheck( 0 );
70 }
71 Entry = Entry->Flink;
72 }
73
74 KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
75
76 if( TrackedThing ) {
77 TrackedThing->Tag = Tag;
78 TrackedThing->Thing = Thing;
79 TrackedThing->FileName = FileName;
80 TrackedThing->LineNo = LineNo;
81
82 ExInterlockedInsertTailList( &AllocatedObjectsList,
83 &TrackedThing->Entry,
84 &AllocatedObjectsLock );
85 ShowTrackedThing( "Alloc", TrackedThing, FileName, LineNo );
86 }
87
88 /*TrackDumpFL( FileName, LineNo );*/
89 }
90
91 BOOL ShowTag( DWORD Tag ) {
92 UINT i;
93
94 for( i = 0; TagsToShow[i] && TagsToShow[i] != Tag; i++ );
95
96 return TagsToShow[i] ? TRUE : FALSE;
97 }
98
99 VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ) {
100 KIRQL OldIrql;
101 PLIST_ENTRY Entry;
102 PALLOCATION_TRACKER ThingInList;
103
104 KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
105 Entry = AllocatedObjectsList.Flink;
106 while( Entry != &AllocatedObjectsList ) {
107 ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
108 if( ThingInList->Thing == Thing ) {
109 RemoveEntryList(Entry);
110
111 ShowTrackedThing( "Free ", ThingInList, File, Line );
112
113 ExFreePool( ThingInList );
114 KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
115 /* TrackDumpFL( File, Line ); */
116 return;
117 }
118 Entry = Entry->Flink;
119 }
120 KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
121 TrackDumpFL( File, Line );
122 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing);
123 KeBugCheck( 0 );
124 }
125
126 VOID TrackDumpFL( PCHAR File, DWORD Line ) {
127 KIRQL OldIrql;
128 PLIST_ENTRY Entry;
129 PALLOCATION_TRACKER Thing;
130
131 DbgPrint("Dump: %s:%d\n", File, Line);
132
133 KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql );
134 Entry = AllocatedObjectsList.Flink;
135 while( Entry != &AllocatedObjectsList ) {
136 Thing = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry);
137 ShowTrackedThing( "Dump ", Thing, 0, 0 );
138 Entry = Entry->Flink;
139 }
140 KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql );
141 }
142
143 #endif/*MEMTRACK*/