Tag trackers allow allocations to be marked with a tag that can later be used to filter allocation events.
Here's a simple example function using tag trackers:
void exampleFunc()
{
int i;
for(i = 0; i < getNumWorkUnits(); i++)
{
svlDataTracker trackWorkUnits("workunit"); // Set current tracker to be 'workunit'
processWorkUnits(i);
}
}
In this example all memory allocations, reallocations and deallocations that happen inside processWorkUnits() have the tag workunit.
In the more complex code fragment below, three tags are used to classify the actions of the functions called.
Note that when the Flowers tracker starts, the Cats tracker is temporarily suspended, to be resumed when the Flowers tracker falls out of scope.
createAFish("Pike"); // no tracker
{
svlDataTracker tracker_cats("Cats");
createAnAnimal("Lion"); // cats tracker
createAnAnimal("Tiger"); // cats tracker
createAnAnimal("Panther"); // cats tracker
{
svlDataTracker tracker_flowers("Flowers");
createAFlower("Daffodil"); // flowers tracker
createAFlower("Rose"); // flowers tracker
{
svlDataTracker tracker_trees("Trees");
createATree("Oak"); // trees tracker
createATree("Sycamore"); // trees tracker
createATree("Ash"); // trees tracker
createATree("Horse Chestnut");// trees tracker
}
createAFlower("Lily"); // flowers tracker
}
createAnAnimal("Leopard"); // cats tracker
createAnAnimal("Cheetah"); // cats tracker
createAnAnimal("Cougar"); // cats tracker
}
createAFish("Salmon"); // no tracker
The svlDataTracker class used in the examples above is defined in svlDataTracker.h and svlDataTracker.cpp which should be in the API folder of the Memory Validator installation directory.
The class is written so as not to include any dependencies on Memory Validator into your application.
The class will only activate the Memory Validator functionality if using Memory Validator with your application, and otherwise does nothing.
To use svlDataTracker in your application:
•#include svlDataTracker.h into each file you will be using svlDataTracker
•use the svlDataTracker class as shown above
Do not dynamically create svlDataTracker objects as this will break the tag scoping rules and make them behave unpredictably.
If you're not using C++, here's a couple of options:
An object oriented solution
If you're using an object oriented language such as Delphi you can create a Delphi equivalent to svlDataTracker.
You'll find the source code for svlDataTracker in svlDataTracker.cpp and this should be easy enough to understand for you to be able to create a suitable implementation for your object orientated language.
An API solution
The C++ and object orientated solutions both use the Memory Validator API.
You can also link your own program with the Memory Validator stub, and use the API directly.
The API provides two functions (among others) exported from svlMemoryValidatorStub.dll:
•mvPushTracker(char *trackerName) pushes a tag tracker on to the tag stack, making it the 'current' tag
•mvPopTracker() pops the current tag tracker from the top of the tag stack, making the next one (if any) current
You can find out more about the API solution for tag tracking as well as other API functions in these topics:
•Calling the API functions using GetProcAddress
•Calling the tag tracker functions above