1 #define MEMTRACK_NO_POOL
6 LIST_ENTRY AllocatedObjectsList
;
7 KSPIN_LOCK AllocatedObjectsLock
;
8 DWORD TagsToShow
[MEMTRACK_MAX_TAGS_TO_TRACK
] = { 0 };
10 VOID
TrackTag( DWORD Tag
) {
13 for( i
= 0; TagsToShow
[i
]; i
++ );
18 TcpipInitializeSpinLock( &AllocatedObjectsLock
);
19 InitializeListHead( &AllocatedObjectsList
);
22 VOID
ShowTrackedThing( PCHAR What
, PALLOCATION_TRACKER Thing
,
23 PCHAR File
, UINT Line
) {
24 /* if( ShowTag( Thing->Tag ) ) */
26 TI_DbgPrint(MAX_TRACE
,
27 ("[%s] Thing %08x %c%c%c%c (%s:%d) (Called from %s:%d)\n",
30 ((PCHAR
)&Thing
->Tag
)[3],
31 ((PCHAR
)&Thing
->Tag
)[2],
32 ((PCHAR
)&Thing
->Tag
)[1],
33 ((PCHAR
)&Thing
->Tag
)[0],
38 TI_DbgPrint(MAX_TRACE
,
39 ( "[%s] Thing %08x %c%c%c%c (%s:%d)\n",
42 ((PCHAR
)&Thing
->Tag
)[3],
43 ((PCHAR
)&Thing
->Tag
)[2],
44 ((PCHAR
)&Thing
->Tag
)[1],
45 ((PCHAR
)&Thing
->Tag
)[0],
51 VOID
TrackWithTag( DWORD Tag
, PVOID Thing
, PCHAR FileName
, DWORD LineNo
) {
52 PALLOCATION_TRACKER TrackedThing
=
53 PoolAllocateBuffer( sizeof(*TrackedThing
) );
57 PALLOCATION_TRACKER ThingInList
;
59 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
60 Entry
= AllocatedObjectsList
.Flink
;
61 while( Entry
!= &AllocatedObjectsList
) {
62 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
63 if( ThingInList
->Thing
== Thing
) {
64 RemoveEntryList(Entry
);
66 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
67 ShowTrackedThing( "Alloc", ThingInList
, FileName
, LineNo
);
68 PoolFreeBuffer( ThingInList
);
69 TrackDumpFL( FileName
, LineNo
);
70 DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing
);
77 TrackedThing
->Tag
= Tag
;
78 TrackedThing
->Thing
= Thing
;
79 TrackedThing
->FileName
= FileName
;
80 TrackedThing
->LineNo
= LineNo
;
83 InsertTailList( &AllocatedObjectsList
, &TrackedThing
->Entry
);
84 ShowTrackedThing( "Alloc", TrackedThing
, FileName
, LineNo
);
87 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
89 /*TrackDumpFL( FileName, LineNo );*/
92 BOOL
ShowTag( DWORD Tag
) {
95 for( i
= 0; TagsToShow
[i
] && TagsToShow
[i
] != Tag
; i
++ );
97 return TagsToShow
[i
] ? TRUE
: FALSE
;
100 VOID
UntrackFL( PCHAR File
, DWORD Line
, PVOID Thing
) {
103 PALLOCATION_TRACKER ThingInList
;
105 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
106 Entry
= AllocatedObjectsList
.Flink
;
107 while( Entry
!= &AllocatedObjectsList
) {
108 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
109 if( ThingInList
->Thing
== Thing
) {
110 RemoveEntryList(Entry
);
112 ShowTrackedThing( "Free ", ThingInList
, File
, Line
);
114 PoolFreeBuffer( ThingInList
);
115 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
116 /* TrackDumpFL( File, Line ); */
119 Entry
= Entry
->Flink
;
121 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
122 TrackDumpFL( File
, Line
);
123 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing
);
127 VOID
TrackDumpFL( PCHAR File
, DWORD Line
) {
130 PALLOCATION_TRACKER Thing
;
132 TI_DbgPrint(MAX_TRACE
,("Dump: %s:%d\n", File
, Line
));
134 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
135 Entry
= AllocatedObjectsList
.Flink
;
136 while( Entry
!= &AllocatedObjectsList
) {
137 Thing
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
138 ShowTrackedThing( "Dump ", Thing
, 0, 0 );
139 Entry
= Entry
->Flink
;
141 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);