/* * \file memoryusageobserver.cpp * * This class represents a Singleton for observing memory usage. */ #include "memoryusageobserver.hpp" MemoryUsageObserver* MemoryUsageObserver::instance = NULL; /** * Constructor. Do not use this function. Use getInstance() instead. * * \return memory usage observer instance */ MemoryUsageObserver::MemoryUsageObserver() { instance = NULL; } /** * Destructor. Better use purgeInstance(). */ MemoryUsageObserver::~MemoryUsageObserver() { for (map::iterator current = memoryUsers.begin(); current != memoryUsers.end(); current++) { memoryUsers.erase(current); } } /** * Returns the singleton memory usage observer instance. * * \return memory usage observer instance */ MemoryUsageObserver* MemoryUsageObserver::getInstance() { if (instance == NULL) { instance = new MemoryUsageObserver; } return instance; } /** * Purges the current memory usage observer instance. */ void MemoryUsageObserver::purgeInstance() { if (instance != NULL) { delete instance; } instance = NULL; } /** * Adds memory. * * \param pointer to the allocated piece of memory * \param size of the allocated memory */ void MemoryUsageObserver::addMemory(void* pointer, size_t size) { memoryUsers[pointer] = size; } /** * Removes tracked memory. Prints a warning if untracked memory is to be released. * * \param pointer to the allocated piece of memory */ void MemoryUsageObserver::removeMemory(void* pointer) { map::iterator current = memoryUsers.find(pointer); if (current == memoryUsers.end()) { cout << "WARNING: There is non-tracked memory to be freed. Pointer " << pointer << " is not registered by MemoryUsageObserver." << endl; return; } memoryUsers.erase(current); } /** * Gets the size of currently allocated memory. */ size_t MemoryUsageObserver::getUsedMemorySize() { size_t totalSize = 0; for (map::iterator current = memoryUsers.begin(); current != memoryUsers.end(); current++) { totalSize += current->second; } return totalSize; }